嗜睡的理发师问题Word文档下载推荐.docx

上传人:b****5 文档编号:19937750 上传时间:2023-01-12 格式:DOCX 页数:13 大小:18.64KB
下载 相关 举报
嗜睡的理发师问题Word文档下载推荐.docx_第1页
第1页 / 共13页
嗜睡的理发师问题Word文档下载推荐.docx_第2页
第2页 / 共13页
嗜睡的理发师问题Word文档下载推荐.docx_第3页
第3页 / 共13页
嗜睡的理发师问题Word文档下载推荐.docx_第4页
第4页 / 共13页
嗜睡的理发师问题Word文档下载推荐.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

嗜睡的理发师问题Word文档下载推荐.docx

《嗜睡的理发师问题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《嗜睡的理发师问题Word文档下载推荐.docx(13页珍藏版)》请在冰豆网上搜索。

嗜睡的理发师问题Word文档下载推荐.docx

signal(mutex);

//离开临界区

Cut_hair();

}

Customer(inti)

if(waiting<

CHAIRS)//看看有没有空椅子

waiting=waiting+1;

//等候顾客数加1

signal(customers);

//必要的话唤醒理发师

//开放临界区

wait(barbers);

//无理发师,顾客等待

get_haircut();

//一个顾客坐下等理发

else

//人满了,走吧

分析:

本题中,顾客进程和理发师进程之间存在着多种同步关系:

1.只有在理发椅空闲时,顾客才能做到理发椅上等待理发师理发,否则顾客便必须等待;

只有当理发椅上有顾客时,理发师才可以开始理发,否则他也必须等待;

这种同步关系类似于单缓冲的生产者-消费者问题中的同步关系,故可通过信号量empty和full来控制;

2.理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成后理发师唤醒他,这可单独使用一个信号量cut来控制;

3.顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;

而理发师则需等待顾客付费,并在收费后唤醒顾客以允许他离开,这可分别通过两个信号量payment和receipt来控制。

4.等候室中的N帐沙发是顾客竟争的资源,故还需为它们设置了一个资源信号量sofa

5.为了控制顾客的人数,使顾客能自所有的沙发都被占用时离开理发店,还必须设置一个整型变量count来对理发店重的顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,这可通过一个互斥信号量mutext来实现。

答:

为解决上述问题,需设置一个整型变量count用来对理发店重的顾客进行计数,并需设置7个信号量,其中:

mutex用来实现顾客进程对count变量的恶互斥访问,其初值为1;

sofa是对应于等候室中N张沙发的资源信号量,其初值为N;

empty表示是否有空闲的理发椅,其初值为1;

full表示理发椅上是否有等待理发的顾客,其初值为0;

cut用来等待理发的完成,其初值为0;

payment表示用来等待付费,其初值为0;

receipt用来等待收费,其初值为0。

具体算法描述如下:

Intcout=0;

Semaphoremutex=1,sofa=N,empty=1,full=0,cut=0,payment=0,receipt=0;

processguesti()顾客i

{wait(mutex);

//count既用于判断,也要修改,所以为临界资源,用mutex管理互斥,但由于是分支结构,所以要在每个分支结构中注意离开count的临界区时使用signal释放临界资源

if(count>

N)//沙发中已经坐满客人N个和正在理发的1位,没有沙发,客人离开理发店

{signal(mutex);

exitshop;

{count=count+1;

1)//count>

1,意味着原来理发店里有客人,所以不能坐理发椅,需要坐到沙发上等待

{signal(mutex);

wait(sofa);

//申请沙发,肯定能得到

sitonsofa;

wait(empty);

//申请理发椅,等不到阻塞,得到,则从沙发上站起,准备坐到理发椅上

getupformsofa;

signal(sofa);

//归还沙发

//count==1,意味着这个店里只有这一个顾客,他不必要申请沙发,直接申请理发椅即可

sitonthebaber_chair;

signal(full);

//若理发师阻塞,则唤醒理发师,若未阻塞,则将full由0增1,理发师申请理发时即可通过

wait(cut);

//测试理发是否完成,没有则阻塞

pay;

signal(payment);

//若理发师阻塞,则唤醒理发师告知其已经付费,若未阻塞,则将paymentl由0增1,理发师申请理要求付费时即可通过

wait(receipt);

////测试理发师收费是否完成,没有则阻塞

getupformthebaber_chair;

//理发师收费完成,顾客离开理发椅

signal(empty);

//释放理发椅

//对count临界资源操作,用mutex完成互斥

count=count-1;

processbarber()

{while

(1)

{wait(full);

//测试理发椅上是否有顾客,无则阻塞

cuthair;

signal(cut);

//告知顾客理发完成

wait(payment);

//测试顾客是否付费

acceptpament;

signal(receipt);

//告知顾客收费完毕

main()

{cobegin

{guesti();

Barber();

5、设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售;

销售者每次循环从仓库中取出一个产品进行销售。

如果不允许同时入库,也不允许边入库边出库;

而且要求生产和消费A产品和B产品的件数都满足一下关系:

-n≤A的件数-B的件数≤m,其中n、m是正整数。

本题中存在着以下的同步和互斥关系:

生产者A、B和消费者之间不能同时将产品入库和出库,故仓库是一个临界资源;

两个生产者之间必须进行同步,当生产的A、B产品的件数之差大于等于m时,生产者A必须等待;

小于等于-n时,生产者B必须等待;

生产者和销售者之间也必须进行同步,只有当生产者生产出产品并入库后,销售者才能进行销售;

而且由于销售的产品件数必须满足关系-n≤A的件数-B的件数≤m,因此当销售的A、B产品件数之差大于等于m而仓库中已无B产品时,或者销售的A、B产品的件数之差小于等于-n而仓库中已无A产品时,销售者C必须等待

生产的A、B产品必须满足:

-n≤A的件数-B的件数≤m,如例题4中,同样的方法管理,分别使用了信号量SAB和SBA;

仓库的管理只要求出入库互斥,由于仓库无限大入库只好操作互斥就可以完成,出库要考虑有无产品,SA对应于仓库中的A产品量,SB对应于仓库中的B产品量;

销售要满足:

-n≤A的件数-B的件数≤m,用difference表示A的件数-B的件数,即difference=A的件数-B的件数;

difference==-n的时候,不能取产品B,只能取A;

difference==m的时候,不能取产品A,只能取B;

-n<

difference<

m,即可以取产品A也可以取产品B;

为了互斥地入库和出库,蓄为仓库设置一初值为1的互斥信号量mutex;

为了使生产的产品件数满足-n≤A的件数-B的件数≤m,须设置两个同步的信号量,其中SAB表示当前允许A生产的产品数量,其初值为m,SBA表示当前允许B生产的产品数量,其初值为n;

另外,还需设置一个整数difference表示所销售的A、B产品数量之差,而为了同步生产者和销售者并使销售的A、B产品的件数-n≤A的件数-B的件数≤m,还需要设置三个资源信号量,其中s对应于仓库中的总的产品量,SA对应于仓库中的A产品量,SB对应于仓库中的B产品量,它们的初值都为0.

SemaphoreSAB=m,SBA=n,S=0,SA=0,SB=0,mutex=1;

processA()

{//生产产品,-n≤A的件数-B的件数≤m,方法同第4题

wait(SAB);

ProduceaproductA;

signal(SBA);

//入库操作,满足出入库操作互斥即可

addtheproductAtothestorehouse;

signal(SA);

//入库产品A一件,所以给SA增值

signal((S);

//入库产品一件,所以给S增值,S是仓库中全部产品的数量

processB()

wait(SBA);

ProduceaproductB;

signal(SAB);

signal(SB);

{wait(S);

//首先检查有无产品,无产品阻塞,有产品,下面操作将会取走一件产品,所以S减1

if(difference<

=-n)

{wait(SA);

//difference<

=-n时只能取A产品一件,无A产品则需阻塞

//出库操作,满足出入库操作互斥

takeaproductAfromstorehouse;

difference++;

//取A产品一件,difference++

elseif(difference>

=m)

{wait(SB);

//difference>

=m时只能取B产品一件,无B产品则需阻塞

takeaproductBfromstorehouse;

difference--;

//取B产品一件,difference--

{//-n<

m,即可以取产品A也可以取产品B,随意取一件产品出来,之后再根据取得产品是A还是B进行处理

takeaproductA或Bfromstorehouse;

if(product_type==A)

{//取的是产品A,则信号量SA减1,这里不可能发生没有A产品,进程C需要阻塞的情况

wait(SA);

//取A产品一件,difference++

{//取的是产品B,则信号量SB减1,这里不可能发生没有B产品,进程C需要阻塞的情况

wait(SB);

//取B产品一件,difference--

Selltheproduct;

main()

cobegin{

A();

B();

C();

6、考虑三个吸烟者进程和一个经销商进程的系统。

每个吸烟者连续不断地做烟卷并抽他做好的烟卷,做一支烟卷需要烟草、纸和火柴三种原料。

这三个吸烟者分别掌握有烟草、纸和火柴。

经销商源源不断地提供上述三种原料,但他只将其中的两种原料放在桌上,具有另一种原料的吸烟者就可以做烟卷并抽烟,且在做完后给经销商发信号,然后经销商再拿出两种原料放在桌上,如此反复。

试设计一个同步算法来描述他们的活动。

SemaphoreSA=SB=SC=0,SD=1;

i:

integer;

processsmokerA()

{while

(1)

制烟;

signal(SD);

吸烟;

processsmokerB()

processsmokerC()

{wait(SC);

Processprovider()

{wait(SD);

i=random

(2);

switch(i)

{case'

0'

:

signal(SA);

case'

1'

signal(SB);

2'

signal(SC);

somkerA();

somkerB();

somkerC();

provider();

5、现有四个进程R1、R2、W1、W2,它们共享可以存放一个数的缓冲器B。

进程R1每次把来自键盘的一个数存入缓冲器B中,供进程W1打印输出;

进程R2每次从磁盘上读一个数存放到缓冲器B中,供进程W2打印输出。

为防止数据的丢失和重复打印,问怎样用信号量操作来协调这四个进程的并发执行。

semaphoreS=1,S1=S2=0;

bufferB;

processR1()

{intx;

while

(1)

{接收来自键盘的数;

x=接收的数;

wait(S);

B=x;

signal(S1);

processR2()

{inty;

{从磁盘上读一个数;

y=接收的数;

B=y;

signal(S2);

processW1()

{intk;

{wait(Sl);

k=B;

signal(S);

打印k中数;

processW2()

{intj;

{wait(S2);

j=B;

打印j中数;

R1();

R2();

W1();

W2();

6、a,b两点之间是一段东西向的单行车道,现要设计一个自动管理系统,管理规则如下:

当ab之间有车辆在行驶时同方向的车可以同时驶入ab段,但另一方向的车必须在ab段外等待;

当ab之间无车辆在行驶时,到达a点(或b点)的车辆可以进入ab段,但不能从a点和b点同时驶入,当某方向在ab段行驶的车辆驶出了ab段且暂无车辆进入ab段时,应让另一方向等待的车辆进入ab段行驶。

请用信号量机制为工具,对ab段实现正确管理以保证行驶安全。

SemaphoreS1=1,S2=1,Sab=1;

intab=ba=0;

processPab()

wait(S1);

if(ab==0)

wait(Sab);

ab=ab+1;

车辆从a点驶向b点;

ab=ab-1;

signal(Sab);

processPba()

wait(S2);

if(ba==0)

ba=ba+1;

车辆从b点驶向a点;

ba=ba-1;

Pab();

Pba();

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 思想汇报心得体会

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1