1、有一个仓库可存放A、B两种零件,最大库容量各为m个。生产车间不断地取A和B进行装配,每次各取一个。为避免零件锈蚀,按先入库者先出库的原则。有两组供应商分别不断地供应A和B,每次一个。为保证配套和合理库存,当某种零件比另一种零件超过n(n<m)个时,暂停对数量大的零件的进货,集中补充数量少的零件。试用信号量与P、V操作正确地实现它们之间的同步关系。
var empty1,empty2,full1,full2:semaphore;
mutex,sa,sb:semaphore;
in1,in2,out1,out2:integer;
buffer1,buffer2 :array [0..m-1] of item;
empty1:=empty2:=m;
sa:=sb:=n;
in1:=in2:=out1:=out2:=0;
cobegin
{
process producer A
{ repeat
P(empty1);
P(sa);
P(mutex);
buffer1[in1] :=A零件;
in1:=(in1+1) mod m;
V(mutex);
V(sb);
V(full1);
untile false;
}
process producerB
{ repeat
P(empty2);
P(sb);
P(mutex);
Buffer2[in2] :=B零件;
in2:=(in2+1) mod m;
V(mutex);
V(sa);
V(full2);
untile false;
}
process take
{ repeat
P(full1);
P(full2);
P(mutex);
Take from buffer1[out1] and buffer2[out2]中的A、B零件;
out1:=(out1+1) mod m;
out2:=(out2+1) mod m;
V(mutex);
V(empty1);
V(empty2);
把A和B装配成产品;
until false
}
}
coend.
2、设有输入进程INPUT,缓冲区B1接纳输入内容。进程MAKER对B1中的内容加工后移送到B2。进程OUTPUT负责从B2中取出内容进行打印。设有一个无穷序列供INPUT输入,B1与B2的大小相同。请用PV过程写出三个进程同步工作的过程。
系统设置四个信号量:
B1full 缓冲区B1满,初值0
B1empty 缓冲区B1空,初值1
B2full 缓冲区B2满,初值0
B2empty 缓冲区B2空,初值1
3、有一个阅览室,共有100个座位,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试用PV操作描述读者进程之间的同步关系。
算法的信号量有三个:seats——表示阅览室是否有座位(初值为100,代表阅览室的空座位数);readers——表示阅览室里的读者数,初值为0;用于互斥的mutex,初值为1。
读者进入阅览室的动作描述getin: while(TRUE){
P (seats); /*没有座位则离开*/ P(mutex) /*进入临界区*/ 填写登记表;
进入阅览室读书;
V(mutex) /*离开临界区*/ V(readers)
}
读者离开阅览室的动作描述getout: while(TRUE){
P(readers) /*阅览室是否有人读书*/ P(mutex) /*进入临界区*/ 消掉登记;
离开阅览室;
V(mutex) /*离开临界区*/
V(seats) /*释放一个座位资源*/ }