嗜睡的理发师问题.doc_第1页
嗜睡的理发师问题.doc_第2页
嗜睡的理发师问题.doc_第3页
嗜睡的理发师问题.doc_第4页
嗜睡的理发师问题.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嗜睡的理发师问题:一个理发店由一个有N张沙发的等候室和一个放有一张理发椅的理发室组成。没有顾客要理发时,理发师便去睡觉。当一个顾客走进理发店时,如果所有的沙发都已经占用,他便离开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发坐下等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店,试用信号量实现这一同步问题。int waiting ;/等候理发的顾客数int CHAIRSr;/为顾客准备的椅子数semaphore Customers,babers,mutex;Customers=0;barbers=0;waiting=0;mutex=1;barber( )/理发师进程while(TRUE) wait(customers); /若无顾客,理发师睡眠wait(mutex);/进程互斥waiting=waiting-1;/等待顾客数少一signal(barbers);/理发师去为一个顾客服务signal(mutex);/离开临界区Cut_hair();Customer (int i)wait(mutex);/进程互斥if(waitingN)/ 沙发中已经坐满客人N个和正在理发的1位,没有沙发,客人离开理发店signal(mutex);exit shop; else count=count+1; if(count1) /count1,意味着原来理发店里有客人,所以不能坐理发椅,需要坐到沙发上等待 signal(mutex);wait(sofa); /申请沙发,肯定能得到 sit on sofa; wait(empty); /申请理发椅,等不到阻塞,得到,则从沙发上站起,准备坐到理发椅上 get up form sofa; signal(sofa); /归还沙发 else signal(mutex); wait(empty); /count=1,意味着这个店里只有这一个顾客,他不必要申请沙发,直接申请理发椅即可 sit on the baber_chair; signal(full); /若理发师阻塞,则唤醒理发师,若未阻塞,则将full由0增1,理发师申请理发时即可通过 wait(cut); /测试理发是否完成,没有则阻塞 pay; signal(payment); /若理发师阻塞,则唤醒理发师告知其已经付费,若未阻塞,则将paymentl由0增1,理发师申请理要求付费时即可通过 wait(receipt); / /测试理发师收费是否完成,没有则阻塞 get up form the baber_chair; /理发师收费完成,顾客离开理发椅 signal(empty); /释放理发椅 wait(mutex); /对count 临界资源操作,用mutex完成互斥 count=count-1; signal(mutex); exit shop; process barber( ) while(1) wait(full); /测试理发椅上是否有顾客,无则阻塞 cut hair; signal(cut); /告知顾客理发完成 wait(payment); /测试顾客是否付费 accept pament; signal(receipt); /告知顾客收费完毕 main( ) cobegin guesti(); Barber(); 5、设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售;销售者每次循环从仓库中取出一个产品进行销售。如果不允许同时入库,也不允许边入库边出库;而且要求生产和消费A产品和B产品的件数都满足一下关系:-nA的件数B的件数m,其中n、m是正整数。分析:本题中存在着以下的同步和互斥关系:生产者A、B和消费者之间不能同时将产品入库和出库,故仓库是一个临界资源;两个生产者之间必须进行同步,当生产的A、B产品的件数之差大于等于m时,生产者A必须等待;小于等于-n时,生产者B必须等待;生产者和销售者之间也必须进行同步,只有当生产者生产出产品并入库后,销售者才能进行销售;而且由于销售的产品件数必须满足关系-nA的件数B的件数m,因此当销售的A、B产品件数之差大于等于m而仓库中已无B产品时,或者销售的A、B产品的件数之差小于等于-n而仓库中已无A产品时,销售者C必须等待生产的A、B产品必须满足:-nA的件数B的件数m,如例题4中,同样的方法管理,分别使用了信号量SAB和SBA;仓库的管理只要求出入库互斥,由于仓库无限大入库只好操作互斥就可以完成,出库要考虑有无产品,SA对应于仓库中的A产品量,SB对应于仓库中的B产品量;销售要满足:-nA的件数B的件数m,用difference表示A的件数B的件数,即difference= A的件数B的件数;difference=-n的时候,不能取产品B,只能取A;difference=m的时候,不能取产品A,只能取B;-ndifferencem,即可以取产品A也可以取产品B;答:为了互斥地入库和出库,蓄为仓库设置一初值为1的互斥信号量mutex;为了使生产的产品件数满足-nA的件数B的件数m,须设置两个同步的信号量,其中SAB表示当前允许A生产的产品数量,其初值为m,SBA表示当前允许B生产的产品数量,其初值为n;另外,还需设置一个整数difference表示所销售的A、B产品数量之差,而为了同步生产者和销售者并使销售的A、B产品的件数-nA的件数B的件数m,还需要设置三个资源信号量,其中s对应于仓库中的总的产品量,SA对应于仓库中的A产品量,SB对应于仓库中的B产品量,它们的初值都为0.Semaphore SAB=m,SBA=n,S=0,SA=0,SB=0,mutex=1;process A( ) while(1)/生产产品,-nA的件数B的件数m,方法同第4题wait(SAB);Produce a product A;signal(SBA);/入库操作,满足出入库操作互斥即可wait(mutex);add the product A to the storehouse;signal(mutex);signal(SA); /入库产品A一件,所以给SA增值signal(S); /入库产品一件,所以给S增值,S是仓库中全部产品的数量 process B( ) while(1)/生产产品,-nA的件数B的件数m,方法同第4题wait(SBA);Produce a product B;signal(SAB);/入库操作,满足出入库操作互斥即可wait(mutex);add the product A to the storehouse;signal(mutex);signal(SB); /入库产品A一件,所以给SA增值signal(S); /入库产品一件,所以给S增值,S是仓库中全部产品的数量 process B( ) while(1)wait(S); /首先检查有无产品,无产品阻塞,有产品,下面操作将会取走一件产品,所以S减1 if(difference=-n) wait(SA); / difference=m) wait(SB); / difference=m时只能取B产品一件,无B产品则需阻塞 /出库操作,满足出入库操作互斥wait(mutex); take a product B from storehouse; signal(mutex); difference-; /取B产品一件,difference- else /-ndifferencem,即可以取产品A也可以取产品B,随意取一件产品出来,之后再根据取得产品是A还是B进行处理 /出库操作,满足出入库操作互斥wait(mutex); take a product A 或B from storehouse; signal(mutex); if(product_type=A) /取的是产品A,则信号量SA减1,这里不可能发生没有A产品,进程C需要阻塞的情况wait(SA); difference+;/取A产品一件,difference+ else /取的是产品B,则信号量SB减1,这里不可能发生没有B产品,进程C需要阻塞的情况wait(SB); difference-;/取B产品一件,difference- Sell the product; main()cobeginA();B();C();6、考虑三个吸烟者进程和一个经销商进程的系统。每个吸烟者连续不断地做烟卷并抽他做好的烟卷,做一支烟卷需要烟草、纸和火柴三种原料。这三个吸烟者分别掌握有烟草、纸和火柴。经销商源源不断地提供上述三种原料,但他只将其中的两种原料放在桌上,具有另一种原料的吸烟者就可以做烟卷并抽烟,且在做完后给经销商发信号,然后经销商再拿出两种原料放在桌上,如此反复。试设计一个同步算法来描述他们的活动。Semaphore SA=SB=SC=0,SD=1;i:integer;process smokerA()while (1)wait(SA);制烟;signal(SD);吸烟; process smokerB()while (1)wait(SB);制烟;signal(SD);吸烟; process smokerC()while (1)wait(SC);制烟;signal(SD);吸烟; Process provider( ) while(1) wait(SD); i=random(2);switch(i)case0: signal(SA);case1: signal (SB);case2: signal (SC);main()cobeginsomkerA();somkerB();somkerC();provider();5、现有四个进程R1、R2、W1、W2,它们共享可以存放一个数的缓冲器B。进程R1每次把来自键盘的一个数存入缓冲器B中,供进程W1打印输出;进程R2每次从磁盘上读一个数存放到缓冲器B中,供进程W2打印输出。为防止数据的丢失和重复打印,问怎样用信号量操作来协调这四个进程的并发执行。semaphore S=1,S1=S2=0;buffer B;process R1()int x;while(1)接收来自键盘的数;x=接收的数;wait(S);B=x;signal(S1); process R2()int y;while(1) 从磁盘上读一个数;y=接收的数;wait(S);B=y;signal(S2); process W1()int k;while(1) wait(Sl);k=B;signal(S);打印k中数; process W2()int j;while(1)wait(S2);j=B;signal(S);打印j中数; main() cobegin R1(); R2(); W1(); W2();6、a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待;当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入,当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。请用信号量机制为工具,对ab段实现正确管理以保证行驶安全。Semaphore S1=1,S2=1,Sab=1; int ab=ba=0; process Pab ()while(1) wait(S1);if(ab=0)wa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论