放水果
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。
爸爸专向盘子放苹果(apple),妈妈专向盘子放桔子(orange)。
两个儿子专等吃盘子中的桔子,两个女儿专等吃盘子中的苹果。
请用信号量来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。
解:本题原型为生产者-消费者问题,只是由一种产品改为两种水果,所以将表示满缓冲区单元个数的一个信号量改为表示盘中苹果的个数和桔子个数的两个信号量,设置如下信号量:
empty:记录允许向盘子中放入水果的个数,初值为2。
apple:盘子中已放入的苹果的个数,初值为0。
orange:盘子中已放入的桔子的个数,初值为0。
mutex:向盘子中取、放操作是一个互斥操作,也就是说盘子对于取、放水果而言是一个临界资源,为此设置一个信号量,其初值为1。
本题4个进程的同步与互斥活动的描述如下:
Var mutex, empty, apple, orange:=1,2,0,0
Begin
Father:begin
Repeat
wait(empty); //盘中可放入的水果数
wait(mutex); //申请向盘中取、放水果
向盘中放苹果;
signal(mutex); //允许向盘中取、放水果signal(apple); //递增盘中的苹果数
end
Mother:begin
Repeat
wait (empty); //减少盘中可放入的水果数wait (mutex); //申请向盘中取、放水果向盘中放桔子;
signal (mutex); //允许向盘中取、放水果signal (orange); //递增盘中的桔子数
end
Daughteri(i=1,2):begin //两女儿进程Repeat
wait(apple); //减少盘中苹果数
wait (mutex); //申请向盘中取、放水果
取盘中苹果;
signal (mutex); //允许向盘中取、放水果signal (empty); //递增盘中可放入的水果数
end
Sonj(j=1,2):begin //两儿子进程Repeat
wait (orange); //减少盘中桔子数
wait (mutex); //申请向盘中取、放水果
取盘中桔子;
signal (mutex); //允许向盘中取、放水果signal (empty); //递增盘中可放入的水果数
end
end
和尚取水:
Var Semaphore:mutex1=1;mutex2=1;
empty=10;full=0;pail=3; Begin
parbegin
Get() //小和尚取水Repeat
wait(empty)
wait(pail)
wait(mutex1)
从井中取水;
signal (mutex1)
wait(mutex2)
将水倒入缸中;signal (mutex2) signal (full)
signal (pail)
parend
parbegin
Use() //老和尚喝水Repeat
wait(full)
wait(pail)
wait(mutex2)
从缸中取水signal (mutex2) ;signal (empty)
喝水
signal (pail) parend。