S1() {
?
v(b2); v(b3); } S2() {
p(b2);
?
v(b4); //v(b42) } S3() {
p(b3);
?
v(b4); //v(b43) } S4()
{//因为在S2及S3完成时均对b4做了v操作,因此这里要用两个p操作 p(b4);//p(b42) p(b4);//p(b43)
? }
5. 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
解:设置3个信号量S、SO、SA,信号量S表示盘子是否为空,其初值为1;信号量SO表示盘中是否有桔子,其初值为0;信号量SA表示盘中是否有苹果,其初值为0。 同步描述: int S=1; int SA=0; int SO=0; main() {
cobegin
father(); son();
daughter(); coend }
第 26 页 共 33 页
father() {
while(1)
{
p(S);//盘子是否空 将水果放入盘中;
if(放入的是桔子)v(SO);//变形
else v(Sa) //很少有学生如此做!而这却是本题的关键 } } son() {
while(1)
{
p(SO);//盘子中有无桔子 从盘中取出桔子; v(S); 吃桔子; } }
daughter() {
while(1)
{
p(SA);//盘子中有无苹果 从盘中取出苹果; v(S); 吃苹果; } }
6. 在单处理机的分时系统中,分配给进程P的时间片用完后,系统进行切换,结果调度到的仍然是进程P。有可能出现上述情形吗?如果可能请说明理由。
解:有可能出现上述情况。例如,若在进程P时间片用完后,被迫回到就绪队列时,就绪队列为空,这样进程P就是就绪队列中唯一的一个进程,于是调度程序选中的进程必然是进程P;又如在按优先级调度的系统中,就绪队列按进程优先级排列,在进程P时间片用完之后回到就绪队列时,若其优先级高于当前队列中的其他进程,则它将排在就绪队列之首,从而再次被调度程序选中并投入运行。
第 27 页 共 33 页
7. 哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论问题;在讨论的间隙4位哲学家进餐,每人进餐时都需使用刀、叉各一把,餐桌上的布置如图。请用信号量及P、V操作说明这4位哲学家的同步、互斥过程。 解:在本题中,应设置4个信号量fork1、fork2、knife1、knife2,其初值均为1,分别表示资源叉1、叉2、刀1、刀2是否可用。同步描述如下: int fork1=1; int fork2=1; int knife1=1; int knife2=1; main() {
cobegin Pa(); Pb(); Pc(); Pd(); Coend } Pa() {
while(1) {
p(knife1); p(fork1); 进餐; v(knife1); v(fork1); 讨论问题; } } Pb() {
while(1) {
p(knife2); p(fork1); 进餐; v(knife2); v(fork1); 讨论问题; } } Pc() {
第 28 页 共 33 页
while(1) {
p(knife2); p(fork2); 进餐; v(knife2); v(fork2); 讨论问题; } } Pd() {
while(1) {
p(knife1); p(fork2); 进餐; v(knife1); v(fork2); 讨论问题; } }
8. 请用信号量实现对某数据库的读者-写者互斥。 要求:(1)读者与写者之间互斥,写者与写者之间互斥。 (2)读者之间不互斥。
解:本题是读者-写者问题。在本题中,允许读进程同时读数据库,但写进程正在写数据库时不允许其他进程读该数据库,也不允许其他进程写该数据库。为了解决读、写进程之间的同步,应该设置2个信号量和一个共享变量:读互斥信号量rmutex,用于使读进程互斥地访问共享变量count,其初值为1;写互斥信号量wmutex,用于实现写进程与读进程的互斥及写进程与写进程的互斥,其初值为1;共享变量count,用于记录当前正在读数据库的读进程数目,初值为0。其工作过程描述如下: Semaphore rmutex=1; Semaphore wmutex=1; Int count=0; Main() {
Cobegin
Reader(); Writer(); Coend }
Reader()
第 29 页 共 33 页
{
While(true) {
P(rmutex);
If(count==0) p(wmutex); Count ++; V(rmutex); 读数据库; P(rmutex); Count --;
If (count==0) v(wmutex); V(rmutex); } }
Writer() {
While(true) {
P(wmutex); 写数据库;
V(wmutex); } }
注意:正确理解信号量rmutex的意义是理解读者-写者问题的关键。Rmutex是一个互斥信号量,用于使读进程互斥地访问共享变量count。信号量rmutex并不表示读进程的数目,表示读进程数目的是共享变量count。当一个读进程要读数据库时,应将读进程计数count增加1;如果此前(count加1以前)数据库中无读进程,还应对写互斥信号量wmutex做p操作,这样,若数据库中无写进程则通过p操作阻止后续写进程写,若数据库中有写进程,则通过p操作让读进程等待。同理,当一个读进程完成读数据库操作时,应将读进程计数count减少1;如果此时(count减1以后)数据库中已无读进程,还应对写互斥信号量wmutex做v操作,以允许写进程写。
9. 就绪队列中有10个进程,系统将时间片设为200ms,CPU进行进程切换要花费10ms,试问系统开销所占的比率约为多少?
解:因就绪队列中有10个进程,它们以时间片轮转的方式使用CPU,时间片长度为200ms。当一个时间片用完时,调度进程将当前运行进程设置为就绪状态并放入就绪队列尾,再从就绪队列首选择进程投入运行,这一过程(进程切换)要花费时间10ms。因此系统开销所占比率为:10/(200+10)=4.8%
10. 在单CPU和两台输入/输出设备(I1,I2)的多道程序设计环境下,同时投入三个作业Job1、Job2、Job3运行。这三个作业对CPU和输入/输出设备的使用顺序和时间如下所示:
Job1:I2(30ms);CPU(10ms);I1(30ms);CPU(10ms);I2(20ms)
第 30 页 共 33 页