第2章补充习题1(1)(2)

2020-04-14 00:24

离开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一张空沙发等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后才能离开理发店。试用信号量实现这一同步问题。

分析:在本题中,顾客进程和理发师进程之间存在着多种同步关系: (1)只有在理发椅空闲时,顾客才能坐到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发;否则他也必须等待。这种同步关系类似于单缓冲(对应于理发椅)的生产者-消费者问题中的同步关系,故可通过信号量empty和full来控制。

(2)理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成后由理发师唤醒他,这可单独使用一个信号量cut来控制。 (3)顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;而理发师则需要等待顾客付费,并在收费后唤醒顾客允许他离开,这可分别通过两个信号量payment和receipt来控制。

(4)等候室的N张沙发是顾客竞争的资源,故还需为它们设置一个资源信号量sofa。

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

解:为解决上述问题,需设置一个整型变量count用来对理发店中的

顾客进行计数,并需设置7个信号量,其中:mutex用来实现顾客进程对count变量的互斥访问,其初值为1;sofa是对应于等候室中N张沙发的资源信号量,其初值为N;empty表示是否有空闲的理发椅,其初值为1;full表示理发椅上是否坐有等待理发的顾客,其初值为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; Begin

Parbegin

Guest: begin

Wait(mutex);

If (count>N) then Begin

Signal(mutex); Exit shop; end else begin

count:=count+1;

if (count>1) then /*理发椅上有人*/ begin

wait(sofa); sit on sofa;

wait(empty); /*等待理发椅空*/ get up from sofa; signal(sofa); end

else

wait(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; signal(mutex); exit shop; end end

barber: begin repeat

wait(full); cut hair; signal(cut); wait(payment); accept payment; signal(receipt);

until false; end parend end

例5、三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并counteven()统计偶数个数。请用信号量机制实现这三个进程的同步与

互斥活动,并说明所定义信号量的含义。要求用伪代码描述。 解:定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。程序如下:

Var s1=0,s2=0,empty=N,mutex=1; Parbegin P1:begin

X=produce(); /*生成一个数*/

P(empty);/*判断缓冲区是否有空单元*/ P(mutex); /*缓冲区是否被占用*/ If x%2==0

V(s2); /*如果是偶数,向P3发出信号*/ else

V(s1); /*如果是奇数,向P2发出信号*/ V(mutex); /*使用完缓冲区,释放*/

end P2:begin

P(s1); /*收到P1发来的信号,已产生一个奇数*/ P(mutex); /*缓冲区是否被占用*/ Getodd();

Countodd():=coutodd()+1; V(mutex); /*释放缓冲区*/

V(empty); /*向P1发信号,多出一个空单元*/ End. P3:begin

P(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); P(sb); 拣黑子; 拣白子; V(sb); V(sa); } }


第2章补充习题1(1)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于石河子大学2011-2012学年学生社团登记注册的通知(修改后)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: