进程同步习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
补充题1:有三个进程p1、p2、p3协作解决文件打印问题:系统有两个环形缓冲池,每个缓冲池有n个缓冲区;p1每次将1条记录从磁盘读入缓冲池1,p2每次将1条记录从缓冲池1复制到缓冲池2,p3每次从缓冲池2取出1条记录打印输出。
请用信号量机制实现这三个进程的同步。
信号量提示:full1、empty1、mutex1、in1、out1;full2、empty2、mutex2、in2、out2。
答:方法1,记录型信号量机制:
var mutex1、mutex2、empty1、empty2、full1、full2:semaphore:=1,1,n,n,0,0;
buffer1:array[0,…,n-1] of item;
buffer2:array[0,…,n-1] of item;
int1,out1,int2,out2:integer:=0,0,0,0;
p1进程:
begin
repeat
……
从磁盘读入一条记录到nextp;
……
Wait(empty1);
Wait(mutex1);
Buffer1(int1):=nextp;
In1: =(int1+1) mod n;
Signal(mutex1);
Signal(full1);
Until false;
End
P2进程:
Begin
Repeat
Wait(full1);
Wait(mutex1);
Nextc:=buffer1(out1);
Out1:=(out1+1) mod n;
Signal(mutex1);
Signal(empty1);
从buffer1取出1条记录;
Until false;
……
repeat
……
Wait(empty2);
Wait(mutex2);
Buffer2(int2):=nextp;
In2: =(int2+1) mod n;
Signal(mutex2);
Signal(full2);
把记录放入buffer2中;
Until false;
End
P3进程:
Begin
Repeat
Wait(full2);
Wait(mutex2);
Nextc:=buffer2(out2);
Out2:=(out2+1) mod n;
Signal(mutex2);
Signal(empty2);
从buffer2取出1条记录打印;
Until false;
End
方法2,AND型信号量机制
var mutex1、mutex2、empty1、empty2、full1、full2:semaphore:=1,1,n,n,0,0;buffer1:array[0,…,n-1] of item;
buffer2:array[0,…,n-1] of item;
int1,out1,int2,out1,out2,:integer:=0,0,0,0;
p1进程:
begin
repeat
……
从磁盘读入一条记录到nextp;
……
SWait(empty1,mutex1);
Buffer1(int1):=nextp;
In1: =(int1+1) mod n;
SSignal(mutex1,full1);
Until false;
End
P2进程:
Begin
Repeat
SWait(full1,mutex1);
Nextc:=buffer1(out1);
Out1:=(out1+1) mod n;
SSignal(mutex1,empty1);
从buffer1取出1条记录;
Until false;
……
……
SWait(empty2,mutex2);
Buffer2(int2):=nextp;
In2: =(int2+1) mod n;
SSignal(mutex2 ,full2);
把记录放入buffer2中;
Until false;
End
P3进程:
Begin
Repeat
SWait(full2,mutex2);
Nextc:=buffer2(out2);
Out2:=(out2+1) mod n;
SSignal(mutex2,empty2);
从buffer2取出1条记录打印;
Until false;
End
补充题2:上题中如果两个缓冲池都是单缓冲区,则如何简化各进程的描述?提示:单缓冲区,故上题中的mutex、in、out均不需要。
答:记录型信号量机制:
var empty1、empty2、full1、full2:semaphore:=1,1,n,n,0,0;
p1进程:
begin
repeat
……
从磁盘读入一条记录;
……
Wait(empty1);
Put record to buffer1;
Signal(full1);
Until false;
End
P2进程:
Begin
Repeat
Wait(full1);
从buffer1取出1条记录;
Signal(empty1);
Until false;
repeat
……
Wait(empty2);
把记录放入buffer2中;
Signal(full2);
Until false;
End
P3进程:
Begin
Repeat
Wait(full2);
从buffer2取出1条记录;
Signal(empty2);
打印记录;
Until false;
End。