(8分)某寺庙有小和尚、老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。水缸可容10 桶水,水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为3 个。每次入缸取水仅为1 桶水,且不可同时进行。试用信号量和P/V 操作给出有关从缸取水、入水的算法描述。
从井中取水并放入水缸是一个连续的动作可以视为一个进程从缸中取水为另一个进程。设水井和水缸为临界资源引入well、vat;三个水桶无论从井中取水还是放入水缸中都是一次一个应该给它们一个信号量pail抢不到水桶的进程只好等待。水缸满时不可以再放水设置empty信号量控制入水量;水缸空时不可以取水设置full信号量来控制。本题需要设置5个信号量来控制: 从井中取水并放入水缸是一个连续的动作可以视为一个进程,从缸中取水为另一个进程。设水井和水缸为临界资源,引入well、vat;三个水桶无论从井中取水还是放入水缸中都是一次一个,应该给它们一个信号量pail,抢不到水桶的进程只好等待。水缸满时,不可以再放水,设置empty信号量控制入水量;水缸空时,不可以取水,设置full信号量来控制。本题需要设置5个信号量来控制:
【参考答案】
Semap...
用户登录可进行刷题及查看答案
Semaphore mutex_well = 1; //实现对水井这一互斥资源的互斥访问 Semaphore mutex_vat = 1; //实现对水缸这一互斥资源的互斥访问 Semaphore vat_empty = 10; //水缸剩余能容纳的水的桶数 Semaphore vat_full = 0; //水缸已容纳的水的桶数 Semaphore pail = 3; //空闲的水桶的数量 CoBegin{ process 小和尚 { while(TRUE){ P(vat_empty); //(同步)申请向水缸倒水,若水缸已满则等待 P(pail); //申请使用空闲水桶,如没有空闲水桶则等待 P(mutex_well); //(互斥)防止他人使用水井 从井中取水; V(mutex_well); //(互斥)允许他人使用水井 P(mutex_vat); //(互斥)防止他人使用水缸 将水倒入水缸; V(mutex_vat); //(互斥)允许他人使用水缸 V(vat_full); //(同步)水缸已用容量加1,若有老和尚喝水则通知 V(pail); //释放一个空闲水桶,若有和尚在等待使用,则通知 } } process 老和尚 { while(TRUE){ P(vat_full); //(同步)申请从水缸取水,若水缸为空,则等待 P(pail); //申请使用空闲水桶,如没有空闲水桶则等待 P(mutex_vat); //(互斥)防止他人使用水缸 从水缸取水; V(mutex_vat); //(互斥)允许他人使用水缸 V(vat_empty); //(同步)水缸剩余容量加1,若有小和尚等打水则通知 喝水; V(pail); //释放一个空闲水桶,若有和尚在等待使用,则通知 } } }CoEnd
登录后提交答案