更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
写进程与读进程间具体的制约关系如何? (2)用PV操作写出这两个进程的同步算法程序。 解:(1) 写进程与读进程间具体的制约关系是同步和互斥关系。 (2) 采用PV操作的同步算法程序如下: semaphor mutex=1;//互斥信号量,用于两个进程互斥访问缓冲区 empty=n;//同步信号量,表示空闲缓冲区的数量 full=0;//同步信号量,表示放有整数的缓冲区个数 parbegin process Writer( ) { whil produce_an_integer( ); P(empty); P(mutex); write_an_integer_to_buffer( ); V(mutex); V(full); } } process Reader( ) { whil P(full); P(mutex); get_an_integer_from_buffer( ); V(mutex); V(empty); print_an_integer( ); } } paren 解:(1) 信号量和P、V操作的算法描述如下: semaphor seamphor seamphor int i=0;//生产者使用是缓冲区下标 int j=0; //消费者使用是缓冲区下标 parbegin process producerm (m=1, 2, 3, …) begin int a,b,c;//该生产者使用的局部变量 repeat 生产者获得3个整数a, b, P(empty); P(empty); P(empty);//得到3个空缓冲区 P(mutex);//生产者互斥访问共享变量i buffer[i]=a;//整数a存入缓冲区 i=(i+1) mo buffer[i]=b;//整数b存入缓冲区 i=(i+1) mo buffer[i]=c;//整数c存入缓冲区 i=(i+1) mo V(mutex); V(full); V(full); V(full);//通知消费者缓冲区已有数据(满缓冲区数增3) until fals process consumer k (k=1, 2, 3, …) begin int x; repeat P(full);//看看缓冲区是否有整数 P(mutex); //消费者互斥访问共享变量j x=buffer[j];//从缓冲区取整数到x中 j=(j+1) mo V(mutex);
组装为一台车 320040099060试用PV操作实现三个工人的合作。 【分析】工人1和工人2向箱子中放车架或车轮的活动,除了受到箱子容量的限制外,还应考虑车架和车轮的数量差,即不允许只放车架或只放车轮,因为那样可能会引起死锁(学生思考:为什么?)。显然,工人1放车架时至少应留出2个放车轮的空位;同样,工人2放车轮时至少应留出1个空位放车架。若count1和count2分别代表车架数和车轮数,则不妨规定-(N-1)≤count1-count2≤N-2 解:semaphore mutex, avail, availa, availb, fulla, fullb; mutex=1;//互斥信号量,用于访问共享变量count1和count2 avail=N;//同步信号量,用于表示箱子中空闲位置数 availa=N-2;//同步信号量,用于表示箱子中可放车架的数量 availb=N-1;//同步信号量,用于表示箱子中可放车轮的数量 fulla=0;//同步信号量,用于表示箱子中已放的车架数量 fullb=0;//同步信号量,用于表示箱子中已放的车轮数量 parbegin process worker1( ) { while (1) { 加工一个车架; P(availa); P(avail);//看看箱子中是否还有放车架的位置 P(mutex); 车架放入箱中; V(mutex); V(fulla);//通知工人3,箱子中多了个车架 V(availb); } } process worker2( ) { while (1) { 加工一个车轮; P(availb); P(avail);//看看箱子中是否还有放车架的位置 P(mutex); 车轮放入箱中; V(mutex); V(fullb);//通知工人3,箱子中多了个车架 V(availa); } } process worker3( ) { while (1) { P(availa); P(mutex); 从箱中取一个车架; V(mutex); V(avail); P(availb); P(mutex); 从箱中取一个车轮; P(mutex); V(avail); P(availb); P(mutex); 从箱中再取一个车轮; V(mutex); V(avail); 组装为一台车; } } parend 利用管程解决教科书上的生产者-消费者问题。 利用管程解决生产者-消费者问题,首先要为它们建立一个管程,命名为Produer_Consumer,简称为PC。其中包括两个过程: ① put(item)过程。生产者利用该过程将自己生产的产品投放到缓冲池中,并用整型变量count来表示在缓冲池中已有的产品数目,当count≥n时,表示缓冲池已满,生产者等待(阻塞)。 ② get(item)过程。消费者利用该过程从缓冲池中取出一个产品,当count≤0时,表示缓冲池已无可取的产品,消费者应等待。 PC管程可描述如下: type PC=monitor var in,out,count: integer; 1320800864870P0P2P1B0B1B2P0P2P1B0B1B2三个进程P0、P1、P2和三个缓冲区B0、B1、B2,进程间借助相邻缓冲区传递消息:P0每次从B0中取出一条消息经加工后送入B1中,P1每次从B1中取出一条消息经加工后送入B2中,P2每次从B2中取出一条消息经加工后送入B0中。B0,B1,B2分别可存放3,2,2个消息。初始时B0中有2个消息,B1 ,B2中各有1个消息。用P、V操作写出P0,P1,P2的同步及互斥流程。 (2) 采用信号量机制 (2) 采用管程 (2) 定义管程SMook如下: (2) 采用管程来解决本问题。管程定义如下: (2) 采用管程
在什么情况下,5个哲学家全部吃不上饭? 解:(1) semaphor semaphor int flag[5]={0,0,0,0,0};//标志变量 Pi ( )//第i号哲学家的活动过程,i=0,1,2,3,4 { m=(i+1)%5; n=(i-1+5)%5; L1: P(mutex); i { V(mutex); flag[i] = -1; P(S[i]); goto L1; } flag[i]=1;//flag[i]=1表示第i号哲学家要求吃饭 V(mutex); 拿起左边筷子; 拿起右边筷子; 吃饭; 放下左边筷子; 放下右边筷子; P(mutex); flag[i]=0; i { flag[m]=0; V(S[m]); } i { flag[m]=0; V(S[m]); } V(mutex); } parbegin P0( ); P1( ); P2( ); P3( ); P4( ); paren (2) semaphor semaphor int flag[5]={0,0,0,0,0};//标志变量 Pi ( )//第i号哲学家的活动过程,i=0,1,2,3,4 { m=(i+1)%5; n=(i-1+5)%5; L1: P(mutex); i { V(mutex); flag[i] = -1; P(S[i]); goto L1; } flag[i]=1;//flag[i]=1表示第i号哲学家要求吃饭 V(mutex); 拿起左边筷子; 拿起右边筷子; 吃饭; 放下左边筷子; 放下右边筷子; P(mutex); flag[i]=0; i { flag[m]= -2; V(S[m]); } i { flag[m]= -2 ; V(S[m]); } V(mutex); } parbegin P0( ); P1( ); P2( ); P3( ); P4( ); paren semaphor Pi ( ) //第i号哲学家的活动过程,i=0,1,2,3,4 { j=(i+1)%5; whil P(chopstick[i]);//拿起左边的筷子 P(chopstick[j]);//拿起右边的筷子 吃饭; V(chopstick[i]);//放下左边的筷子 V(chopstick[j]);//放下右边的筷子 } } parbegin P0( ); P1( ); P2( ); P3( ); P4( ); paren (上海交通大学1996年试题)哲学家甲请哲学家乙、丙、丁到某处讨论问题,约定全体到齐后开始讨论;在讨论的间隙四位哲学家进餐,每人进餐都需使用刀、叉各一把(假设每个哲学家进餐时都是先拿刀,再拿叉),餐桌上的布置如图2-6所示。请用信号量及P、V操作说明这四位哲学家的同步、互斥过程。 1436370312420甲乙丙丁刀1刀2叉1叉2食品图2-6 哲学家进餐问题(b表示刀,ψ表示叉)bbψψ甲乙丙丁刀1刀2叉1叉2食品图2-6 哲学家进餐问题(b表示刀,ψ表示叉)bbψψ解:设置四个互斥信号量fork1、fork2、knife1、knife2,其初值均为1,分别表示资源叉1、叉2、刀1、刀2是否可用。同步算法描述如下: semaphor fork1=fork2=knife1=knife2=1; process Pa( )//哲学家甲 { whil { 讨论问题; P(knife1);//拿起右边的刀子 P(fork1);//拿起左边的叉子 进餐; V(knife1);//放下右边的刀子 V(firk1);//放下左边的叉子 } } process Pb( )//哲学家乙 { whil { 讨论问题; P(knife2);//拿起左边的刀子 P(fork1);//拿起右边的叉子 进餐; V(knife2);//放下左边的刀子 V(firk1);//放下右边的叉子 } } process Pc( )//哲学家丙 { whil { 讨论问题; P(knife2);//拿起右边的刀子 P(fork2);//拿起左边的叉子 进餐; V(knife2);//放下右边的刀子 V(firk2);//放下左边的叉子 } } process Pd( )//哲学家丁 { whil { 讨论问题; P(knife1);//拿起左边的刀子 P(fork2);//拿起右边的叉子 进餐; V(knife1);//放下左边的刀子 V(firk2);//放下右边的叉子 } } parbegin Pa( ); Pb( ); Pc(); Pd( ); paren(  )
本程序也没有考虑顾客理完发后的付款问题。 (青岛大学2002年试题)青岛崂山有一处景点称作上清宫,游客在宫内游玩后可以在宫门口免费搭乘轿车游览崂山的风景区,游览完毕再返回宫门口(如下图2-8所示)。 center87630上清宫乘车点游线览路图2-8 崂山风景区上清宫乘车点游线览路图2-8 崂山风景区已知风景区内游览轿车总量有M辆,游客总数为N,约定: 每辆轿车限乘一位游客; 如果有空闲的轿车,应当允许想游览的游客乘坐; 无空闲的轿车时,游客应该等待; 若没有想游览的乘客,轿车也应等待。 试利用P、V操作实现N个游客进程和M辆轿车进程的同步操作过程。 解:定义4个信号量car_avail、car_taken、finished和take_off。car_avail初值为M,它表示空闲轿车数量;car_taken表示是否有游客乘车,用于阻塞轿车进程;finished用于游览是否结束;take_off用于同步游客是否已下车,后3个信号量初值都为0。 semaphore car_avail=M,car_taken=0,finished=0,take_off=0; parbegin process passenger ( )//游客进程 begin 游上清宫; P(car_avail);//看看是否有轿车可乘,若无则等待 V(car_taken);//唤醒一等待的轿车进程 游客上车; P(finished);//游客等待游览结束 游客下车; V(take_off);//通知轿车进程,游客已下车 end process car ( ) begin repeat P(car_taken);//若无游客,轿车进程等待 带一游客游览风景区; V(finished);//通知游客游览已结束 P(take_off);//等待游客下车 V(car_avail);//空闲轿车数增1:若有等待的游客则唤醒之 until false end parend (南开1997年试题)在南开大学和天津大学之间有一条弯曲的小路,其中从S到T一段路每次只允许一辆自行车通过,但其中间有一个小的安全岛M(同时允许两辆自行车停留),可供两辆自行车已从两端进入小路的情况下错车使用,如图2-9所示。试设计一个算法使来往的自行车均可顺利通过。 center28575M南开大学天津大学LTSK图2-9 小路示意图M南开大学天津大学LTSK图2-9 小路示意图【分析】路段T到L及路段S到K同时各只允许一辆自行车通过,而安全岛M允许两辆自行车使用,因此可以用3个信号量来管理它们:信号量SK表示是否允许自行车通过路段S到K,其初值为1;信号量TL表示是否允许自行车通过路段T到L,其初值为1;信号量M表示安全岛上还可以停放自行车的数目,其初值为2。另外,同一方向上的自行车最多只能有一辆通过S与T之间的路段(两个方向上有两辆),因此还应使用2个信号量来控制:信号量ST表示是否允许自行车从南开大学去天津大学,其初值为1;信号量TS表示是否允许自行车从天津大学去南开大学,其初值为1; 解:用P、V操作的算法描述如下: BEGIN semaphore SK, TL, M, ST, TS; SK=TL=ST=TS=1; M=2; parbegin process Nan_to_Tian ( )//从南开大学去天津大学 begin P(ST);//只允许一辆自行从南开大学去天津大学(互斥) P(SK);//路段S到K只允许一辆自行车通过(互斥) 从S走到K; P(M); 进入安全岛M; V(SK);//允许其它自行车通过S与K之间的路段 P(TL);//T与L之间路段只允许一辆自行车通过(互斥) V(M);//离开安全岛 从L走到T; V(TL);//允许其它自行车通过T与L之间的路段 V(ST); //允许其它自行车从南开大学去天津大学 end process Tian_to_Nan ( )//从天津大学去南开大学 begin P(TS);//只允许一辆自行从天津大学去南开大学 P(TL);//路段T到L只允许一辆自行车通过 从T走到L; P(M); 进入安全岛M; V(TL);//允许其它自行车通过S与K之间的路段 P(SK);//S与K之间路段只允许一辆自行车通过 V(M);//离开安全岛 从K走到S; V(SK);//允许其它自行车通过S与K之间的路段 V(TS); //允许其它自行车从天津大学去南开大学 end parend END 【讨论】由于控制了同一方向上的自行车最多只能有一辆通过S与T之间的路段,因此安全岛M上的自行车数目永远不会超过2辆,所以信号量M其实是可以省掉的。 827405525780马路可停n辆车路口A路口B马路可停n辆车路口A路口B(北交大1997年试题)讨论图2-10所示的交通管理例子(各方向上的汽车是单行、直线行驶),试用P、V操作实现各方向上汽车行驶的同步。假设开始时路口A、B之间的马路上无车辆。 图2-10 解:假设自西向东进入路口A的汽车为Xi,自北向南进入路口A的汽车为Yj,自北向南进入路口B的汽车为Zk。显然,同方向的汽车可共享路口A(或路口B),非同方向的汽车应互斥经过路口。对于自西向东的汽车,除了考虑2个路口与另一方向汽车的互斥问题外,还应考虑路口A、B之间路面可停n辆车的问题,当该段路面满时,自西向东的汽车不再允许进入路口A。 semaphore mutex1,mutex2,S1,S2,S3,S4,count; int Cx1, Cy, Cz, Cx2; mutex1=1;//用于Xi和Yj互斥进入路口A mutex2=1;//用于Xi和Zk互斥进入路口B S1=1;//用于Xi访问共享计数变量Cx1的互斥 S2=1;//用于Yj访问共享计数变量Cy的互斥 S3=1;//用于Xi访问共享计数变量Cx2的互斥 S4=1;//用于Zk访问共享计数变量Cz的互斥 (2)采用管程(名字为RF)的算法描述如下: (2)使用管程的解法如下: 1 1 2 1 53276531750…… 51244546990…… 54038526035…… 99 100
该系统CPU的最大利用率是多少? 解:(1) 因为1秒钟中断100次,所以中断周期为10ms。每个周期要花费1ms进行中断处理,所以系统将CPU的10%时间用于时钟中断处理。 (  )由题目所给条件可知,时间片长度为10个时钟周期,即100ms。 (1ms+2ms+1ms)÷100ms=4% 即操作系统将4%的CPU时间用于进程调度 (3) 从(  )可知,在100ms时间片内,系统用于调度的时间为4ms,用于另外9次时钟中断9ms,系统开销总共为13ms。因此,若没有因用户进程等待I/O等原因而出现CPU空闲的情况,CPU的最大利用率为:(100-13)100=87%。 (西安交大2002年试题)有5个任务 (1)先来先服务(按A,B,C,D,E顺序)算法; (  )优先级调度算法; (3)时间片轮转算法(设时间片为1min——原题无此假设)。 解:(1) 采用先来先服务算法时,5个任务在系统中的执行顺序、完成时间及周转时间如下表所示。 执行顺序 预计运行时间 开始执行时间 完成时间 周转时间 10 10 10 16 16 16 18 18 18 22 22 22 30 30 5个进程的平均周转时间为:(10+16+18+22+30)/5=19.2 (min) (  ) 采用最高优先级调度算法时,5个任务在系统中的执行顺序、完成时间及周转时间如下表所示。 执行顺序 预计运行时间 优先数 开始执行时间 完成时间 周转时间 5 6 6 4 6 14 14 3 14 24 24 2 24 26 26 1 26 30 30 5个进程的平均周转时间为:(6+14+24+26+30)/5=20 (min) 采用时间片轮转调度算法时,可以认为5个进程均分CPU时间,它们在系统中的执行情况如下: 第一轮: 第二轮: 第三轮: 第四轮: 第五轮: 第六轮: 第七轮: 第八轮: 第九轮: 第十轮:A(A完成,即A的周转时间为30min) (1min) 所以,5个进程的平均周转时间为:(8+17+23+28+30)/5=21.2 (min) (上题的变形) 有5个任务 (1)抢占式优先级调度算法。运行状态进程的优先数P按Pn=Pn-1+α变化,就绪状态进程的优先数P按Pn=Pn-1+β变化。其中n=0,1,2, ...,α= -0.5,β= 0.5,系统每30秒钟计算一次各进程的优先数。进程从运行态转变为就绪态时,优先数=就绪队列中进程的最小优先数-1。 (  )时间片轮转算法(设时间片为100ms)。