并发控制(二)

信号量

信号量是一个特殊变量,里面有一个整型量。可以初始化一个唯一的非负整数,带有原语操作,用来解决临界区问题以及实现进程在多处理器环境下的进程同步。
信号量标志原语:wait信号量,signal信号量,不可中断的
设置信号阻塞队列
一种信号量表示一种资源,信号量的值表示可用资源的个数。

信号量类型

计数型(两个域,一个为整型,一个域为队列,其元素为等待该信号量的阻塞进程)
互斥信号量
用于申请或释放资源的使用权,常初始化为1
资源信号量
用于申请或归还资源,常初始化为大于1的正整数,表示资源可用个数
s.count>=o:表示还可执行wait(s)而不会阻塞的进程数
s.count

wait 操作用于申请资源(使用权),可能会阻塞
signal操作释放资源,有责任唤醒阻塞进程

当仅有两个进程并发共享临界资源时,互斥信号量仅能取值0.1.-1
其中:
s.count=1时:有一个临界资源可用,一个进程可进入临界区
s.count=0时:临界资源已分配,一个进程已进入临界区
s.count=-1时:已有一个进程等待进入临界区

当s来实现N个进程的互斥时,s.count的取值范围为1~ -(n-1)

wait 与signal操作

typedef struct 
{
    int value;
    struct process_control_block *list;
}semaphore;
wait(semaphore *S){
    S->value--;
    if (S->value<0) block(S->list);
}
signal(semaphore *S){
    S->value++;
    if (S->value<=0) wakeup(S->list);
}

当S->value初始值 >0 时,每进行一个单位的该类资源,
使得系统中可供分配的该类资源减少一个,描述为S->value–
反之:当S->value<0时,block(S->list)进行了自我阻塞,
放弃处理机并插入到了信号链表中;
备注:
s的初值为1,取指为1~-(n-1)。
s=1时:有一个临界资源可用,一个进程可进入临界区。
s=0时:临界资源已分配,一个进程已进入临界区。
s<0时:临界区已被占用,|s|个阻塞进程正在等待进入。

回顾

临界资源:一次仅允许一个进程独自占有使用的不可剥夺资源。
临界区:进程访问临界资源的那一段代码。
互斥:当一个进程正在临界区中访问临界资源时,其他进程不能进入临界区。
死锁:多个进程全部阻塞,形成等待资源的循环链。
饥饿:一个就绪进程被调度程序长期忽视、不被调度执行。

你可能感兴趣的:(并发控制(二))