1.
引入3个信号量和一个控制变量:
1)控制变量waiting用来记录等候理发的顾客数,初值均为0;
2)信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;
3)信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为0(刚开始时理发师在睡觉,所以理发师这个资源数目为0);
4)信号量mutex用于互斥,初值为1.
关于p,v操作:
P操作可以看做是申请一个资源,不管这个资源有没有都将这个资源的数目减1,如果现在资源数目小于0,就阻塞。
v操作就是释放资源,先将这个资源的数目加1,如果发现这个资源数目小于等于0,就会唤醒在阻塞队列上的一个进程。
先做一些初始化工作:
cpp] view plain copy
print?
var waiting : integer; /*等候理发的顾客数*/
CHAIRS:integer; /*为顾客准备的椅子数*/
customers, barbers,mutex : semaphore;
customers := 0; barbers := 0; waiting := 0; mutex := 1;
理发师进程:
[cpp] view plain copy
print?
Procedure barber;
begin while(TRUE); /*理完一人,还有顾客吗?*/
P(cutomers); /*若无顾客,理发师睡眠*/
P(mutex); /*进程互斥*/
waiting := waiting – 1; /*等候顾客数少一个*/
V(barbers); /*理发师去为一个顾客理发,如果babaers等于0,则顾客都会阻塞*/
/*刚开始时babers = 0,表示理发师这个资源为0,所以顾客进程执行至
P(barbers)时也无法让理发师为其理发,现在理发师醒了,表示理发店里拥有
理发师这个资源了,所以执行V(barbers)这个操作,将资源数加1,此时会唤醒
一个在队列上阻塞的顾客*/
V(mutex); /*开放临界区*/
cut-hair( ); /*正在理发*/
end;
顾客进程:
[cpp] view plain copy
print?
procedure custo
操作系统实验三 来自淘豆网m.daumloan.com转载请标明出处.