记录型信号量:
typedef struct{
int value;
struct process_control_block *list;//阻塞队列
}semaphore;
wait(semaphore *S){
S->value--;//申请资源
if(S->value<0)//表示该类资源已分配完毕,应调用block原语进行自我阻塞
block(S->list);
}
signal(semaphore *S){
S->value++;//释放资源
if(S->value<=0) //表表示该信号量链表中仍有等待的进程被阻塞,应调用wakeup原语。
wakeup(S->list);
}
S->value的初值表示系统中某类资源的数目, 可称为资源信号量。
注:
- S>0时:表示可供并发进程使用的资源数。
- S<=0时:|S|表示因缺少该资源而自我阻塞的进程数。
利用记录型信号量实现前驱关系:
例1:已知A,B的值,表示(A²+3B)/(B+5A)求值过程的前趋图。
解:
已知A,B,那么A²,3B,5A进程可以随时开始:
设 s1=A², s2=3B, s3=5A,
s4=A²+3B, s5=B+5A, s6=(A²+3B)/(B+5A)
设1,2,3,4,5,6号位置分别对应a,b,c,d,e,f,信号量。
semaphore a,b,c,d,e,f;
a.value=b.value=c.value=c.value=e.value=f.value=0
p1:{ s1, v(a) }
p2:{ s2, v(b) }
p3:{ s3, v(c) }
p4:{ p(a),p(b),s4,v(d) }
p5:{ p(c),s5,v(e) }
p6:{ p(d),p(e), s6 }
前驱图:
例2:
快餐厅有4类职员:
(1)服务员:接受顾客点菜;
(2)厨师:准备顾客的饭菜;
(3)打包员:将做好的饭菜打包:
(4)出纳员:收款并提交食品。
每个职员可被看作一个进程,试用一同步机制写出能让四类职员正确并发运行的程序。