1. 生产者—消费者问题
(1)两个生产者同时的情况
假设的时间片轮转顺序如下
produce;
produce;
wait(e);
wait(m);
buffer(in):=nexp;
wait(e);
wait(m);
buffer(in):=nexp;
in:=(in+1)mod n;
signal(m);
signal(f);
in:=(in+1)mod n;
signal(m);
signal(f);
2)生产者等待消费者情况
假设的时间片轮转顺序如下
produce;
wait(e);
wait(m);
buffer(in):=nexp;
wait(f);
wait(m);
nextc:=buffer(out);
in:=(in+1)mod n;
signal(m);
signal(f);
out:=(out+1) mod n;
signal(m);
signal(e);
consume;
2. 哲学家进餐问题
五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。
1)记录型信号量解决哲学家进餐问题
筷子是临界资源,在一段时间内只允许一个哲学家使用。为实现对筷子的互斥使用,用一个信号量表示一只筷子,五个信号量构成信号量数组。
Var chopstick: array [0, …, 4] of semaphore;
所有信号量均被初始化为1。
第i 位哲学家的活动可描述为:
repeat
wait(chopstick[ i ]);
wait(chopstick[ ( i +1) mod 5] );
…
eat;
…
signal(chopstick[ i ]);
signal(chopstick[ ( i +1) mod 5] );
…
think;
until false;
3. 读者——写者问题
一个数据文件被多个进程共享。Reader进程只要求读文件,Writer进程要求写入内容。
合理的同步关系是:
多个读进程可同时读;
Writer进程与任何其他进程(包括Reader进程或其他Writer进程)不允许同时访问文件。
reader :
repeat
Swait(L, 1, 1);
Swait(mx, 1, 0);
…
读操作;
…
Ssignal(L, 1);
until false;
writer :
repeat
Swait(mx, 1, 1; L,RN,0);
写操作;
Ssignal(mx, 1);
until false;