设进程P、Q共享一台打印机,打印机任一时刻只能被一个进程所使用,而不能同时使用。P、Q进程程序如下:
begin
busy:boolean;
busy:=false;
cobegin
processP
begin
L:ifbusythengotoL
busy:=true;
进程P使用打印机;
busy:=false;
gotoL:
end:
processQ
N:ifbusythengotoN
busy:=true;
进程Q使用打印机;
busy:=false;
gotoN;
end;
coend;
end.
(1)上面的并发程序段能保证同一时刻只有一个进程使用打印机吗?为什么?
(2)上面程序不利于充分发挥处理器的效率,为什么?
(3)试用一同步机制重新编写上述程序,使之既能发挥处理器的效率,又能保证两个进程不同时使用打印机。
(1)不能保证同一时刻只有一个进程使用打印机。因为当进程P检测到打印机不忙后,刚准备执行busy:=true语句时,如果出现中断(如时间片到)而让Q进程执行,此时busy的值是FALSE,进程Q就能使用打印机,而在此过程中Q也可能被中断, 而使得P可以从刚才的断点处继续执行,进程P执行busy:=true,也使用打印机,这样,两个进程就会同时使用了打印机。
(2)因为进程P和Q测试打印机忙时仍然不停地循环测试,占用CPU,因而降低了处理器的效率,用来作忙等待,当测试打印机忙时,该进程应当处于等待状态,让出处理器。
(3)利用PV操作可以保证两个进程不同时使用打印机,又能充分发挥处理器的效率:
begin
S:semaphore;
S:=1;
cobegin
process P process Q
begin begin
L1:P(s); L2:P(s);
进程P使用打印机; 进程Q使用打印机;
V(s); V(s);
goto L1; goto L2;
end; end;
coend;
end.