4有三个并发进程,R负责从输入设备读入信息并传送给M,M将信息加工并传送给P,P将打印输出,写出下列条件下的并发程序:
单缓冲区,
缓冲区信号量初值mutex1=1; mutex2=1;
buffeR-M // R 和M之间的buf
bufferM_P // M 和P之间的buf
另外R 自己的缓存区data_buf1,
另外M 自己的缓存区data_buf2,
另外P 自己的缓存区data_buf3,
Procedure R:
begin
while true do
data_buf1 = 读入数据
P(mutex1);
buffeR-M = data_buf1;
V(mutex1);
end
end;
Procedure M:
begin
while true do
P(mutex2);
P(mutex1);
Data_buf2 = bufferR_M;
处理Data_buf2;
BufferM_P = data_buf2
V(mutex1);
V(mutex2);
end
end;
Procedure P:
begin
while true do
P(mutex2);
Data_buf3:= BufferM_P;
V(mutex2);
V(empty);
打印输出数据
end
end;
双缓冲区,
缓冲区信号量初值mutex1=1; mutex2=1; Empty1 = 2, full1 = 0; empty2=2, full2=0; buffeR-M[2] // R 和M之间的buf,有两个bufferM_P[2] // M 和P之间的buf 有两个另外R 自己有缓存区data_buf1,
另外M 自己有缓存区data_buf2,
另外P 自己有缓存区data_buf3,
var:i,j,k,n
Procedure R:
begin
while true do
data_buf1 = 读入数据
P(empty1)
P(mutex1);
buffeR-M[i] = data_buf1;
i=(i+1)mod 2;
V(mutex1);
V(full1)
end
end;
Procedure M:
begin
while true do
P(full1);
P(mutex1);
Data_buf2 = bufferR_M[j];
j=(j+1) mod 2
V(mutex1);
P(empty1);
处理Data_buf2;
P(empty2);
P(mutex2)
BufferM_P[k] = data_buf2;
k=(k+1) mod 2
V(mutex2);
V(full2);
end
end;
Procedure P:
begin
while true do
P(full2);
P(mutex2);
Data_buf3:= BufferM_P[n];
n=(n+1) mod 2
V(mutex2);
V(empty2);
打印输出数据
end
end;
设有三个进程A、B、C,其中A与B构成一对生产者与消费者(A为生产者,B为消费者),共享一个由n个缓冲块组成的缓冲池;B与C也构成一对生产者与消费者(此时B为生产者,C为消费者),共享另一个由m个缓冲块组成的缓冲池。
用PV操作描述它们之间的同步关系。
var mutex1,empty1,full1,mutex2,empty2,full2:psemaphore;//两个缓冲池编号1,2
//初值empty1=n,full1=0,empty2=m,full2=0 var i1,j1, goods1,j2,j2, goods2:integer;
buffer1: array[0…n-1] of item;
buffer2: array[0…m-1] of item;
procedure A;
begin
while true do
begin
produce next product;
P(empty1);
P(mutex1);
buffer1(i1):=product;
i1:=(i1+1)mod(n);
V(mutex1);
V(full1);
end
end;
procedure B;
begin
while true do
P(full1);
P(mutex1);
goods1:=buffer1(j1);
j1:=(j1)mod(n);
V(mutex1);
V(empty1);
处理goods1;
P(empty2);
P(mutex2);
buffer2(i2):=product;
i2:=(i2+1)mod(m);
V(mutex2);
V(full2);
end
end;
procedure C;
begin
while true do
P(full2);
P(mutex2);
goods2:=buffer2(j2);
j2:=(j2+1)mod(m);
V(mutex2);
V(empty2);
end
end;
思考.用P.V操作解决司机与售票员的问题初值: Door=0; Stop=0;
司机进程:
while(true){
P(Door);
启动车辆
正常驾驶
到站停车
V(Stop);
}
售票员进程:
While(true){
关门
V(Door);
售票
P(Stop);
开门
}。