pv操作习题Word文档格式.docx
《pv操作习题Word文档格式.docx》由会员分享,可在线阅读,更多相关《pv操作习题Word文档格式.docx(17页珍藏版)》请在冰点文库上搜索。
begin
L1:
Wait(s);
拣黑子;
Signal(s);
gotoL1;
end;
processB:
L2:
Wait(s);
拣白子;
gotoL2;
parend;
某车站售票厅共有20个售票窗口,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。
每个购票者可看成一个进程。
semaphore=20;
parbegin
processPi(i=1,2,……)
beginWait(s);
进入售票厅;
购票;
退出;
Signal(s);
end;
parend
有座东西方向架设、可双向通行的单车道简易桥,最大负荷为4辆汽车。
请定义合适的信号量,正确使用wait/signal操作,实现双向车辆的过桥过程。
信号量应该有4个:
S,初值为1,代表桥的互斥使用的信号量;
Scounteast,初值为1,代表由东向西行驶的桥上的车辆计数器的互斥使用;
Scountwest,初值为1,代表由西向东行驶的桥上的车辆计数器的互斥使用;
Scount4,初值为4,代表桥上车辆的计数信号量。
varS,Scounteast,Scounwest,Scount4:
semaphore;
S:
=1;
Scounteast=1;
Scountwest:
Scount4:
=4;
Counteast,Countwest:
integer;
Counteast:
=0;
Countwest:
Cobegin,
processeast(i)
begin
P(Scounteast);
ifCounteast=0thenP(S);
Counteast:
=Counteast+l;
V(Scounteast);
P(Scount4);
上桥:
过桥:
下桥;
V(Scount4);
P(Scounteast);
Counteast:
=Counteast-1;
ifCounteast=0thenV(S);
V(Scounteast);
end;
processwest(i)
begin
P(Scountwest);
ifCountwest=0thenP(S);
Countwest:
=Countwest+1;
V(Scountwest);
P(Scount4);
上桥;
下桥:
P(Scountwest);
=Countwest-l;
ifCountwest=0thenV(S);
end;
Coend
有一单向行驶的公路桥,每次只允许一辆汽车通过。
当汽车到达桥头时,若桥上无车,便可上桥;
否则需等待,直到桥上的汽车下桥为止,若每一辆汽车为一个进程,请用Wait、Signal操作原语保证汽车按要求过桥。
汽车进程:
Pi(i=1,2,3,…)
到达桥头;
P(S);
上桥行驶;
到达桥另一端;
V(S);
某超市门口为顾客准备了100辆手推车,每位顾客在进去买东西时取一辆推车,在买完东西结完帐以后再把推车还回去。
试用Wait/Signal操作正确实现顾客进程的同步互斥关系。
semaphoreS_CartNum=100;
//空闲的手推车数量,初值为100
voidconsumer(void)//顾客进程
{
Wait(S_CartNum);
买东西;
结帐;
Signal(S_CartNum);
}
桌子上有一个水果盘,每一次可以往里面放入一个水果。
爸爸专向盘子中放苹果,儿子专等吃盘子中的苹果。
把爸爸、儿子看作二个进程,试用Wait/Signal操作使这四个进程能正确地并发执行。
⏹semaphoreS_PlateNum;
//盘子容量,初值为1
⏹semaphoreS_AppleNum;
//苹果数量,初值为0
父while(TRUE)
Wait(S_PlateNum);
往盘子中放入一个苹果;
Signal(S_AppleNum);
}
子while(TRUE)
Wait(S_AppleNum);
从盘中取出苹果;
Signal(S_PlateNum);
吃苹果;
桌上有一空盘,允许存放一只水果,爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。
规定当盘空时一次只能放一只水果供吃者取用。
请用Wait/Signal原语实现爸爸、儿子、女儿三个并发进程的同步。
intS=1;
//S表示盘子是否为空;
intSa=0;
//Sa表示盘中是否有苹果;
intSb=0;
//Sb表示盘中是否有桔子;
父亲while(TRUE)
Wait(S);
将水果放入盘中;
if(放入的是桔子)
Signal(Sb);
Else
Signal(Sa);
儿子while(TRUE)
Wait(Sb);
从盘中取出桔子;
Signal(S);
吃桔子;
女儿while(TRUE)
Wait(Sa);
父亲-母亲-儿子-女儿一个苹果或桔子
信号量:
s=1(空盘);
s1=0(苹果);
s2=0(桔子);
爸爸:
while(true){wait(s);
放苹果;
signal(s1);
妈妈:
放桔子;
signal(s2);
儿子:
while(true){wait(s2);
取桔子;
signal(s);
女儿:
while(true){wait(s1);
取苹果;
父亲-母亲-儿子-女儿两个苹果或桔子
s=2(可用);
mutex=1;
wait(s);
wait(mutex);
放苹果;
signal(mutex);
wait(s2);
wait(s1);
有一个仓库(无限大),可以存放A和B两种产品,但要求:
(1)每次只能存入一种产品(A或B);
(2)-N<A产品数量-B产品数量<M
其中,N和M是正整数。
试用Wait/Signal操作描述产品A与产品B的入库过程。
intmutex=1;
//互斥信号量
intsa=M-1;
//表示当前允许A产品比B产品多入库的数量
intsb=N-1;
//表示当前允许B产品比A产品多入库的数量
main()
while
(1)
取一个产品;
if(取的是A产品)
P(sa);
P(mutex);
将产品入库;
V(mutex);
V(sb);
else
P(sb);
V(sa);
某仓库存放两种零件A和B,最大数量均为m个。
有一车间不断地取A和B进行装配,每次各取一个。
为避免零件锈蚀,遵循先入库者先出库的原则。
有两个供应商分别不断地供应A、B零件(每次一个)。
为保证齐套和合理库存,当某种零件的数量比另一种的数量超过n(n<
m)个时,暂停对数量大的零件的进货,补充数量少的零件。
(1)问共需设置几个进程?
(2)用Wait/Signal操作解决上述问题中的同步互斥关系。
本题中给出的两种零件数量关系为:
A零件数量-B零件数量≤n
B零件数量-A零件数量≤n
A零件数量≤m
B零件数量≤m
semaphoremutex=1;
semaphoreemptya=m;
semaphoreemptyb=m;
semaphorefulla=0;
semaphorefullb=0;
semaphoresa=n;
semaphoresb=n;
main()
cobegin
Provider_A();
Provider_B();
Assembling_shop();
conend
Provider_A()
while(true)
{
wait(emptya);
wait(sa);
将零件A放入仓库;
signal(fulla);
signal(sb);
Provider_B()
wait(emptyb);
wait(sb);
signal(fullb);
signal(sa);
Assembling_shop()
wait(fulla);
wait(fullb);
装配零件;
signal(emptya);
signal(emptyb);
设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售者销售;
销售者每次循环从仓库中取出一个产品进行销售。
如果不允许同时入库,也不允许边入库边出库;
而且要求生产和销售A产品和B产品的件数都满足一下关系:
-N≤A产品数量-B产品数量≤M
其中,N和M是正整数。
试用信号量机制写出A、B、C三个进程的工作流程。
ints1=M;
//表示当前允许A产品比B产品
多入库的数量
ints2=N;
//表示当前允许B产品比A产品
ints=0;
//表示当前仓库中产品的总数量
intsa=0;
//表示当前仓库中A产品的数量
intsb=0;
//表示当前仓库中B产品的数量
intdif=0;
//表示所销售的A、B产品的数量差
Process_A:
wait(s1);
produceaproductA;
addtheproductAtothestorehouse;
Process_B:
wait(s2);
produceaproductB;
addtheproductBtothestorehouse;
Process_C:
wait(s);
ifdif<
=-n{
takeaproductA;
dif:
=dif+1;
elseifdif>
=m{
takeaproductB;
=dif-1;
else{
takeaproduct;
ifproduct_type=A{
else{
selltheproduct;
一个数据采集系统,有数据采样进程和数据处理进程及数据输出进程。
采样进程把采到的数据送入buf1中,由数据处理进程取出处理并存入buf2中,然后由数据输出进程将其从buf2中输出,试给出实现三个进程同步的算法。
信号量设置:
semphoreempty1=1;
Semphorefull1=0;
semphoreempty2=1;
sSemphorefull2=0;
Process_A()
采集一个数据;
Wait(empty1);
将数据存入buf1中;
Signal(full1);
Process_B()
Wait(full1);
从buf1中取出数据;
Signal(empty1);
处理数据;
Wait(empty2);
将处理结果存入buf2;
Signal(full2);
Process_C()
Wait(full2);
从buf2中取出结果;
Signal(empty2);
打印输出;
在天津大学与南开大学之间有一条弯曲的小路,这条路上每次每个方向上只允许一辆自行车通过。
但其中有一个小的安全岛M,同时允许两辆自行车停留,可供两辆自行车已从两端进入小路的情况下错车使用。
t:
l:
k:
m=2;
Process_T2N()
wait(t);
wait(l);
通过L路段;
wait(m);
进入安全岛M;
signal(l);
wait(k);
通过K路段
signal(m);
signal(k);
signal(t);
Process_N2T()
通过K路段;
进入安全岛M;
coend
end