操作系统-第二章部分答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

26.假定有如下独木桥问题:过桥时,同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。试用信号量机制解决。答:(1)将独木桥的两个方向分别标记为A和B。用整型变量countA和countB分别表示A、B方向上已在独木桥上的行人数,初值都设置为0。需要设置三个初值都为1的互斥信号量:MA用来实现对countA的互斥访问,MB用来实现对countB的互斥访问,mutex用来实现两个方向的行人对独木桥的互斥使用。(2)以下使用信号量机制对A方向上的行人过桥和B方向上的行人过桥的算法进行描述:intcountA,countB;countA=0;countB=0;SemaphoreMA,MB,mutex;//定义了三个互斥信号量MA.value=1;MB.value=1;mutex.value=1;cobeginprocessA_direction_cross_bridge_person//A方向上过独木桥的行人进程{P(MA);//实现对临界资源countA的互斥访问//当A方向上没有行人过独木桥时,这时有可能存在B方向上的行人在过独木桥。if(countA==0)P(mutex);//如果当前独木桥正在被使用,说明B方向上的行人正在过桥,则A方向上的行人必须等待。countA=countA+1;//当B方向上没有行人过桥时,则A方向上的行人可以过独木桥。因此A方向上已在独木桥上的行人数增加1个V(MA);//退出临界区过桥;//A方向上的行人通过独木桥P(MA);//实现对临界资源countA的互斥访问countA=countA-1;//当A方向上的行人已经通过了独木桥时,则A方向上在独木桥上的行人数需要减少1个if(countA==0)//如果A方向上在独木桥上的行人数减少到0,则V(mutex);//需要释放独木桥临界资源,唤醒第一个由于在等待独木桥而处于等待状态的B方向上过独木桥的行人进程(如果此进程存在)V(MA);//退出临界区}processB_direction_cross_bridge_person//B方向上过独木桥的行人进程{P(MB);//实现对临界资源countB的互斥访问//当B方向上没有行人过独木桥时,这时有可能存在A方向上的行人在过独木桥。if(countB==0)P(mutex);//如果当前独木桥正在被使用,说明A方向上的行人正在过桥,则B方向上的行人必须等待。countB=countB+1;//当A方向上没有行人过桥时,则B方向上的行人可以过独木桥。因此B方向上已在独木桥上的行人数增加1个V(MB);//退出临界区过桥;//B方向上的行人通过独木桥P(MB);//实现对临界资源countB的互斥访问countB=countB-1;//当B方向上的行人已经通过了独木桥时,则B方向上在独木桥上的行人数需要减少1个if(countB==0)//如果B方向上在独木桥上的行人数减少到0,则V(mutex);//需要释放独木桥临界资源,唤醒第一个由于在等待独木桥而处于等待状态的A方向上过独木桥的行人进程(如果此进程存在)V(MB);//退出临界区}coend27.有7个并发执行的进程Pi(i=1,2,…,7),若希望它们按照如下图所示的次序执行,试写出进程并发执行的算法。SemaphoreS[8];//定义一个大小等于8的结构型信号量数组for(inti=0;i8;i++)S[i].Value=0;processPP(){cobegin//伪代码cobegin和coend表示夹在它们之间的语句可以并发执行{P1;V(S[1]);}{P2;V(S[0]);}{P(S[0]);P(S[1]);P3;V(S[2]);V(S[3]);V(S[4]);}{P(S[2]);P4;V(S[5]);}{P(S[4]);P5;V(S[6]);}{P(S[5]);P(S[3]);P6;V(S[7]);}{P(S[7]);P(S[6]);P7;}coend}29.在公共汽车上,司机的活动描述为:启动汽车、正常行车、到站停车;售票员的活动描述为:关车门、售票、开车门;试写出司机与售票员之间的同步算法。答:在汽车行驶过程中,司机活动与售票员活动之间的同步关系为:售票员关车门后,向司机发开车信号,司机接到开车信号后启动汽车,在汽车正常行驶过程中售票员售票,到站时司机停车,售票员在车停后开车门让乘客上下车。因此司机启动汽车的动作必须与售票员关车门的动作取得同步,而售票员开车门的动作也必须与司机到站停车的动作取得同步。在本题中,应设置两个信号量S1和S2。S1表示是否允许司机启动汽车(或表示售票员是否已经关好车门),其初值为0;S2表示是否允许售票员开门(或表示司机是否已经到站停车了),其初值为0.S[0]S[1]S[2]S[3]S[4]S[5]S[6]S[7]P2P3P4P6P7P5P1采用信号量机制描述司机与售票员之间的同步算法如下:SemaphoreS1,S2;//首先定义两个信号量S1和S2S1.value=0;S2.value=0;cobeginprocessdriver()processconductor(){{while(1)while(1){{P(S1);关车门;启动汽车;V(S1);正常行车;售票;到站停车;P(S2);V(S2);开车门;}上下乘客;}}}coend我们来分析这个过程,首先将信号量S1和S2的初值都设为0.然后进行以下分析:1.P(S1):S1.value=S1.value-1=-10,那么司机进程就自己阻塞起来,等待售票员进程,售票员关车门。2.V(S1):S1.value=S1.value+1=0=0,唤醒司机进程,那么司机就开始启动汽车、正常行车;在此期间,售票员也可以同时进行售票。3.P(S2):S2.value=S2.value-1=-10,那么售票员在售完票后,售票员进程就会自己阻塞起来,等待司机进程。这样就能避免当司机还没到站停车时,售票员就已经将车门打开了。而这是不允许的。4.V(S2):S2.value=S2.value+1=0=0,司机到站停车之后,就唤醒售票员进程,那么售票员就开启车门让乘客上下车。那么这个进程就完成了。30.一个阅览室共有100个座位,用一张表来管理,每个表目记录座位号和读者姓名。读者进入时要先在表上登记,离开时要注销登记。试写出读者“进入”和“注销”之间的同步算法。答:读者的动作有两个,一是填表进入阅览室读书,这时要考虑阅览室里是否有座位;二是读者阅读完毕,需要注销登记再离开阅览室,这时的操作要考虑阅览室里是否有读者存在。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。因此,设置算法所涉及的三个信号量:empty资源信号量——表示阅览室里的空座位的数目,初值为100;full资源信号量——表示阅览室里有人的座位的数目(或表示阅览室里的读者的数目),初值为0;mutex互斥信号量——表示对登记表这个临界资源的互斥访问,初值设为1。使用信号量机制对读者“进入”阅览室和“注销”登记之间的同步算法描述如下:Semaphoreempty,full,mutex;//首先定义两个资源信号量empty、full和一个互斥信号量mutexempty.value=100;full.value=0;mutex.value=1;cobeginprocessgetin()//读者“进入”阅览室的进程{while(1){P(empty);//没有座位则离开P(mutex);//进入临界区填写登记表;进入阅览室读书;V(mutex);//离开临界区V(full);//释放一个读者资源}}processgetout()//读者“注销”登记、离开阅览室的进程{while(1){P(full);//阅览室是否有人在读书(是否存在有人的座位)P(mutex);//进入临界区注销登记;离开阅览室;V(mutex);//离开临界区V(empty);//释放一个座位资源}}coend32.假定有3个进程R、W1、W2共享一个缓冲区B,B中每次只能存放一个整数。进程R从输入设备读入一个数进缓冲区B。若读入的是奇数,则由进程W1取出打印;若读入的是偶数,则由进程W2取出打印。规定不能重复从B中取数打印。试写出同步算法。答:需要设置3个信号量:(1)信号量empty用于表示进程R可向缓冲区B中读入的整数个数,初值为1,表示进程R能读入一个整数到缓冲区B中。(2)信号量SW1的初值为0,表示开始时缓冲区B中没有奇数可供进程W1读取。SW1控制R与W1之间的同步。(3)信号量SW2的初值为0,表示开始时缓冲区B中没有偶数可供进程W2读取。SW2控制R与W2之间的同步。使用信号量机制对这三个进程的同步算法描述如下:Semaphoreempty,SW1,SW2;//首先定义3个信号量empty.value=1;SW1.value=0;SW2.value=0;cobeginprocessR(){intx;while(1){从输入设备上读一个整数到x;P(empty);//判断进程R能否向缓冲区B中读入一个整数。如果不可以,则R进程阻塞起来等待。否则,继续向下执行。B=x;//把读入到变量x中的整数赋值给缓冲区Bif(x%2==1)V(SW1);//如果读入的是奇数,则向进程W1发出信号elseV(SW2);//如果读入的是偶数,则向进程W2发出信号}}processW1(){inty;while(1){P(SW1);//收到R发过来的信号,已产生一个奇数y=B;//取出缓冲区B中的奇数到变量y中打印y中的数;V(empty);//向R发出信号,使进程R又可以向缓冲区B读入一个整数}}processW2(){intz;while(1){P(SW2);//收到进程R发过来的信号,已产生一个偶数z=B;//取出缓冲区B中的偶数到变量z中打印z中的数;V(empty);//向R发出信号,使进程R又可以向缓冲区B读入一个整数}}coend

1 / 5
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功