操作系统
图6-2 GET、COPY和PUT三者间的工作关系
于是,GET、COPY和PUT三者间有4个同步问题:在GET的标号为3的地方是一个同步点;在COPY的标号为1和5的地方是两个同步点;在PUT的标号为1的地方是一个同步点。因此,共要设置4个同步信号量:
S1——控制COPY与GET取得同步,初值=0;
S2——控制GET与COPY取得同步,初值=0; S3——控制PUT与COPY取得同步,初值=0; S4——控制COPY与PUT取得同步,初值=0。
图6-3表述了用信号量及P、V操作来正确处理GET、COPY和PUT三者之间的协同工作关系。
操作系统
图6-3 用P、V操作保证GET、COPY和PUT三者的正确协作
3.在图6-4(a)(即教材中图6-8)GET里,是先安放V(S1),再安放P(S2)的。能把它们两个的安放顺序颠倒过来变成图6-4(b)吗?为什么?
(a) (b)
图6-4 安放V(S1)和P(S2)的两种方法
答:图6-4(b)里是先安放P(S2), 再安放V(S1)。这种安放顺序是不行的。因为安放P(S2),表示要在此等待COPY发来的消息(即希望COPY执行V(S2)操作),在接到了COPY的消息后,才执行V(S1)(即向COPY发消息)。但是,根据COPY的安排,不接到GET发来的消息(即执行P(S1)操作),是不会向COPY发消息的(即执行V(S2)操作)。于是,GET和COPY就陷入了循环等待:GET等待COPY发消息,COPY等待GET发消息。产生两个死锁了。
4.进程A和B共享一个变量,因此在各自的程序里都有自己的临界区。现在进程A在临界区里。试问进程A的执行能够被别的进程打断吗?能够被进程B打断吗(这里,“打断”的含义是调度新进程运行,使进程A暂停执行)?
答:当进程A在自己的临界区里执行时,能够被别的进程打断,没有任何的限制。当进程A在自己的临界区里执行时,也能够被进程B打断,不过这种打断是有限制的。即当进程B执行到要求进入自己的临界区时,就会被阻塞。这是因为在它打断进程A时,A正在临界区里还没有出来,既然A在临界区,B当然就无法进入自己的临界区。
5.信号量上的P、V操作只是对信号量的值进行加1或减1操作吗?在信号量上还能够执行除P、V操作外的其他操作吗?
答:根据信号量的定义可知,P、V操作并非只是对信号量进行减1或加1操作,更重要的是在减1或加1后,还要判断运算的结果。对于P操作,判定后调用进程自己有可能继续运行,也可能阻塞等待。对于V操作,判定后调用进程自己最后总是继续运行,但之前可能会唤醒在信号量队列上等待的进程。
在信号量上除了能执行P、V操作外,不能执行其他任何操作。
6.系统有输入机和打印机各一台,均采用P-V操作来实现分配和释放。现在有两个进程都要使用它们。这会发生死锁吗?试说明理由。
答:采用信号量上的P、V操作,只能正确地完成对设备的申请与释放,但不能控制进程对设备的申请、释放顺序。因此,当进程申请和释放设备的顺序不当时,仍会发生死锁。例如,进程A使用输入机和打印机的顺序是:
请求打印机(Ar1)→请求输入机(Ar2)→释放打印机(Ar3)→释放输入机(Ar4)