牌而等待在while语句中。由于两个进程都不会放下自己的标志牌,因此都无法进入临界区,不能满足“有限等待”的条件。所以,上述程序是错误的。
设置信号量S实现对共享变量count的互斥访问。
Share:count=0; struct semaphore S=1; cobegin
Process P0:
do { P(S);
count=count+1; V(S);
}while(1);
Process P1: do {
P(S);
count=count+1; V(S);
9. 假定一个阅览室最多可容纳100人,读者进入和离开阅览室时都必须在阅览室门口的一个登记表上进行登记,而且每次只允许一人进行登记操作。用信号量实现该过程。 解:设置信号量S:控制进入阅览室的人数。初值=100。 设置信号量mutex:控制登记表的互斥使用。初值=1。 struct semaphore s=100,mutex=1;
6
}while(1);
coend
cobegin
reader (i ) (i=1,2,?,k)
{
P(S); P(mutex); 写登记表; V(mutex); 阅读;
P(mutex);
写登记表; V(mutex);
V(S); 离开;
}
coend
10. 在具有N个进程的系统中,允许M个进程(N≥M≥1)同时进入它们的共享区,其信号量S的值的变化范围是(1) ,处于等待状态的进程数最多是(2)个。
解:信号量S用于控制进入共享区的进程数,初值为M。极端情况是N个进程都需要进入共享区。 (1)(M-N,M); (2)N-M
11. 在测量控制系统中,数据采集任务把所采集的数据送一单缓冲区;计算任务从该缓冲区中取出数据进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步操作算法。 解:设置信号量S1和S2控制数据采集任务与计算任务之间的同步。 初值:S1=1,S2=0。
7
struct semaphore S1=1, S2=0; cobegin
数据采集任务: 计算任务: begin
end
begin
While(true){
采集数据; P(S1);
While(true){
P(S2);
从缓冲区读出数据;
数据写入缓冲区; V(S2);
V(S1); }
计算;
} end coend
12. 有n+1个进程A1,A2,?,An和B,A1,?,An通过同一缓冲区各自不断向B发消息,B不断取消息,它必须取走发来的每一个消息。刚开始时缓冲区为空,试用P、V操作正确实现之。 解:设置信号量S1和S2控制进程Ai与进程B之间的同步。初值:S1=1,S2=0。 设置信号量S控制进程Ai之间互斥地使用缓冲区。初值:S=1。 struct semaphore S1=1, S2=0, S=1; cobegin
进程Ai(i=1,2,···,n): begin
进程B: begin
While(true){
P(S2);
从缓冲区读出消息;
While(true){
P(S1); P(S);
8
} end
消息写入缓冲区; V(S); V(S2);
V(S1); }
end
coend
13. 桌子上有一只盘子,每次只能放入或取出一个水果。现有许多苹果和橘子。一家四口人各行其职。爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,儿子专等吃盘子中的橘子,女儿专等吃盘子中的苹果。请用PV操作来实现四人之间的同步算法。
解:设置信号量empty表示盘子的状态。初值:empty =1。
设置信号量apple表示盘子中的苹果。初值:apple =0。 设置信号量orange表示盘子中的橘子。初值:orange =0。 struct semaphore empty =1, apple =0, orange =0; Parbegin 爸爸: begin
L1: P(empty);
放苹果; V(apple); Goto L1; End;
妈妈:begin
L2: P(empty);
放橘子; V(orange);
9
Goto L2; End;
女儿:begin
L3: P(apple);
取苹果; V(empty); Goto L3; End;
儿子:begin
L4: P(orange);
取橘子; V(empty); Goto L4; End;
Parend
14. 下面是两个并发执行的进程。它们能正确运行吗?若不能请举例说明,并改正之。 Parbegin
Var x:integer;
Process P1 Var y,z:integer; Begin x:=1; ① y:=0; ③
Process P2
Var t,u:mteger; Begin x:=0; ②
t:=0; ⑥
10