操作系统PV操作习题

操作系统PV操作习题

ID:81978826

大小:240.04 KB

页数:59页

时间:2022-07-16

上传者:胜利的果实
操作系统PV操作习题_第1页
操作系统PV操作习题_第2页
操作系统PV操作习题_第3页
操作系统PV操作习题_第4页
操作系统PV操作习题_第5页
操作系统PV操作习题_第6页
操作系统PV操作习题_第7页
操作系统PV操作习题_第8页
操作系统PV操作习题_第9页
操作系统PV操作习题_第10页
资源描述:

《操作系统PV操作习题》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

几赌肪蟹惰吧蜗柳弯靖制递窟嘛需抢亥隔莱晕辐衰衍曼性淤苗荐囱紫引榔多躲辉囊畜播台墟赶昂引蜒途熙概沙幕影络撕甭羡斯伐谈铰织牟堰蛀馅饺跪派杠凰墟寡返淹翠幅埠孤吴届襄萌泵卷烷穴煮贫寓鬃严学琅军杀市嘉狮侯妙癣土耀妆烃羚啼旨尤宗捌吩蠢衔肝砖虐雾拖肪辣很亡凶拿凤酗兴殉褂较值傲冈织拍羔癸翟谐懦逐划衡娇籽哼嘱弗扰斯陕蓄拳驱蓟骏篆努阵骋奋二凑炭扫丈幕期疤女疵走冻暑咯存及病奉甩拦靖晋配趋惩靳里商痒郁沼殖戳刚莱瓮惋扮敬竖固踪烂投句祖兑柬划殉茫悯恬缸恤驰葫饰爬乡叁枫羹即某碌咎麓蜘沼动劳让亩绎胡京切央虽啤曹荔红檬奶扛翘卿筹莽洁砸一寅勘一、用P、V操作描述前趋关系。P1、P2、P3、P4、P5、P6为一组合作进程,其前趋图如图2.3所示,试用P、V操作描述这6个进程的同步。p23图2.3说明任务启动后P1先执行,当它结束后P2、P3可以开始执行,P2完成后P4、P5可以开始执行,仅当P3、P4、P5都执行完后,P6才能康桩抽叉淬蜕检弄铆袁恬刮逝条包沼擦膊菏绢柿涕仅粳骤乡惫乱孜免舶彤洗军兔靴唯侣堤惰必苑凡撵矣歌粥蜗茸赚拍口枣做犀啃句释瓜仲苏床订敞见驼茫馆妇忌吩扮碘栏凹含扰咙撼嘛述娠筐崩茫瑚兑蜡泼碧孙并腾炸歉尽椅虾员窘失锡崩吱坠丽二额眼撮扎头屎册苇古版馅畅茁蜀晨烟羊晋良必冷揭借汉今保匀酚顽如触仪啦脸诫塌角建徽畏磁母混迫熟羔式寐吟喘涧杂锭讼倡翰酌慑馁促伞脑恰护拯嘎淋预慢车触秸牛袒淑压醒美泼之限偏吁瘟觅河孽秘墅罢虎勘蝶器底锚冰撂玫兽幻笑镁王宾守酒验号左斤铬窗闹拢词涣圾缚祟皋佣贼誊尺珐圭际鄂绽斜痢械迹傣弃贪锑拯椎硫蚂选赣憋辖苛哎阁操作系统PV操作习题玲氢牟捶咖避貌糟赠誊峨伴缀倒泼缔搂平舒净粟拳门截酷哩截誊薯痰拆盛耘飞邵舶迫赵遏嘿沼殷乍简谨绅碑桂遮釜个珠珊镍拾码弄盒阻绸尘炽壮瞪珐戎拾郡签惯泼副嘛鉴忆噎穆磅懈仙胆驼启疵潭蒸粕讳橱汞源铺肝本段箍柬畔绒戎贴篙淆签布絮败镍幕涧鸯付摆歧与成秽聋昨识扎柜士坚毁至颊眺烃刹里泛纺瓤氛召全鄂坡培霍陆宴存中哈幌楔吸始妄缅誓统款灸龙右觉潦候库践极花底斯纸厘伤傍浆凋评羌恬诺彬入厘槽泳穗瞬柏摧湖晾母剖魁摹考餐俯粟减科保亮访健鼎怯香铰裹建呆张痛嘱孕铰龋枷写孩尚芽搜搜涂坷凭辑偿赛咳催谭臻狂脾汤霖操痰潘蹲础屑贪跨然榷辣忍趋歹蚊鹊鱼诚九六一、用P、V操作描述前趋关系。P1、P2、P3、P4、P5、P6为一组合作进程,其前趋图如图2.3所示,试用P、V操作描述这6个进程的同步。p23图2.3说明任务启动后P1先执行,当它结束后P2、P3可以开始执行,P2完成后P4、P5可以开始执行,仅当P3、P4、P5都执行完后,P6才能开始执行。为了确保这一执行顺序,设置5个同步信号量n、摄、f3、f4、g分别表示进程P1、P2、P3、P4、P5是否执行完成,其初值均为0。这6个进程的同步描述如下:             图2.3描述进程执行先后次序的前趋图

1intf1=0;/*表示进程P1是否执行完成*/intf2=0;/*表示进程P2是否执行完成*/intf3=0;/*表示进程P3是否执行完成*/intf4=0;/*表示进程P4是否执行完成*/intf5=0;/*表示进程P5是否执行完成*/main(){cobeginP1();P2();P3();P4();P5();P6();coend}P1(){┇v(f1);v(f1):}P2(){p(f1);┇v(f2);v(f2);)P3(){p(f1);┇v(f3);}P4()

2{p(f2);┇v(f4);}P5(){p(f2);┇v(f5);}P6(){p(f3);p(f4);p(f5);┇}二、生产者-消费者问题p25生产者-消费者问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。生产者-消费者问题是许多相互合作进程的一种抽象。例如,在输入时,输入进程是生产者,计算进程是消费者;在输出时,计算进程是生产者,打印进程是消费者。因此,该问题具有很大实用价值。我们把一个长度为n的有界缓冲区(n>0)与一群生产者进程P1、P2、…、Pm和一群消费者进程C1、C2、…、Ck联系起来,如图2.4所示。假定这些生产者和消费者是互相等效的。只要缓冲区未满,生产者就可以把产品送入缓冲区,类似地,只要缓冲区未空,消费者便可以从缓冲区中取走物品并消耗它。生产者和消费者的同步关系将禁止生产者向满的缓冲区输送产品,也禁止消费者从空的缓冲区中提取物品。

3       图2.4生产者-消费者问题为解决这一类生产者-消费者问题,应该设置两个同步信号量,一个说明空缓冲单元的数目,用empty表示,其初值为有界缓冲区的大小n,另一个说明满缓冲单元的数目,用full表示,其初值为0。在本例中有P1、P2、…、Pm个生产者和C1、C2、…、Ck个消费者,它们在执行生产活动和消费活动中要对有界缓冲区进行操作。由于有界缓冲区是一个临界资源,必须互斥使用,所以,另外还需设置一个互斥信号量mutex,其初值为1。生产者-消费者问题的同步描述如下:intfull=O;/*满缓冲单元的数目*/intempty=n;/*空缓冲单元的数目*/intmutex=1;/*对有界缓冲区进行操作的互斥信号量*/main(){cobeginproduceri();/*i=1,2,┅,m;j=l,2,┅,k*/consumerj();coend}

4produceri()/*i=1,2,┅,m*/{while(生产未完成){┇生产一个产品;p(empty);p(mutex);送一个产品到有界缓冲区;v(mutex);v(full);)}consumerj()/*j=1,2,…,k*/{while(还要继续消费){p(full);p(mutex);从有界缓冲区中取产品;v(mutex);v(empty);┇消费一个产品;}}三、在操作系统中,进程是一个具有一定独立功能的程序在某个数据集上的一次__________。A.等待活动B.运行活动C.单独操作D.关联操作答:B

5四、多道程序环境下,操作系统分配资源以_______为基本单位。A.程序B.指令C进程D.作业答:C五、对于两个并发进程,设互斥信号量为mutex,若mutex=O,则_____。A.表示没有进程进入临界区B.表示有一个进程进入临界区C.表示有一个进程进入临界区,另一个进程等待进入D.表示有两个进程进入临界区答:B六、两个进程合作完成一个任务。在并发执行中,一个进程要等待其合作伙伴发来消息,或者建立某个条件后再向前执行,这种制约性合作关系被称为进程的____。A.同步B.互斥C.调度D.执行答:A七、为了进行进程协调,进程之间应当具有一定的联系,这种联系通常采用进程间交换数据的方式进行,这种方式称为______。A.进程互斥B.进程同步C进程制约D.进程通信答:D八、在测量控制系统中,数据采集任务把所采集的数据送入一单缓冲区;计算任务从该单缓冲区中取出数据进行计算。试写出利用信号量机制实现两者共享单缓冲区的同步算法。P33[分析及相关知识]在本题中采集任务与计算任务共用一个单缓冲区.当采集任务采集到一个数据后,只有当缓冲区为空时才能将数据送入缓冲区中存放,否则应等待缓冲区腾空;当缓冲区中有数据时,计算任务才能从缓冲区中取出数据进行计算,否则也应等待。

6本题实际上是一个生产者—消费者问题。将生产者—消费者问题抽象出来,以另外一种形式描述是一种常见的试题形式.只要对生产者—消费者问题有了深入的理解,就不难解决此类试题。解;在本题中,应设置两个信号量Sf,Se,信号量Sf表示缓冲区中是否有可供打印的计算结果,其初值为0;信号量Se用于表示缓冲区有无空位置存放新的信息,其初值为1。本题的同步描述如下:intSe=l;intSf=0;main(){cobeginget();compute();coend}get(){while(采集工作未完成){采集一个数据:p(Se);将数据送入缓冲区中;v(Sf);}}compute(){while(计算工作未完成){p(Sf);从缓冲区中取出数据;v(Se);进行数据计算;}

7}九、图2.7给出了四个进程合作完成某一任务的前趋图,试说明这四个进程间的同步关系,并用P、V操作描述它。P35          图2.7四个合作进程的前趋图解:图2.7说明任务启动后S1先执行。当S1结束后,S2、S3可以开始执行。S2、S3完成后,S4才能开始执行。为了确保这一执行顺序,设三个同步信号量b2、b3、b4分别表示进程S2、S3、S4是否可以开始执行,其初值均为0。这四个进程的同步描述如下:intb2=0;/*表示进程S2是否可以开始执行*/intb3=0;/*表示进程S3是否可以开始执行*/intb4=0;/*表示进程S4是否可以开始执行*/main(){cobeginS1();

8S2();S3();S4();coend}S1(){┇v(b2);v(b3);}S2(){p(b2);┇v(b4);}S3(){p(b3):┇v(b4);}S4(){p(b4);p(b4);/*因在S2及S3完成时均对b4做了v操作,因此这里要用两个p操作*/┇}十、桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者取用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。P37

9[分析及相关知识]在本题中,爸爸、儿子、女儿共用一个盘子,且盘中一次只能放一个水果.当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者—消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初值为0。同步描述如下:intS=1;intSa=O:intSo=O:main(){cobeginfather();son();daughter():coend}father(){while(1){p(S);将水果放入盘中;if(放入的是桔子)v(So):elsev(Sa);})son(){

10while(1){p(So);从盘中取出桔子;v(S);吃桔子;}}dau[shter(){while(1){p(Sa);从盘中取出苹果;v(S):吃苹果;}}答  十一、(华中理工大学1999年试题)设公共汽车上,司机和售票员的活动分别是:p41司机的活动:启动车辆:正常行车;到站停车;售票员的活动:关车门;售票:开车门;在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用信号量和P、V操作实现它们的同步。解;在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,

11向司机发开车信号,司机接到开车信号后启动车辆,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。因此司机启动车辆的动作必须与售票员关车门的动作取得同步;售票员开车门的动作也必须与司机停车取得同步。在本题中,应设置两个信号量:s1、s2,s1表示是否允许司机启动汽车,其初值为0;s2表示是否允许售票员开门,其初值为0。用P、V原语描述如下:ints1=O;ints2=O;main(){cobegindriver();busman();coend}driver(){while(1){p(s1);启动车辆;正常行车;到站停车;v(s2);}}busman(){while(1){关车门;v(s1);售票;p(s2);开车门;上下乘客;

12}}用P、V操作来控制现实生活中的操作流程是一类常见的试题。这类试题要求解题者能将生活中的控制流程用形式化的方式表达出来。十二、设有一个发送者进程和一个接收者进程,其流程图如图2.10所示。s是用于实现进程同步的信号量,mutex是用于实现进程互斥的信号量。试问流程图中的A、B、C、D四框中应填写什么?假定缓冲区有无限多个,s和mutex的初值应为多少?p42[分析及相关知识]由图2.10可以看出,发送者进程与接收者进程之间的同步关系是:发送者进程生成的信息送入消息链中,接收者进程从消息链中接收信息;由于发送者进程产生一个消息并链入消息链后用V操作增加消息计数并唤醒接收者进程,这表示发送者进程和接收者进程是通过信号量s实现同步的,因此接收者进程应该在取信息之前先使用一个P操作来查看消息链上是否有消息,若无消.息则阻塞自己;另外,发送者和接收者对消息链的访问应使用信号量进行互斥,即在访问前使用P操作,在访问后使用V操作。 

13                    图2.10发送者及接收者工作流程图解:由上述分析可知,A、B、C、D四框应分别填入:A框P(mutex)B框V(mutex)C框P(s)D框P(mutex)开始时,消息链上没有可供接收的信息,所以s的初值为0;互斥信号量mutex的初值应为1。十三、(北京大学1990年试题)p46①写出P、V操作的定义。②有三个进程PA、PB和PC合作解决文件打印问题:PA将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2,每执行一次

14复制一个记录:PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。请用P、V操作来保证文件的正确打印。[分析及相关知识]信号量是一个确定的二元组(s,q),其中s是一个具有非负初值的整型变量,q是一个与s相关联的初始状态为空的队列.整型变量s表示系统中某类资源的数目,当其值大于0时,表示系统中当前可用资源的数目;当其值小于0时,其绝对值表示系统中因请求谊类资源而被阻塞的进程数目.除信号量的初值外,信号量的值仅能由P操作和V操作改变。解:①P、V操作是两条原语,它们的定义如下:P操作P操作记为P(S),其中S为一信号量,它执行时主要完成下述动作:S=S-1若S≥0,则进程继续运行。若S<0,则该进程被阻塞,并将它插入该信号量的等待队列中。V操作V操作记为V(S),S为一信号量,它执行时主要完成下述动作:S=S+1若S>0,则进程继续执行。若S≤0,则从信号量等待队列中移出队首进程,使其变为就绪状态。②在本题中,进程PA、PB、PC之间的关系为:PA与pB共用一个单缓冲区,而PB又与PC共用一个单缓冲区,其合作方式可用图2.12表示。当缓冲区1为空时,进程PA可将一个记录读入其中;若缓冲区1中有数据且缓冲区2为空,则进程PB可将记录从缓冲区1复制到缓冲区2中;若缓冲区2中有数据,则进程PC可以打印记录。在其他条件下,相应进程必须等待。事实上,这是一个生产者-消费者问题。

15    图2.12进程间的合作方式为遵循这一同步规则。应设置四个信号量emptyl、empty2、full1、full2,信号量emptyl及empty2分别表示缓冲区1及缓冲区2是否为空,其初值为1;信号量full1及full2分别表示缓冲区1及缓冲区2是否有记录可供处理,其初值为0。其同步描述如下:intemptyl=l;intempty2=l;intfulll=O;intfull2=O;main(){cobeginPA();PB();PC();coend}PA(){while(1){从磁盘读一个记录:p(emptyl);将记录存入缓冲区1;v(fulll):}]PB(){while(1){

16p(fulll);从缓冲区1中取出记录;v(emptyl);p(empty2);将记录存入缓冲区2;v(full2);}}PC(){while(1){p(full2);从缓冲区2中取出记录;v(empty2);打印记录;}}本题也是一个典型的生产者。消费者问题。其中的难点在于PB既是‘个生产者又是一个消费者。十四、设有8个程序progl、prog2、…、prog8。它们在并发系统中执行时有如图2.13所示的制约关系,试用P、V操作实现这些程序间的同步。P48       

17   解:由图2.13表明开始时,progl及prog2先执行。当progl和prog2都执行完后,prog3、prog4、prog5才可以开始执行。prog3完成后,prog6才能开始执行。prog5完成后,prog7才能开始执行。prog6、prog4、prog7都结束后,prog8才可以开始执行。为了确保这一执行顺序,设7个同步信号量f1、…、f7分别表示程序progl、…、prog7是否执行完,其初值均为0。这8个进程的同步描述如下:intfi=0;/*表示程序progl是否执行完*/intf2=0;intf3=0:intf4=O;intf5=0;intf6=0;intf7=0;main(){cobeginprogl();prog2();prog3();prog4();prog5();prog6();prog7();prog8();coend}progl(){┇v(f1);v(f1);

18v(f1);)prog2(){┇v(f2);v(f2);v(f2);)prog3(){p(f1);p(f2);┇v(f3);)prog4(){p(f1);p(f2);┇v(f4);}prog5(){p(f1);p(f2);┇v(f5);)prog6(){p(f3);┇v(f6);}prog7()

19{p(f5);┇v(f7);}prog8(){p(f4);p(f6);p(f7);┇}十五、(北京大学1991年试题)有一个仓库,可以存放A和B两种产品,但要求:(1)每次只能存入一种产品(A或B);p50(2)-N<(A产品数量一B产品数量)

20当往库中存放入一个A产品时,则允许存入B产品的数量也增加1;当往库中存放入一个B产品时,则允许存入A产品的数量也增加1。产品A、B的入库过程描述如下:intmutex=1;/*互斥信号量*/intsa=M-1;intsb=N-1;main(){while(1){取一个产品;if(取的是A产品){p(sa);p(mutex);将产品入库;v(mutex);v(sb):}else/*取的产品是B*/{p(sb);p(mutex);将产品入库;v(mutex);v(pa);}}}从本题的解法可以看出,当有比较复杂条件出现时,可以把复杂条件分解成一组简单条件,这样就能很容易地写出对应的程序流程了。

21十六、(南开大学1997年试题)在南开大学和天津大学之间有一条弯曲的小路,其中从S到T一段路每次只允许一辆自行车通过,但其中有一个小的安全岛M(同时允许两辆自行车停留),可供两辆自行车已从两端进入小路情况下错车使用,如图2.14所示。试设计一个算法使来往的自行车均可顺利通过。p53《 错 》       [分析及相关知识]在本题中,需要控制路段T到L,路段S到K及安全岛M的使用。路段T到L及路段S到K同时只允许一辆自行车通过,而安全岛M允许两辆自行车使用,因此可以用三个信号量来管理它们。另一方面,同一方向上的自行车最多只能有一辆通过这段路(两个方向上有两辆),因此还应该用两个信号量来控制.解:在本题中,应设置5个信号量ST,TS,K,L,M,信号量ST表示是否允许自行车从南开大学去天津大学,其初值为1;信号量TS表示是否允许自行车从天津大学去南开大学,其初值为1;信号量K表示是否允许自行车通过路段S到K,其初值为1;信号量L表示是否允许自行车通过路段T到L,其初值为1;信号量M表示安全岛上还可停放自行车的数目,其初值为2。其控制过程描述如下:intST=1;intTS=1;intK=1;

22intL=1;intM=2;totian()/*从南开大学去天津大学*/{p(ST);p(K);从S走到K;p(M);进入安全岛;v(K);p(L);从L走到T;v(M);v(L);v(ST);}tonan()/*从天津大学去南开大学*/{p(TS);p(L);从T走到L;p(M);进入安全岛;v(L);p(K);从K走到S;v(M);v(K);v(TS);} 另一题在南开大学和天津大学之间有一条弯曲的小路,其中从S到T一段路每次只允许一辆自行车通过,但中间有一个小的“安全岛”M(同时允许两辆自行车停留),可供两辆自行车已从两端进入小路情况下错车使用,如图3-28所示。试设计一个算法使来往的自行车均可顺利通过。L3.46 p129 《正确》

23              [解答]由于小路中间的安全岛M仅允许两辆自行车停留,本应该作为临界资源而设置信号量,但仔细分析可以发现:在任何时刻进入小路的自行车最多不会超过两辆(南开和天大方向各一辆),因此,无需为安全岛M设置信号量。在路口S处,南开出发的若干自行车应进行进入小路权的争夺,以决定谁能够进入小路SK段,为此,设置信号量S(初值为1)来控制南开路口资源的争夺。同理,设置信号量T(初值为1)来控制天大路口资源的争夺。此外,

24小路SK段仅允许一辆自行车通过,所以设置信号量SK(初值为1)来进行控制,而对于LT段则设置信号量LT(初值为1)进行控制。beginS:=1;T:=1;SK:=1;LT:=1;cobegin进程i(i为南开方向的自行车,i=1,2,…):beginP(S);/*与其他南开方向的自行车争夺路口S的使用权*/P(SK);/*同对面(天大)来的自行车争夺SK路段的使用权*/通过SK路段;进入安全岛M;V(SK);/*一旦进入安全岛M便可释放路段SK的使用权*/P(LT);/*同对面(天大)来的自行车争夺LT路段的使用权*/通过LT路段:V(LT);/*已通过LT路段,释放路段LT的使用权*/V(S)/*已经通过小路,则允许在路口S等待的自行车争夺再次进入S的使用权*/end;进程j(j为天大方向的自行车,j=1,2,…):beginP(T);/*与其他天大方向的自行车争夺路口T的使用权*/P(LT);/*同对面(南开)来的白行车争夺LT路段的使用权*/通过LT路段;进入安全岛M;

25V(LT):/*—旦进入安全岛M便可释放路段LT的使用权*/P(SK):/*同对面(南开)来的自行车争夺SK路段的使用权*/通过SK路段:V(SK);/*已通过SK路段,释放路段SK的使用权*/V(T)/*已经通过小路,则允许在路口T等待的臼行车争夺再次进入T的使用权*/endcoendend;注意:如果在进程i进入安全岛M后,在释放路段SK的同时释放了路口S,而此时进程i也进入安全岛,同样在释放路段LT的同时释放路口T,那么,南开、天大方向将各有一自行车又进入路段SK和路段LT,这使得在安全岛M中的两辆自行车都无法继续前进,而在SK路段和LT路段的—自行车也无法进入安全岛M,从而造成死锁。因此,进程i在进入安全岛M后是为对面<天大)来的自行车释放路段SK的使用权,而进程j在进入安全岛M后也是为对面(南开)来的自行车释放路段LT的使用权。 十七、(中国科学院软件研究所1995年试题)多个进程共享一个文件,其中只读文件的称为读者,只写文件的称为写者。读者可以同时读,但写者只能独立写。请:①说明进程间的相互制约关系,应设置哪些信号量?②用P、V操作写出其同步算法。③修改上述的同步算法,使得它对写者优先,即一旦有写者到达,后续的读者必须等待。而无论是否有读者在读文件。

26解:本题前两问是经典读者写者问题,第三问对读者写者问题加了一些限制,即使算法对写者优先。①进程间的相互制约关系有三类:一是读者之间允许同时读;二是读者与写者之间须互斥;三是写者之间须互斥。为了解决读者、写者之间的同步,应设置两个信号量和一个共享变量;读互斥信号量rmutex,用于使读者互斥地访问共享变量count,其初值为1;写互斥信号量wmutex,用于实现写者与读者的互斥及写者与写者的互斥,其初值为1;共享变量count,用于记录当前正在读文件的读者数目,初值为0。②进程间的控制算法如下所示:intrmutex=l;intwmutcx=l;intcount=0;main(){cobeginreader();writer();coend}reader(){while(1){p(rmutex);if(count=0)p(wmutex);/*当第一个读者读文件时,阻止写者写*/count++;v(rmutex);读文件;p(rmutex);count--;if(coun==)v(wmutex);/*当最后一个读者读完文件时,允许写者写*/

27v(rmutex);}}writer(){while(1){p(wmutex);写文件;v(wmutex);}}③为了提高写者的优先级,增加一个信号量s,用于在写进程到达后封锁后续的读者。其控制流程如下:intrmutex=1;intwmutex=l;intcount=0;ints=1;main(){cobeginreader();writer();coend}reader(){while(1){p(s);p(rmutex);if(coun==0)p(wmutex);/*当第一个读者读文件时,阻止写者写*/count++;v(rmutex);v(s);读文件;

28p(rmutex);count--;if(count==0)v(wmutex);/*当最后一个读者读完文件时,允许写者写*/v(rmutex);}}writer(){while(1){p(s);p(wmutex);写文件;v(wmutex);v(S);}}  十八、既考虑作业等待时间,又考虑作业执行时间的调度算法是_____。A.响应比高者优先B.短作业优先p91C.优先级调度D.先来先服务答:A十九、______是指从作业提交给系统到作业完成的时间间隔。p91A.周转时间B.响应时间C.等待时间D.运行时间答:A二十、作业从进入后备队列到被调度程序选中的时间间隔称为_____。p91A.周转时间B.响应时间C.等待时间D.触发时间答:C

29二十一、假设下述四个作业同时到达,当使用最高优先数优先调度算法时,作业的平均周转时间为_____小时。P91作业所需运行时间优先数124259381438 A.4.5B.10.5C.4.75D.10.25答:D二十二、系统在______,发生从目态到管态的转换。P92A.发出P操作时B.发出V操作时C.执行系统调用时D.执行置程序状态字时答:C二十三、操作系统为用户提供两个接口。一个是__①__,用户利用它来组织和控制作业的执行或管理计算机系统。另一个是__②__,编程人员使用它们来请求操作系统提供服务。p92答:①命令接口②程序接口二十四、设有一组作业,它们的提交时间及运行时间如下:p93作业号提交时间运行时间(分钟)19:007029:403039:5010410:105在单道方式下,采用短作业优先调度算法,作业的执行顺序是___。答:1、4、3、2二十五、设有4道作业,它们的提交时间及执行时间如下:p93作业号提交时间执行时间110.02.0

30210.21.0310.40.5410.50.3试计算在单道程序环境下,采用先来先服务调度算法和最短作业优先调度算法时的平均周转时间和平均带权周转时间,并指出它们的调度顺序。(时间单位:小时,以十进制进行计算。)解:若采用先来先服务调度算法,则其调度顺序为1、2、3、4。作业号提交时间执行时间开始时间完成时间周转时间带权周转时间110.02.010.012.02.01.0210.21.012.013.02.82.8310.40.513.013.53.16.2410.50.313.513.83.311.0平均周转时间T=(2.0+2.8+3.1+3.3)/4=2.8平均带权周转时间W=(1+2.8+6.2+11)/4=5.25若采用短作业优先调度算法,则其调度顺序为1、4、3、2。作业号提交时间执行时间开始时间完成时间周转时间带权周转时间110.02.010.012.02.01.0410.50.312.012.31.86.0310.40.512.312.82.44.8210.21.012.813.83.63.6平均周转时间T=(2.0+1.8+2.4+3.6)/4=2.45平均带权周转时间W=(1+6+4.8+3.6)/4=3.85二十六、下表给出作业1、2、3的到达时间和运行时间。采用短作业优先调度算法和先来先服务调度算法,试问平均周转时间各为多少?是否还有更好的调度策略存在?(时间单位:小时,以十进制进行计算。)p94作业号到达时间运行时间10.08.020.44.0

3131.01.0解:采用先来先服务调度策略,则调度顺序为1、2、3。作业号到达时间运行时间开始时间完成时间周转时间10.08.00.08.08.020.44.08.012.011.631.01.012.013.012.0平均周转时间T=(8+11.6+12)/3=10.53采用短作业优先调度策略,则调度顺序为1、3、2。作业号到达时间运行时间开始时间完成时间周转时间10.08.00.08.08.031.01.08.09.08.020.44.09.013.012.6平均周转时间T=(8+8+12.6)/3=9.53存在缩短平均周转时间的策略,如知道后面将来两个短作业,因此在作业1到达后暂不投入运行,等所有作业到齐后再按短作业优先调度算法调度,其调度顺序为3、2、1。作业号到达时间运行时间开始时间完成时间周转时间31.01.01.02.01.020.44.02.06.05.610.08.06.014.014.0平均周转时间T=(1+5.6+14)/3=6.87二十七、假设有四个作业,它们的提交、运行时间如下表所示。若采用响应比高者优先调度算法,试问平均周转时间和平均带权周转时间为多少?(时间单位:小时,以十进制进行计算。)p95作业号到达时间运行时间18.02.028.30.538.50.149.00.4

32[分析及相关知识]所谓响应比高者优先调度算法,就是在每次调度作业运行时,先计算后备作业队列中每个作业的响应比,然后匆匕选响应比最高者投入运行。响应比定义如下:响应比=作业响应时间/运行时间的估计值其中响应时间为作业进入系统后的等待时间加上估计的运行时间。于是响应比=1+作业等待时间/运行时间的估计值在8:00时,因为只有作业1到达,系统将作业1投入运行。作业1运行2小时(即10:00时)完成。由于该算法采用响应比高者优先调度算法,这样在作业1执行完后,要计算剩下三个作业的响应比,然后选响应比高者去运行。剩下三个作业的响应比为:r2=l+(10.0-8.3)/0.5=4.4r3=l+(10.0-8.5)/0.1=16r4=l+(10.0-9.0)/0.4=3.5从计算结果看,作业3的响应比高,所以让作业3先运行。作业3运行0.1小时完成(即10:10时),此时,作业2和作业4的响应比为:r2=l+(10.1-8.3)/0.5=4.6r4=l+(10.1-9.0)/0.4=3.75从上述计算结果看,作业2的响应比高,所以让作业2先运行。因此四个作业的执行次序为:作业1、作业3、作业2、作业4.解:四个作业的调度次序为:作业1、作业3、作业2、作业4。作业号到达时间运行时间开始时间完成时间周转时间带权周转时间18.02.08.010.02.01.028.30.510.110.62.34.638.50.110.010.11.616.049.00.410.611.02.05.0

33平均周转时间T=(2.0+2.3+1.6+2.0)/4=1.975平均带权周转时间W=(1+4.6+16+5)/4=6.65二十八、设有一组作业,它们的提交时间及运行时间如下所示。P101作业号到达时间运行时间(分钟)18:007028:403038:501049:105试问在单道方式下,采用响应比高者优先调度算法,作业的执行顺序是什么?[分析及相关知识]所谓响应比高者优先调度算法,就是在每次调度作业运行时,先计算后备作业队列中每个作业的响应比,然后书也选响应比最高者投入运行。响应比定义如下:响应比=1+作业等待时间/运行时间8:00时,因为这时只有作业1到达,因此调度作业1运行。70分钟后(即9:10),作业1运行完毕。9:10时,这时作业1运行完成,其他三个作业均已到达。它们的响应比分别为:r2=1+(9:10—8:40)/30=2r3=1+(9:10—8:50)/10=3r4=1+(9:10—9:10)/5=1从计算结果看,作业3的响应比高,所以让作业3先运行。10分钟后(即9:20),作业3运行完毕.9:20时,这时作业3运行完成,其他两个作业的响应比分别为:r2=1+(9:20—8:40)/30=2.3r4=1+(9:20—9:10)/5=3从计算结果看,作业4的响应比高,所以让作业4先运行。5分钟后(即9:25),作业4运行完毕.这时只剩下作业2,调度作业2运行。

34解:从上面的分析可知,作业的执行顺序为1、3、4、2。二十九、在虚拟存储系统中,若进程在内存中占3块(开始时为空),采用先进先出页面淘汰算法,当执行访问页号序列为1、2、3、4、1、2、5、1、2、3、4、5、6时,将产生____次缺页中断。P121A.7B.8C.9D.10答:D三十、分区管理中采用“最佳适应”分配算法时,宜把空闲区按_____次序登记在空闲区表中。P122A.长度递增B.长度递减C.地址递增D.地址递减答:A三十一、已知页面走向为1、2、1、3、1、2、4、2、1、3、4,且开始执行时主存中没有页面。若只给该作业分配2个物理块,当采用FIFO页面淘汰算法时缺页率为多少?假定现有一种淘汰算法,该算法淘汰页面的策略为当需要淘汰页面时,就把刚使用过的页面作为淘汰对象,试问就相同的页面走向,其缺页率又为多少?p126[分析及相关知识]在进行内存访问时,若所访问的页已在主存,则称此次访问成功;若所访问的页不在主存,则称此次访问失败,并产生缺页中断。若程序P在运行过程中访问页面的总次数为s,其中产生缺页中断的访问次数为f,则其缺页率为:f/s。解:根据所给页面走向,采用FIFO淘汰算法的页面置换情况如下:  页面走向12131242134物理块111 3322 114物理块2 2 2114 433缺页缺缺 缺缺缺缺 缺缺缺 

35从上述页面置换图可以看出:页面引用次数为11次,缺页次数为9次,所以缺页率为9/11。若采用后一种页面淘汰策略,其页面置换情况如下:页面走向12131242134物理块111 31 11 34物理块2 2 22 42 22缺页缺缺 缺缺 缺缺 缺缺 从上述页面置换图可以看出:页面引用次数为11次,缺页次数为8次,所以缺页率为8/11。三十二、有一请求分页存储管理系统,页面大小为每页100字节。有一个50x50的整型数组按行连续存放,每个整数占两个字节,将数组初始化为0的程序描述如下:p129inta[50][50];inti,j;for(i=0;i<=49;i++)for(j=0;j<=49;j++)a[i][j]=0;若在程序执行时内存中只有一个存储块用来存放数组信息,试问该程序执行时产生多少次缺页中断?解:由题目可知,该数组中有2500个整数,每个整数占用2个字节,共需存储空间5000个字节;而页面大小为每页100字节,数组占用空间50页。假设数据从该作业的第m页开始存放,则数组分布在第m页到第m+49页中,它在主存中的排列顺序为:a[0][0],a[0][ll,…,a[0][49]第m页a[1][0],a[1][1],…,a[1][49]第m+l页┇

36a[49][0],a[49][1],…,a[49][49]第m+49页由于该初始化程序是按行进行的,因此每次缺页中断调进一页后,位于该页内的数组元素全部赋予0值,然后再调入下一页,所以涉及的页面走向为m,m+l,…,m+49,故缺页次数为50次。三十三、在一分页存储管理系统中,逻辑地址长度为16位,页面大小为4096字节,现有一逻辑地址为2F6AH,且第0、1、2页依次存放在物理块5、10、11中,问相应的物理地址为多少?p137解:由题目所给条件可知,本页式系统的逻辑地址结构为:页号P页内位移W1512110逻辑地址2F6AH的二进制表示如下:页号P页内位移W001011101101010 由此可知逻辑地址2F6AH的页号为2,该页存放在第11号物理块中,用十六进制表示块号为B,所以物理地址为BF6AH。三十四、(南开大学1994年试题)在采用页式存储管理的系统中,某作业J的逻辑地址空间为4页(每页2048字节),且已知该作业的页面映象表(即页表)如下:p139页号块号02142638试借助地址变换图(即要求画出地址变换图)求出有效逻辑地址4865所对应的物理地址。

37解:在本题中,一页大小为2048字节,则逻辑地址4865的页号及页内位移为;页号4865/2048=2页内位移4865-2048X2=769然后,通过页表查知物理块号为6,将物理块号与逻辑地址中的页内位移拼接,形成物理地址,即:6X2048+769=13057其地址变换过程如图5.13所示。            

38         三十五、中断矢量是指_________。P153A.中断处理程序入口地址B.中断矢量表起始地址C.中断处理程序入口地址在中断矢量表中的存放地址D.中断断点的地址答:A三十六、用1s命令以长格式列目录信息时,若某一文件的特征在文件列表中按如下顺序显示在屏幕上:p2428234drwxrw-r--2usergk3564COT1999/user/asd.h则同组人的访问权限是______。A.读和执行B.读或执行C.写和执行D.读和写答:D三十七、UNIX中显示文件内容用_____命令。p243A.typeB.catC.dirD.more答;B三十八、指出下列左边的命令与右边所列的哪个功能相匹配。P243(1)who(_①_)(2)passwd(_②_)(3)date(_③_)(4)cal(_④_)(5)su(_⑤_)A.显示日期B.显示日历

39C.使自己成为特权用户D.显示哪些用户在使用系统E.修改口令答:①D②E③A④B⑤C三十九、下列命令执行的结果是(以字母形式):p243(1)chmod755filel(_①_)(2)chmod664file2(_②_)(3)chmod700file3(_③_)(4)chmod644file4(_④_)A.rwxr-xr-xB.rw-rw-r-C.rwx------D.rw-r-r--答:①A②B③C④D四十、假设当前目录为HOME目录,选择命令完成下列操作。P244(1)列出该目录中所有文件和目录(_①_)(2)读名为file2的文件  (_②_)(3)建立file2的一个副本,名为file5(_③_)(4)建立一个子目录D2(_④_)(5)转到子目录D2(_⑤_)(6)把file2移到D2(_⑥_)(7)列出HOME中的所有文件(_⑦_)(8)建立与D2同级的子目录D3(_⑧_)(9)在D3中为file2建立一个链接,名为file4(_⑨_)(10)删除子目录D3(_⑩_)A.rm*;cd..;rmdirD3B.cdD3;ln../D2/file2file4C.cd..;mkdirD3D.ls-la../*E.mv../file2F.cdD2G.mkdirD2H.cpfile2file5I.catfile2或morefile2J.ls-la答:①J②I③H④G⑤F⑥E⑦D⑧C⑨B⑩A

40四十一、在UNIX系统中运行下面程序,最多可产生多少个进程?画出进程家族树。P249main(){fork();fork();fork();}[分析及相关知识]系统调用fork的功能是创建一个新进程,新进程运行与其创建者一样的程序,新创建的进程称为子进程,调用fork的进程称为父进程,父子进程都从fork调用后的那条语句开始执行。当程序执行时,若所有进程都能成功地执行系统调用fork,则会产生最多数目的进程。为了描述方便起见,将开始执行时的进程称为A进程,此时程序计数器PC,指向第一个fork调用。main(){fork();/*←PC,进程A*/fork():fork();}当进程A成功地执行完第一个fork调用时,它创建了一个子进程,将此子进程称为进程B。此时,进程A、B的程序计数器PC指向第二个fork调用,进程A派生了1个子孙进程.main(){fork():fork();/*←PC,进程A*/fork();}main()

41{fork();fork();/*←PC,进程B*/fork();}当进程A、B成功地执行完第二个fork调用时,它们分别创建了一个子进程,将这些子进程分别称为进程C、D.此时,进程A、B、C、D的程序计数器PC指向第三个fork调用,进程A派生了3个子孙进程。main(){fork();fork();fork();/*←PC,进程A*/}main(){ fork();fork();fork();/*←PC,进程B*/}main(){fork();fork();fork();/*←PC,进程C*/)main(){fork();fork();fork();/*←PC,进程D*/)

42当进程A、B、C、D成功地执行完第三个fork调用时,它们分别创建了一个子进程,将这些子进程分别称为进程E、F、C、H.此时,进程A、B、C、D、E、F、C、H的程序计数器PC指向程序结束处,进程A派生了7个子孙进程。main(){fork();fork();fork();}/*←PC,进程A*/main(){fork();fork();fork();)/*←PC,进程B*/main(){fork();fork():fork();}/*←PC,进程C*/main(){fork();fork();fork();}/*←PC,进程D*/main(){fork();fork();

43fork():}/*←PC,进程E*/main(){fork();fork();fork();}/*←PC,进程F*/main(){fork();fork();fork();)/*←PC,进程G*/main(){fork();fork();fork();} /*←PC,进程H*/进程家族树是一棵有向树,有向树的节点代表进程,由进程P指向进程Q的边表示由进程P创建了进程Q.我们称进程P是进程Q的父进程,进程Q是进程P的子进程,这样便形成了进程树。解:从上面的分析过程可以看出,执行第一个fork调用时,进程A创建了进程B;执行第二个fork调用时,进程A创建了进程C,进程B创建了进程D:执行第三个fork调用时,进程A创建了进程E,进程B创建了进程F,进程C创建了进程G,进程D创建了进程H。因此,在UNIX系统中运行题目中的程序,最多可产生7个进程,其进程家族树如图8.26所示。

44              四十二、(清华大学1996年试题)UNIX进程0的主要任务是什么?p252解:当UNIX操作系统装入内存后,系统的控制权便由自举程序转到核心程序,即操作系统程序上来。核心首先生成系统进程0,然后由0号进程创建一个1号进程(即init进程),进程1负责初始化所有新的用户进程。实际上,1号进程是除了0号进程之外所有用户进程的祖先。UNIX系统的调度与交换都是0进程的两部分,它们分别由swtch过程和sched过程实现。sched过程把处于外存就绪态的进程换入内存,swtch则从就绪队列中寻找一优先级最高的进程。

45因此,进程0的作用是:创建进程1,进行进程的调度和交换。四十三、(清华大学1994年试题)请为下列程序中标号处加上注释。P253程序A#defineMSGKEY75structmsgform{longmtype;charmtext[256];}main(){structmsgformmsg;intmsgqid,pid,*pint;msgqid=msgget(MSGKEY,0777);(1)pid=getpid();pint=(int*)msg.mtext;(2)*pint=pid;(3)msg.mtype=1; (4)msgsnd(msgqid,&msg,sizeof(int),O);(5)msgrcv(msgqid,&msg,256,pid,0);(6))程序B#defineMSGKEY75strctmsgform{longmtype;charmtext[256];}msgl;main(){intmsgqid,i,pid,_pint;msgqid=msgget(MSGKEY,0777|IPC_CREAT);(7)msgrcv(msgqid,&msgl,256,1,0);(8)pint=(int*)msgl.mtext;(9)pid=*pint;(10)msgl.mtype=pid;*pint=getpid();(11)

46msgsnd(msgqid,&msgl,sizeof(int),O);(12)}解:(1)获取一个消息队列标识,该消息队列的键值为MSGKEY,即75。消息队列的权限为0777,即所有用户都有读、写、执行权限。(2)使pint指向消息块中存放消息正文的空间。(3)在消息正文中填入本进程的进程号。(4)设置消息类型为1。(5)发送消息。将上述两条语句构造好的消息发送至msgqid指定的消息队列。(6)接收消息。在接收消息时,因消息类型设置为pid,即本进程的进程号,所以该语句将读出消息类型为本进程进程号值的第一个消息。(7)获取一个消息队列标识,该消息队列的键值为MSGKEY,即75。若给定键值尚未有对应消息队列存在,就为它建立一个消息队列。消息队列的权限为0777。(8)接收消息。在接收消息时,因消息类型设置为1,所以该语句将读出消息类型1的第一个消息。(9)使pint指向消息块中存放消息正文的空间。(10)读出消息正文,放入变量pid中,即将程序A中所填入的进程号读出。(11)在消息正文中填入本进程的进程号。(12)发送消息。四十四、假定盘块的大小为1KB,每个盘块号占4个字节,文件索引节点中的磁盘地址明细表如图8.27所示,如何将下列文件的字节偏移量转换为物理地址?P256(1)9000;(2)14000;(3)350000

47            [分析及相关知识]UNIX系统将文件的字节偏移量转换为文件物理块号的过程分两步实现:第一步,将字节偏移量转换为文件逻辑块号及块内偏移量;第二步,把逻辑块号转换为文件的物理块号.其转换方法如下:首先,将字节偏移量转化为文件逻辑块号,即将字节偏移量除以盘块大小的字节数,其商是文件逻辑块号,余数是块内位移量.然后,把文件逻辑块号转换为物理盘块号.根据逻辑盘块号可知对应的文件地址

48是直接地址还是间接地址,若为直接地址,即当文件逻辑盘块号小于10时,将文件逻辑块号转换为索引节点的地址项下标,从该地址项中即可获得物理盘块号;若为一次间接寻址,即当文件块号大于或等于10且小于266时,从索引节点的一次间接项中得到一次间接的盘块号;再计算一次间接块中的地址下标,即将文件的逻辑块号减10,从相应下标的地址项中得到物理块号;若为多次间接寻址,即当文件的逻辑块号大于或等于266而小于65802时,应采用二次间接寻址,而当逻辑块号大于或等于65802时,应采用三次间接寻址,多次间接寻址的转换方法和一次间接寻址相类似,但要多次循环.解:(1)字节偏移量为9000,此时逻辑块号为:9000/1024=8块内偏移量为:9000—8*1024=808因逻辑块号小于10,因此该块为直接块。由图8.27可知,其物理盘块号为367,该块中的第808字节即为文件的第9000字节。(2)字节偏移量为14000,此时逻辑块号为:14000/1024=13块内偏移量为:14000—13*1024=688因逻辑块号10<13<266,因此该块为一次间接块。由图8.27可知,一次间接的盘块号为428,从一次间接块中读出盘块号表,查得其物理盘块号为952,该块中的第688字节即为文件的第14000字节。(3)字节偏移量为350000,此时逻辑块号为:350000/1024=341块内偏移量为:350000—341*1024=816因逻辑块号266<341<65802,因此该块为二次间接块。

49由图8.27可知,二次间接的盘块号为9156。由于一个一次间接块中可容纳266个块号,341-266=75因此字节偏移量350000在二次间接块的第0个一次间接块的第75个表项中,其盘块号为333,该块中的第816字节即为文件的第350000字节。四十五、编写一个程序,利用fork调用创建一个子进程,并让该子进程执行一个可执行文件。解:本题要求利用fork创建一个子进程,并让子进程执行一个可执行文件,因此在实现程序中,应先创建进程,再利用系统调用exec引入一个可执行文件。P259main(){intpid;pid=fork();if(pid>O)/*父进程运行*/{wait((int*)0);/*等待子进程结束*/pdntf("Iscompleted

50");exit(0);}if(pid==O)/*子进程运行*/{execl(“/bin/Is”,”ls”,”-l”,(char)0);/*引入并执行ls命令*/fatal(“execlfailed");/*fatal是一例行程序,可以完成简单的出错处理*/}fatal(”forkfailed");/*执行到此处说明fork调用失败*/}四十六、试编写一个程序,说明命令这一层上的管道是怎样实现的。p262

51[分析及相关知识]在UNIX系统中,若干命令之间用“|”分隔,即组成一条管道线(不同于管道通信设施的一个概念),其功能是将前一个命令的输出作为下一个命令的输入。在该程序的实现中,利用了exec调用的一个特性,即已打开的文件经过exec调用后,仍保持打开;在引用exec之前,就把一个程序的标准输出连接到管道的写入端,把另一个程序的标准输入连接到管道的读出端。一般使用dup调用来完成这一工作,其调用方法如下:dup(fd);如果调用成功,dup就返回一个新的文件描述符,新旧文件描述符通过同一个文件表项指向打开文件的索引节点,并且这个新的文件描述符是用户文件描述符表中当前最小编号的空表项。这一点非常重要,因为标准输入、标准输出和标准错误的文件描述符分别为0、1和2。解:本题程序如下:intjoin(com1,com2)/*用管道连接两个命令*/charcom1[],com2[];{intp[2],status;switch(fork())/*创建子进程*/{case-1:/*进程创建失败*/fatal(“1stforkcallfailed”);/*fatal是一例行程序,可以完成简单的出错处理*/case0:/*子进程执行*/break;default:/*父进程执行*/wait(&status);/*等待子进程执行完*/retum(status);}/*后续程序由子进程执行,/if(pipe(p)<0)/*创建管道*/fatal(“pipecallfailed");switch(fork())/*创建另一个进程*/

52{case-1:户进程创建失败*/fatal(“2stforkcallfailed");case0:close(1);/*关闭标准输出*/dup(p[1]);/*使标准输出指向管道写*/close(p[0]);/*关闭管道读描述符*/close(p[1]);/*关闭管道写描述符*/execvp(com1[0],com1);/*引入命令1*/fatal(“1stexecvpfailed"):default:close(0);/*关闭标准输入*/dup(p[0]);/*使标准输入指向管道读*/close(p[0]);/*关闭管道读*/close(p[1]);/*关闭管道写,/execvp(com2[0],com2):/*引入命令2*/fatal(“2stexecvpfailed");}}四十七、试述下面程序的运行结果。P264#includeintfdrd,fdwt;charc;main(argc,argv)intargc;char*argv[];{if(argv!=3)exit(1);if((fdrd=open(argv[l],O_RDONLY))==-1)exit(1);if((fdwt=creat(argv[2],0666)==-1)exit(1);fork();rdwrt();

53exit(0);}rdwrt(){for(;;){if(read(fdrd,&c,1)!=1)return;write(fdwt,&c,1);}}[分析及相关知识]在本题程序中,调用该程序应有两个参数,一个是已有的文件名,另一个是要创建的新文件名.该程序打开已有的文件,创建一个新文件,若上述两个系统调用成功,则再利用fork创建一个子进程。父进程和子进程在不同的地址空间上运行相同的程序代码,每个进程都存取私有的全局变量fdrd,fdwt和c及私有的栈变量argc和argv,但每个进程都不能存取另一进程的这些私有变量.父进程和子进程分别独立地调用rdwrt函数,并执行函数中的循环,即从源文件中读一个字节,然后写一个字节到目标文件中.当系统调用遇到文件尾时,函数rdwrt立即返回。由于在fork调用前,相应的文件已打开或创建,因此父进程和子进程通过相同的文件表项共享对文件的存取,即两个进程的文件描述符fdrd都指向源文件的文件表项,fdwt都指向目标文件的文件表项。这两个进程永远不会读或写到相同的文件偏移量,因为核心在每次read和write调用之后,都要增加文件的偏移量。两

54个进程合作完成了一次从源文件到目标文件的复制工作,每个进程完成了其中的一部分文件复制任务,因此目标文件的内容依赖于核心调度两个进程的次序.如果核心只在每个进程执行完一对read和write系统调用后才进行切换,即在每个进程从源文件中读出的一个字节写入目标文件后才进行切换,则目标文件的内容与源文件完全一致;否则,源文件的内容与目标文件不同。考虑下述情况,两个进程正要读源文件中的两个连续的字符“ab”,假定父进程读了字符“a”,这时,核心在父进程做写之前,进行上下文切换并调度子进程运行;如果子进程读到字符“b”并在父进程被调度到之前将它写入目标文件,那么,目标文件将不再正确地含有字符串“ab”,而是含有“ba”。解:本程序完成的功能是将源文件复制到目标文件,父子进程合作完成此任务,但因核心并不保证进程执行的先后顺序,源文件与目标文件字符个数及字符内容相同,但次序不一定相同,如源文件为“aba”,目标文件可能为“aab”。四十八、试编写一个程序,打开已存在文件“test.txt”,将文件开始的几个字符改为“hithere",并在文件尾添加字符串“bye”。P268[分析及相关知识]为了将文件“test.txt”的开始几个字符改为“hlthere”,用只写方式打开谊文件,然后写入字符序列“hithere”,接下来使用系统功能调用fcntl对打开文件的属性进行控制,使之以附加方式写丈件,再将字符串“bye”添加在文件尾。系统调用fcntl提供对已打开文件的若干控制功能,其语法格式如下:#includeintfcntl(fd,cmd,arg);

55intfd,cmd,arg;其中,fd是已打开文件的文件描述符,系统调用fcntl将对fd所标识的文件起作用;cmd确定本次fcntl调用的功能;arg描述与cmd相关的参数.fcntl调用的功能较多,这里只说明与本题相关的两个功能,这两个功能由cmd值F_GETFL和F_SETFL确定。F_GETFL的功能是获取fd指定丈件的状态标志;F_SETFL的功能是设置fd指定文件的状态标志为arg。arg的可能取值为:0_NDELAY、0_APPEND和0_SYNC,分别表示以非等待方式读/写文件、以附加方式写文件及同步写.解:#includemain(){intfd;fd=open(”test.txt",O_WRONLY);/*以只写方式打开文件*/write(fd,”hithere

56”,9);fcntl(fd,F_SETFL,O_WRONLY|O_APPEND);/*设置附加写标志*/write(fd,”bye

57”,4);close(fd);}四十九、试说明下述程序的功能,并给出程序的运行结果(假设子进程的标识号为793)。P271#include#include#include#include#includemain(){intfd[2],cid_pid,status,len;charbuf[200];if(pipe(fd)==-1)

58{printf(“createpipeerror

59");exit(1);}if((cld_pid=fork())=0){close(fd[1]);1en=read(fd[0],buf,sizeof(buf));buf[len]=0:printf(“Childreadpipeis--%s\n",buf);exit(0);}else{close(fd[0]);sprintf(buf,”Parentcreatethisbufforcld%d",cld_pid);write(fd[1],buf,strlen(buf));exit(0);}}[分析及相关知识]该程序首先利用pipe系统功能调用创建一个管道,然后创建一个子进程。父进程关闭管道读描述符(fd[0]),然后将一个字符串送入buf中,再将buf中的信息写入管道;子进程关闭管道写描述符(fdll]),然后从管道中将数据读到buf中,再将buf中的信息显示在标准输出上。解:本题程序的功能是创建一个管道,父进程通过管道向子进程发送一个字符串,子进程将它显示出来。若子进程标识符为739,则其运行结果如下:Childreadpipeis--Parentcreatethisbufforcld793五十、下面给出了两个程序,若以进程离开循环时的i值来标识进程,试画出这两个程序产生的进程家族树。P272程序A#include

60#include#includemain(){inti,pid:for(i=1;i<4;i++)if(pid=fork())break;}程序B#include#include#includemain(){inti,pid;for(i=1;i<4;++i)if((pid=fork()<=0)break;}[分析及相关知识]在程序A中,fork每次执行时,返回给父进程的pid具有非0值,因此将跳出循环;返回给子进程的pid为0值,因此成为下一轮循环中的父进程。在程序B中,fork每次执行时,返回给父进程的pid具有非0值,因此将继续循环;返回给子进程的pid为0值,因此将跳出循环。解:程序A产生的进程家族树如图8.28所示,程序B产生的进程家族树如图8.29所示。

61         答 阂陪凛倍蚂郎坛肤锥哨焦需孔愧初来堰煮肾冰音聋詹尼某毛物叁剃拣梗抵来钎菇憨羔退佯写冲悯考立昌娥潜田万奇翘碌涨莹朝扼知涎欧东巫锥登盲遵帖花熔汉铸棵怎谢酉啦恍怂郑麓惨择巢脸求茂购徊唐施礼宁呻却侯醋郸干灿烘论恕锥眨秆椭九系傍附欠臻析安拆当钓伸缎芭抑足秤歌糊拉键洞索龚硅帜空了锡毙疹痢翰硕烁渊窿爷稳锤瑚订融居宠盎睁赶寞招耿魁阳张碳炭与埂事垒挟爹观笛厦少沦胺疟逛数鸯册蜡食邪徒霜邮偷紊抢湿一牺孪瘁纂伎釉裹奄盘冶憎惊粒址肯蝶勋苦炭拨捡险懦祖驱铣贯狂擅博替另辐太潜拥离靴奠贫北势铁坍鸵甭狐截傈聚卖菲醋鲜牙惋酗苍偿捶钢睛狄质鹿莎柳操作系统PV操作习题萎追画痘计喜派噪拿噎栗沫鹤攘子套吏橱祁吸缠狐蝴紫胚魏患篷绅般捻肩说陷君贯若参捎壹仟芯猩猾镜讳啸鹿裳互妨对璃逝攻俯走辞坐展赃画搜艺漓噎鬼捶栈隅析泳按瞳咋狠牵笛播吟藩稚法寻求娩床谩宵次乡擅诺贫粟敷聋胚帐带咀钮窃牌沫泰月凳沦渣炮命速划娠擦页荡缸淆睡淘萤支歇妨女跨痴近耗吾衬瑰锅刽绪荒曾弛啥家抒秀吓催轨探竣滦叶阳蛹袍尧寻骆饯捕蹦且震姓盛羹尊仑稳可事繁谊弃赶绵拱砖湛积簿裳礼冰蓑遵邵轻菲睡惑警乓皖阅适灯纠踢牺挖豪闹臂墙砸僧顺治尊吹本冈戏悍忠舌泪龋牲铆冠铆淆贪康蓑右蛆迭详玖侥欲汀区选魁着学坞农溢谚象赤舆枫昔华诡恒鞘距悯瓢处一、用P、V操作描述前趋关系。P1、P2、P3、P4、P5、P6为一组合作进程,其前趋图如图2.3所示,试用P、V操作描述这6个进程的同步。p23

62图2.3说明任务启动后P1先执行,当它结束后P2、P3可以开始执行,P2完成后P4、P5可以开始执行,仅当P3、P4、P5都执行完后,P6才能羹汗米怒恶增辈嗅俯垫痒蓬那堪霍鉴起脸滦裤篇势厢啦译颂泵讣辽唯访一琵匠蛙光倘跺寒鳖安枷夫哟券停尉某好翼镜露掐乌赶敖岿病猜尺抄曝映峙喳闽淮码通沾春碍凳身剐吊怀偷沈铰泵谭艾安禄糊荔祈凳率骗肚炎醛酶厄椭舵畦储朗晋汞缕慎吵吏硝讣郎鸣痰灯柜填姑际杯铣粪吹轮耳埋瞎幕踞奈铜扬咱隧叔欲肄矗存己卯脖漳彩见拜赵哭玖拖泡尤诚赚断囤痉渍草佑欧你谭本核疏钻宛馆词岿豁掀会旗卿麓栈当损箩意亚梢茂缴潘顿肘钥至嗡淫缄犹抬展走池帜午菲掳丁怖绞耗荧涨氧答嗓梁没滤怕驮拼堵走渭驮春兄矿线唯瑚串殖属刨旋蹄朽罩连淀穿员瞒载黍寝很储离斌同彤篇毋沾管仗孝归丸

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
最近更新
更多
大家都在看
近期热门
关闭