第2章补充习题1(1)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
掉它。当此抽烟者抽香烟时,他发出一个信号通知烟草代理商,烟草
代理商马上给出另外两种材料,如此循环往复。试用信号量同步烟草
代理商和3个抽烟者。
解:Semaphore smoker[3]; //初始0,三个抽烟者
Semaphore material[3]; //初始0,三种原料
Semaphore agent; //初始1,供应商
例1:抽烟问题:有一个烟草代理商(Agent)和3个抽烟者(smoker)。
每个抽烟者连续不断地制造香烟并吸掉它。但是,制造一支香烟需要
三种材料:烟草、烟纸和火柴。三个抽烟者中,一人有烟纸,一人有烟
叶,一人有火柴。烟草代理商源源不断地供应这三种材料。他将两种
材料一起放在桌上,持有另一种材料的吸烟者即可制造一支香烟并抽
until false;
end
parend
end
例5、三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。
P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元
中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计
奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并counteven
用程序或框图表示),并指明信号量的初值。
解答:这3个进程间的关系可用下图来表示:
get
读卡机
copy
put
buffer1
buffer2
打印机
分析这3个进程之间的关系,可以得知,get和copy进程之间通过b uffer1进行合作,这是一种生产者消费者问题;同理,进程copy和put之间通过buffer2进行合作,两者之 间也是一种生产者-消费者问题。
Int turn;
//初始0,轮到谁
Agent:
While (1) {
Wait(agent);
Signal(smoker[turn]);
Signal(material[(turn+1)%3]);
Signal(material[(turn+2)%3]);
Turn=(turn+1)%3;
}
Smoker-i:
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);
V(mutex); /* 释放缓冲区*/ V(empty); /*向P1发信号,多出一个空单元*/ End. Parend.
例6、在一个盒子里,混装了数量相等的围棋黑白子。现用自动分拣系
统把白子和黑子分开,该系统设两个进程P1和P2,P1拣白子,P2拣黑
子。规定每个进程每次只拣一子,当一个进程正在拣子时,不允许另
End Copy:begin
Repeat P(sfullbuffer1); P(mutex1); 从buffer1复制信息; V(semptybuffer1); V(mutex1); P(semptybuffer2); P(mutex2); 将信息复制放入buffer2; V(sfullbuffer2); V(mutex2);
wait(muBiblioteka Baiduex);
count:=count-1;
signal(mutex);
exit shop;
end
end
barber: begin
repeat
wait(full);
cut hair;
signal(cut);
wait(payment);
accept payment;
signal(receipt);
别表示缓冲区buffer2是空的还是满的。
Var mutex1,mutex2,semptybuffer1,sfullbuffer1,semptybuffer2 ,sfullbuffer2:semaphore:=1,1,1,0,1,0;
Get:begin Repeat 从读卡机读入一张卡片信息; P(semptybuffer1); P(mutex1); 将信息放入buffer1; V(sfullbuffer1); V(mutex1); Until false;
两个缓冲区buffer1和buffer2完成。get进程的功能是把一张卡片信息
从读卡机上读进buffer1;进程copy的功能是把buffer1中的信息复制到
buffer2;进程put的功能是取出buffer2中的信息并从行式打印机上打印
输出。试用P、V操作完成这3个进程间的尽可能并发正确执行的关系(
()统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动
,并说明所定义信号量的含义。要求用伪代码描述。
解:定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步
;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用
缓冲区。程序如下:
Var s1=0,s2=0,empty=N,mutex=1; Parbegin P1:begin
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
Until false; End; Put:begin Repeat
P(sfullbuffer2); P(mutex2);
从buffer2取出信息; V(semptybuffer2); V(mutex2); 把信息从打印机输出; Until false; End;
例3:在4×100m接力赛中,4个运动员之间存在如下关系:运动员1跑到 终点把接力棒交给运动员2;运动员2一开始处于等待状态,在接到运 动员1传来的接力棒后才能往前跑,他跑完100m后交棒给运动员3;运 动员3也只有接到运动员2传来的接力棒后才能往前跑,他跑完100m 后交棒给运动员4;运动员4接棒后跑完全程,试用信号量机制进行描 述。 分析:在本题中,4个运动员相当于4个进程,他们处于并发运行状态。 运动员1跑完100m后发信号给运动员2,运动员2原来处于等待该信号 的过程,在接到运动员1发来的信号后他才能开始运行,他在跑完100 m后发信号给运动员3;同样,运动员3在接到运动员2发来的信号后才 能开始跑,跑完后发信号给运动员4;运动员4接到运动员3发来的信号 后跑完全程。 解答:根据分析,引入3个信号量S1、S2、S3,其初始值均为0。4×100m 接力赛描述如下: var s1,s2,s3:semaphore:=0,0,0; begin parbegin
Athlete1:begin
Run 100m; V(s1); End; Athlete2:begin P(s1); Run 100m; V(s2); End; Athlete3:begin P(s2); Run 100m; V(s3); End; Athlete2:begin P(s3); Run 100m; End; Parend End 例4:嗜睡的理发师问题。一个理发店由一个有N张沙发的等候室和一 个放有一张理发椅的理发室组成。没有顾客要理发时,理发师便去睡 觉。当一个顾客走进理发店时,如果所有的沙发都已被占用,他便离
X=produce(); /*生成一个数*/ P(empty);/*判断缓冲区是否有空单元*/ P(mutex); /*缓冲区是否被占用*/ If x%2==0
V(s2); /*如果是偶数,向P3发出信号*/ else
V(s1); /*如果是奇数,向P2发出信号*/ V(mutex); /*使用完缓冲区,释放*/
While (1) {
wait(smoker[i]); wait(material[(i+1)%3]); wait(material[(i+2)%3]); signal(agent); }
例2;从读卡机上读进n张卡片,然后复制一份,要求复制出来的卡
片与读进来的卡片完全一致。这一工作由3个进程get、copy、put以及
待理发的完成,其初值为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;
解:为解决上述问题,需设置一个整型变量count用来对理发店中的顾
客进行计数,并需设置7个信号量,其中:mutex用来实现顾客进程对c
ount变量的互斥访问,其初值为1;sofa是对应于等候室中N张沙发的
资源信号量,其初值为N;empty表示是否有空闲的理发椅,其初值为1
;full表示理发椅上是否坐有等待理发的顾客,其初值为0;cut用来等
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;
为此,设计互斥信号量mutex1,mutex2来实现对buffer1和buffer2 的互斥访问;为实现get和copy之间的同步,设置两个信号量semptybuf fer1和sfullbuffer1,分别表示缓冲区buffer1是空的还是满的;为实现co
py和put之间的同步,设置两个信号量semptybuffer2、sfullbuffer2,分
一个进程去拣子,当一个进程拣了一个后,必须让另一个进程去拣子
。试用P、V操作控制这两个进程正确运行。
解:Semaphore sa=1;
Semaphore sb=0;
PA:
PB:
While(1)
while(1)
{
{
P(sa);
P(sb);
拣黑子;
拣白子;
V(sb);
V(sa);
}
}
微信群大全 http://www.1wxq.com ylrt6X2r2Bz9
开理发店;否则,如果理发师正在为其他顾客理发,则该顾客就找一 张空沙发等待;如果理发师因无顾客正在睡觉,则由新到的顾客唤醒 理发师为其理发。在理发完成后,顾客必须付费,直到理发师收费后 才能离开理发店。试用信号量实现这一同步问题。 分析:在本题中,顾客进程和理发师进程之间存在着多种同步关系: (1)只有在理发椅空闲时,顾客才能坐到理发椅上等待理发师理发, 否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始 理发;否则他也必须等待。这种同步关系类似于单缓冲(对应于理发椅 )的生产者消费者问题中的同步关系,故可通过信号量empty和full来控制。 (2)理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成 后由理发师唤醒他,这可单独使用一个信号量cut来控制。 (3)顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离 开;而理发师则需要等待顾客付费,并在收费后唤醒顾客允许他离开 ,这可分别通过两个信号量payment和receipt来控制。 (4)等候室的N张沙发是顾客竞争的资源,故还需为它们设置一个资 源信号量sofa。 (5)为了控制顾客的人数,使顾客能在所有的沙发都被占用时离开理 发店,还必须设置一个整型变量count来对理发店中的顾客计数,该变 量将被多个顾客进程互斥地访问并修改,这可通过一个互斥信号量m utex来实现。