【2017年整理】第2章补充习题1(1)

上传人:豆浆 文档编号:2040538 上传时间:2017-07-19 格式:PDF 页数:22 大小:136.09KB
返回 下载 相关 举报
【2017年整理】第2章补充习题1(1)_第1页
第1页 / 共22页
【2017年整理】第2章补充习题1(1)_第2页
第2页 / 共22页
【2017年整理】第2章补充习题1(1)_第3页
第3页 / 共22页
【2017年整理】第2章补充习题1(1)_第4页
第4页 / 共22页
【2017年整理】第2章补充习题1(1)_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《【2017年整理】第2章补充习题1(1)》由会员分享,可在线阅读,更多相关《【2017年整理】第2章补充习题1(1)(22页珍藏版)》请在金锄头文库上搜索。

1、例1:抽烟问题:有一个烟草代理商(Agent)和3个抽烟者(smoker )。每个抽烟者连续不断地制造香烟并吸掉它。但是,制造一支香烟需要三种材料:烟草、烟纸和火柴。三个抽烟者中,一人有烟纸,一人有烟叶,一人有火柴。烟草代理商源源不断地供应这三种材料。他将两种材料一起放在桌上,持有另一种材料的吸烟者即可制造一支香烟并抽掉它。当此抽烟者抽香烟时,他发出一个信号通知烟草代理商,烟草代理商马上给出另外两种材料,如此循环往复。试用信号量同步烟草代理商和3个抽烟者。解:Semaphore smoker3; /初始0,三个抽烟者Semaphore material3; /初始0,三种原料Semaphore

2、 agent; /初始1,供应商Int turn; /初始0,轮到谁Agent:While (1) Wait(agent);Signal(smokerturn);Signal(material(turn+1)%3);Signal(material(turn+2)%3);Turn=(turn+1)%3;Smoker-i:While (1) wait(smokeri);wait(material(i+1)%3);wait(material(i+2)%3);signal(agent);例2;从读卡机上读进n张卡片,然后复制一份,要求复制出来的卡片与读进来的卡片完全一致。这一工作由3个进程get、co

3、py、 put以及两个缓冲区buffer1和buffer2完成。 get进程的功能是把一张卡片信息从读卡机上读进buffer1;进程copy的功能是把buffer1中的信息复制到buffer2;进程 put的功能是取出buffer2中的信息并从行式打印机上打印输出。试用 P、V操作完成 这3个进程间的尽可能并发正确执行的关系(用程序或框图表示),并指明信号量的初值。解答:这3个进程间的关系可用下图来表示:get copy put分析这3个进程之间的关系,可以得知,get和copy进程之间通过buffer1进行合作,这是一种生 产者-消费者问题;同理,进程copy和put之间通过buffer2进

4、行合作,两者之间也是一种生产者-消费者问题。为此,设计互斥信号量mutex1, mutex2来实现对 buffer1和buffer2的互斥访问;为实现get和copy 之间的同步,设置两个信号量semptybuffer1和 sfullbuffer1,分别表示缓冲区buffer1是空的还是满的;为实现co读卡机 buffer1 buffer2 打印机py和put之间的同步,设置两个信号量semptybuffer2 、sfullbuffer2,分别表示缓冲区buffer2是空的还是满的。Var mutex1,mutex2,semptybuffer1,sfullbuffer1,semptybuffe

5、r2,sfullbuffer2:semaphore:=1,1,1,0,1,0;Get:beginRepeat从读卡机读入一张卡片信息;P(semptybuffer1);P(mutex1);将信息放入buffer1;V(sfullbuffer1);V(mutex1);Until false;EndCopy:beginRepeatP(sfullbuffer1);P(mutex1);从buffer1复制信息;V(semptybuffer1);V(mutex1);P(semptybuffer2);P(mutex2);将信息复制放入buffer2;V(sfullbuffer2);V(mutex2);Un

6、til false;End;Put:beginRepeatP(sfullbuffer2);P(mutex2);从buffer2取出信息;V(semptybuffer2);V(mutex2);把信息从打印机输出;Until false;End;例3:在4100m接力赛中,4个运动员之间存在如下关系:运动员1跑到终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运动员1传来的接力棒后才能往前跑,他跑完100m后交棒给运动员3;运动员3也只有接到运动员2传来的接力棒后才能往前跑,他跑完100m后交棒给运动员4;运动员4接棒后跑完全程,试用信号量机制进行描述。分析:在本题中,4个运动员相当于

7、4个进程,他们处于并发运行状态。运动员1跑完100m后发信号给运动员2,运动员2原来处于等待该信号的过程,在接到运动员1发来的信号后他才能开始运行,他在跑完100m后发信号给运动员3;同样,运动员3在接到运动员2发来的信号后才能开始跑,跑完后发信号给运动员4;运动员4接到运动员3发来的信号后跑完全程。解答:根据分析,引入3个信号量S1、 S2、S3,其初始值均为0。4100m接力赛描述如下:var s1,s2,s3:semaphore:=0,0,0;beginparbeginAthlete1:begin Run 100m;V(s1);End;Athlete2:beginP(s1);Run 10

8、0m;V(s2);End;Athlete3:beginP(s2);Run 100m;V(s3);End;Athlete2:beginP(s3);Run 100m;End;ParendEnd例4:嗜睡的理发师问题。一个理发店由一个有N 张沙发的等候室和一个放有一张理发椅的理发室组成。没有顾客要理发时,理发师便去睡觉。当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。试用信号量实现这一同步问题。分析

9、:在本题中,顾客进程和理发师进程之间存在着多种同步关系:(1)只有在理发椅空闲时,顾客才能坐到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发;否则他也必须等待。这种同步关系类似于单缓冲(对应于理发椅)的生产者-消费者问题中的同步关系,故可通过信号量empty和full 来控制。(2)理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成后由理发师唤醒他,这可单独使用一个信号量cut来控制。(3)顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;而理发师则需要等待顾客付费,并在收费后唤醒顾客允许他离开,这可分别通过两个信号量payment和r

10、eceipt来控制。(4)等候室的N张沙发是顾客竞争的资源,故还需为它们设置一个资源信号量sofa。(5)为了控制顾客的人数,使顾客能在所有的沙发都被占用时离开理发店,还必须设置一个整型变量count来对理发店中的顾客计数,该变量将被多个顾客进程互斥地访问并修改,这可通过一个互斥信号量mutex来实现 。解:为解决上述问题,需设置一个整型变量count用来对理发店中的顾客进行计数,并需设置7个信号量,其中:mutex用来实现顾客进程对count变量的互斥访问,其初值为1;sofa是对应于等候室中N 张沙发的资源信号量,其初值为N;empty表示是否有空闲的理发椅,其初值为1;full表示理发椅

11、上是否坐有等待理 发的顾客,其初值为0;cut用来等待理发的完成,其初值为0;payment用来等待付费,其初值为0;receipt用来等待收费,其初值为0。具体的算法描述如下:Var count: integer:=0;Mutex,sofa,empty,full:semaphore:=1,N,1,0;Cut,payment,receipt:semaphore:=0,0,0;BeginParbeginGuest: beginWait(mutex);If (countN) then BeginSignal(mutex);Exit shop;endelsebegincount:=count+1;i

12、f (count1) then /*理发椅上有人*/beginwait(sofa);sit on sofa;wait(empty); /*等待理 发椅空*/get up from sofa;signal(sofa);endelsewait(empty);signal(mutex);sit on the barber-chair;signal(full);wait(cut); /*等待理完*/pay;signal(payment);wait(receipt);get up from the barber-chair;signal(empty);wait(mutex);count:=count-1

13、;signal(mutex);exit shop;endendbarber: beginrepeatwait(full);cut hair;signal(cut);wait(payment);accept payment;signal(receipt);until false;endparendend例5、三个进程P1、P2、P3互斥使用一个包含N(N0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用 getodd()从 该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并

14、counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义。要求用伪代码描述。 解:定义信号量S1控制 P1与P2之间的同步;S2控制P1 与P3之间的同步;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。程序如下:Var s1=0,s2=0,empty=N,mutex=1;ParbeginP1:beginX=produce(); /*生成一个数*/P(empty);/*判断缓冲区是否有空单元*/P(mutex); /*缓冲区是否被占用*/If x%2=0V(s2); /*如果是偶数,向P3发出信号*/elseV(s1

15、); /*如果是奇数,向P2发出信号*/V(mutex); /*使用完缓冲区,释放*/endP2:beginP(s1); /*收到P1发来的信号,已 产生一个奇数 */P(mutex); /*缓冲区是否被占用*/Getodd();Countodd():=coutodd()+1;V(mutex); /*释放缓冲区*/V(empty); /*向P1 发信号,多出一个空单元 */End.P3:beginP(s2); /*收到P1发来的信号,已 产生一个偶数 */P(mutex); /*缓冲区是否被占用*/Geteven();Counteven():=counteven()+1; V(mutex); /* 释放缓冲区*/V(empty); /*向P1 发信号,多出一个空单 元*/End.Parend.例6、在一个盒子里,混装了数量相等的围棋黑白子。现用自动分拣系统把白子和黑子分开,该系统设两个进程P1和P2,P1拣白子,P2拣黑子。规定每个进程每次只拣一子,当一个进程正在拣子时,不允许另一个进程去拣子,当一个进程拣了一个后,必须让另一个进程去拣子。试用P、V操作控制这两个进程正确运行。解:Semaphore sa=1;Semaphore sb=0;PA: PB:While(1) while(1) P(sa);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 经济/贸易/财会 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号