1第2章习题答案2-9.(1)x=3运行顺序为Px,P3,P5,P6,P9T=(x+(x+3)+(x+3+5)+(x+3+5+6)+(x+3+5+6+9))/5=x+9.6(2)3x=5运行顺序为P3,Px,P5,P6,P9T=(3+(3+x)+(3+x+5)+(3+x+5+6)+(3+x+5+6+9))/5=0.8x+10.2(3)5x=6T=0.6x+11.2(4)6x=9T=0.4x+12.4(5)9xT=0.2x+14.22-12.计算采用FCFS、SJN、RHN的平均周转时间和平均带权周转时间:2.05/3.3071.65/1.8751.875/2.81251)FCFS作业运行顺序:1,2,3,4各作业的周转时间Ti和平均周转时间T:T1=10.0-8.00=2.0T2=11.2-9.00=2.2T3=11.7-9.5=2.2T4=12.0-10.2=1.8T=(T1+T2+T3+T4)/4=(2.0+2.2+2.2+1.8)/4=8.2/4=2.05各个作业的平均带权周转时间W计算如下:W=(2/2+2.2/1.2+2.2/0.5+1.8/0.3)=(1+1.83+4.4+6)/4=3.3072)SJN作业运行顺序:1,3,4,2T1=10.0-8.00=2.0T2=12-9.00=3T3=10.5-9.5=1.0T4=10.8-10.2=0.6T=(T1+T2+T3+T4)/4=(2.0+3.0+1.0+0.6)/4=6.6/4=1.65各个作业的平均带权周转时间W计算如下:W=(2/2+3/1.2+1/0.5+0.6/0.3)/4=1.8753)HRN作业运行顺序:1,3,2,4作业号提交时刻估计运行开始运行时刻完成时刻时间FCFSSJNRHNFCFSSJNRHN18.002.08.08.08.010.010.010.029.001.210.010.810.511.212.011.739.500.511.210.010.011.710.510.5410.200.311.710.511.712.010.812.02先选择作业1从8.00-------10.00。当作业1完成时,究竟选谁运行,只有通过计算,选择响应比高者运行:作业2的响应比=((10-9.0)+1.2)/1.2=1.83作业3的响应比=((10-9.5)+0.5)/0.5=2.0作业4还未到,只能选作业3运行。作业3运行到10.5结束,再计算剩余的作业2和4:作业2的响应比=((10.5-9.0)+1.2)/1.2=2.25作业4的响应比=((10.5-10.2)+0.3)/0.3=2选作业2运行。作业2到11.7完成。最后运行作业4。运行到12.0,全部结束。各个作业的周转时间计算如下:t1=2t2=11.7-9=2.7t3=10.5-9.5=1t4=12-10.2=1.8各个作业的平均周转时间计算如下:T==(2+2.7+1+1.8)/4=1.875各个作业的平均带权周转时间计算如下:W=(2/2+2.7/1.2+1/0.5+1.8/0.3)/4=2.81252-13.已知作业A,B,C,D,E需要的运行时间分别为10,6,2,4,8分钟,优先级分别为3,5,2,1,4。(1)轮转法(假定时间片=2分钟)作业完成的顺序为C,D,B,E,A开始作业轮转一周需10分钟,作业C的周转时间:Tc=10分钟(6分)C完成后,剩下四个作业,轮转一周需8分钟,作业D的周转时间:Td=10+8×(4-2)/2=18分钟(16分)D完成后,剩下三个作业,轮转一周需6分钟,作业B的周转时间:Tb=18+6×(6-2-2)/2=24分钟(22分)B完成后,剩下两个作业,轮转一周需4分钟,作业E的周转时间:Te=24+4=28分钟(28分)E完成后,只剩下作业A,作业A的周转时间:Ta=28+2=30分钟(30分)平均周转时间:T=(10+18+24+28+30)/5=22分(20.4分)(2)优先级调度法作业完成顺序为:B,E,A,C,DTb=6分,Te=6+8=14分,Ta=14+10=24分,Tc=24+2=26分,Td=26+4=30分。平均周转时间:T=(6+14+24+26+30)/5=20分3第3章习题答案3-7.系统中有n+1个进程。其中A1、A2、…、An分别通过缓冲区向进程B发送消息。相互之间的制约关系为:发送进程A1、A2、…、An要互斥地向BUF中送消息,当接收进程B还未将消息接收完之前,任何一个发送不能再送。同样,B不能重复接收同一个消息。为此,应设置两个信号量s1和s2。设系统只有容纳一个消息的缓冲区,用信号量s1表示,其初值为1,它用来制约发送进程。信号量s2用来制约接收进程,其初值为0。现可用PV操作描述如下:进程A1、…、An执行的过程为:进程B执行的过程为:beginbegin准备消息P(S2)P(s1)从缓冲区BUF取消息将消息送入BUFV(s1)V(s2)消耗消息endend若缓冲区容量为m个,这个问题就变为生产者和消费者问题。3-8.首先这里的IN和OUT分别表示读写指针,而不是信号量。在系统初启时,环行缓冲区为空,此时IN和OUT都初始化为0。当并发进程通过环行缓冲区通信时,写进程不断地写,读进程不断地读,使得读写指针不断变化。写进程的速度太快,缓冲区会满;读进程的速度太快,缓冲区会空。已知循环缓冲区的容量为100。则当(IN+1)%100=OUT时,说明缓冲区已满。当IN=OUT时,说明缓冲区已空。BUFA1A2AnB4初始化时,IN=OUT=0。一段时间以后:OUTIN3-9.为描述阅览室,用一个登记表来记录使用情况。表中共有100项。每当有读者进入阅览室时,为了正确地登记,各读者应互斥使用。为此设两个信号量。mutex:互斥信号量,用来制约各读者互斥地进行登记,其初值为1;empty同步信号量,用来制约各读者能同时进入阅览室的数量,初值为100。下面用两个过程描述对表格应执行的动作:登记过程:擦除过程:beginbeginp(empty)p(mutex)p(mutex)找到自己的登记项擦除找到一个登记项登记v(mutex)v(mutex)v(empty)endend为了正确地描述读者的动作,我们可以将读者看成进程。若干读者希望进入阅览室时,调用登记过程,退出阅览室时,调用擦除过程。可见一个程序可对应多个读者。可设的进程数由读者数决定。其动作如下:begin调用登记过程进入阅览室阅读准备退出调用擦除过程end3-12.有4个同类资源,3个进程,每个进程的最大申请为2,系统不会发生死锁。最不利原则:3个进程都各自获得了一个资源,都还需申请第二个资源。此时,因系统还有一个剩余资源,所以能满足任一个进程的剩余需求。3-13.有6个磁带机和n个进程。每个进程的最大申请为2,问n取什么值时,系统不会死锁?答:为了使系统不发生死锁,应该满足:n=6-1=5B1B2B3B453-14.证明:假定会死锁,则根据死锁定义,N个进程之间相互等待,至少需要N个单位资源,又系统M个资源已分完,故所有进程需求总和大于或等于M+N,这与题中的所有进程需求总和小于M+N矛盾,故假设不成立。因此,在这种情况下不会死锁。3-15.M1:……V(s12);V(s13);V(s14);M2:P(s12);……V(s26);……M3:P(s13);……V(s36);V(s38);M4:P(s14);……V(s47);……附加:m个同类资源,n个进程,每个进程的对资源的最大需求量:当mn时,每个进程最多可以请求nm个该类资源当m=n时,每个进程最多可以请求1个该类资源当mn时,每个进程最多可以请求1个该类资源(当mn时,每个进程最多可以请求(m+n-1)/n个该类资源)3-15解答:这是进程之间的同步问题。M2、M3和M4必须在接收到M1的消息后才能运行。同理,M6必须在M2和M3之后运行,M7必须在M4,M5之后运行,M8必须在M3、M7之后运行。如何保证呢?需设置相应的信号量来保证:S12,S13,S14,用来制约M2、M3和M4的运行;S26,S36,用来制约M6的运行;S47,S57,用来制约M7的运行;S38,6S78用来制约M8的运行。各进程的制约关系描述如下。S12,S13,S14,S26,S36,S47,S57,S38,S78:semaphore;S12:=0;S13:=0;S14:=0;S26:=0;S36:=0;S47:=0;S57:=0;S38:=0;S78:=0;COBEGINPROCESSM1:PROCESSM2:BEGINBEGINV(S12);P(S12);V(S13);V(S26);V(S14);ENDENDPROCESSM3:PROCESSM4:BEGINBEGINP(S13);P(S14);V(S36);V(S47);V(S38);ENDENDPROCESSM5:PROCESSM6:BEGINBEGINV(S57);P(S26);ENDP(S36);ENDPROCESSM7:PROCESSM8BEGINBEGINP(S47);P(S38);P(S57);P(S78);V(S78);ENDENDCOEND3-16.叉子是临界资源,在一段时间内只允许一个哲学家使用。一个信号量表示一把叉子,五个信号量构成信号量数组,这些信号量的初值为1。intfork[0]=fork[1]=…=fork[4]=1;第i个哲学家所执行的程序:do{P(mutex);P(fork[i]);7P(fork[(i+1)mod5]);V(mutex);吃饭V(fork[i]);V(fork[(i+1)mod5]);}while(1);3-17.(1)公平竞争(无写者时,读者仍遵循多个读者可以同时读)rmutex互斥共享readcount;rwmutex读写互斥,写写互斥;读写进程在z上排队。intrmutex=1,rwmutex=1,readcount=0;reader:beginp(z);//读写进程在z上排队。p(rmutex);if(readcount=0)thenp(rwmutex);endif++readcount;v(rmutex);v(z);//无写者时,多个读者可以同时读.readdata;p(rmutex);--readcount;if(readcount=0thenv(rwmutex);endif;v(rmutex);…endwriter:beginp(z);//读写进程在z上排队。p(rwmutex);writedata;写z读写写读读读写8v(rwmutex);v(z);…end(2)写者优先intreadcount,writecount;semaphorermutex=1,wmutex=1,rwmutex=1,z=1,x=1;reader://当来了一个写进程时,通过p(x)禁止其后读进程读,直到写进程写完为止。while(1){p(z);//其他读进程在z上排队p(x);//一个读进程与一个写进程在x上竞争p(rmutex);//读进程互斥访问readcount++readcount;if(readcount==1)p(rwmutex);v(rmutex);v(x);v(z);readdata;//临界区p(rmutex);--readcount;if(readcount==0)v(rwmutex);v(rmutex);}Writer:while(1){p(wmutex);//写进程互斥访问writecount++writecount;if(writecount==1)p(x);//一个写进程与一个读进程在x上竞争rwmutexxz读读读读写读写写9v(wmutex);p(rwmutex);//其他写进程在rwmutex上排队writedata;//临界区v(rwmutex);p(wmutex);--writecount;if(writecount==0)v(x);//写进程都写完时,通