pv操作习题.docx

上传人:b****8 文档编号:11264625 上传时间:2023-02-26 格式:DOCX 页数:17 大小:22.05KB
下载 相关 举报
pv操作习题.docx_第1页
第1页 / 共17页
pv操作习题.docx_第2页
第2页 / 共17页
pv操作习题.docx_第3页
第3页 / 共17页
pv操作习题.docx_第4页
第4页 / 共17页
pv操作习题.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

pv操作习题.docx

《pv操作习题.docx》由会员分享,可在线阅读,更多相关《pv操作习题.docx(17页珍藏版)》请在冰豆网上搜索。

pv操作习题.docx

pv操作习题

设一民航售票系统有n个售票处。

每个售票处通过终端访问系统中的公用数据区,假定公用数据区中分别用R1、R2、R3、…Rn表示×月×日×次航班的现存票数。

设P1、P2、P3、Pn表示各售票处的处理进程,试用信号量实现进程间的互斥关系

Vars:

semaphore:

=1;

begin

parbegin

processPi:

begin

repeat

Wait(s);

按旅客定票要求找到Rk

ifRk>=1thenbegin

Rk=Rk-1;

Signal(s);

输出一张票;

end;

elsebegin

Signal(s);

输出“票已售完”;

end;

untilfalse;

end

parend

end

生产围棋的工人不小心把相等数量的黑子和白子混装在一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:

(1)进程A专门拣黑子,进程B专门拣白子;

(2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;

s:

semaphore:

=1;

   parbegin

    processA:

begin

    L1:

Wait(s);

     拣黑子;

     Signal(s);

     gotoL1;

    end;

    processB:

begin

    L2:

Wait(s);

     拣白子;

     Signal(s);

     gotoL2;

    end;

   parend;

某车站售票厅共有20个售票窗口,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。

每个购票者可看成一个进程。

s:

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:

=1;Scount4:

=4;

Counteast,Countwest:

integer;

Counteast:

=0;Countwest:

=0;

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);

上桥;过桥:

下桥:

V(Scount4);

P(Scountwest);

Countwest:

=Countwest-l;

ifCountwest=0thenV(S);

V(Scountwest);

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);

从盘中取出苹果;

Signal(S);

吃苹果;

}

父亲-母亲-儿子-女儿一个苹果或桔子

信号量:

s=1(空盘);s1=0(苹果);s2=0(桔子);

爸爸:

while(true){wait(s);放苹果;signal(s1);}

妈妈:

while(true){wait(s);放桔子;signal(s2);}

儿子:

while(true){wait(s2);取桔子;signal(s);}

女儿:

while(true){wait(s1);取苹果;signal(s);}

父亲-母亲-儿子-女儿两个苹果或桔子

信号量:

s=2(可用);s1=0(苹果);s2=0(桔子);mutex=1;

爸爸:

wait(s);wait(mutex);放苹果;signal(s1);signal(mutex);

妈妈:

wait(s);wait(mutex);放桔子;signal(s2);signal(mutex);

儿子:

wait(s2);wait(mutex);取桔子;signal(s);signal(mutex);

女儿:

wait(s1);wait(mutex);取苹果;signal(s);signal(mutex);

有一个仓库(无限大),可以存放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);

P(mutex);

将产品入库;

V(mutex);

V(sa);

}

}

}

某仓库存放两种零件A和B,最大数量均为m个。

有一车间不断地取A和B进行装配,每次各取一个。

为避免零件锈蚀,遵循先入库者先出库的原则。

有两个供应商分别不断地供应A、B零件(每次一个)。

为保证齐套和合理库存,当某种零件的数量比另一种的数量超过n(n

(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);

wait(mutex);

将零件A放入仓库;

signal(mutex);

signal(fulla);

signal(sb);

}

}

Provider_B()

{

while(true)

{

wait(emptyb);

wait(sb);

wait(mutex);

将零件A放入仓库;

signal(mutex);

signal(fullb);

signal(sa);

}

}

Assembling_shop()

{

while(true)

{

wait(fulla);

wait(fullb);

wait(mutex);

装配零件;

signal(mutex);

signal(emptya);

signal(emptyb);

}

}

设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售者销售;销售者每次循环从仓库中取出一个产品进行销售。

如果不允许同时入库,也不允许边入库边出库;而且要求生产和销售A产品和B产品的件数都满足一下关系:

-N≤A产品数量-B产品数量≤M

其中,N和M是正整数。

试用信号量机制写出A、B、C三个进程的工作流程。

intmutex=1;//互斥信号量

ints1=M;//表示当前允许A产品比B产品

多入库的数量

ints2=N;//表示当前允许B产品比A产品

多入库的数量

ints=0;//表示当前仓库中产品的总数量

intsa=0;//表示当前仓库中A产品的数量

intsb=0;//表示当前仓库中B产品的数量

intdif=0;//表示所销售的A、B产品的数量差

Process_A:

while

(1)

{

wait(s1);

produceaproductA;

signal(s2);

wait(mutex);

addtheproductAtothestorehouse;

signal(mutex);

signal(sa);

signal(s);

}

Process_B:

while

(1)

{

wait(s2);

produceaproductB;

signal(s1);

wait(mutex);

addtheproductBtothestorehouse;

signal(mutex);

signal(sb);

signal(s);

}

Process_C:

while

(1)

{

wait(s);

ifdif<=-n{

wait(sa);

wait(mutex);

takeaproductA;

signal(mutex);

dif:

=dif+1;}

elseifdif>=m{

wait(sb);

wait(mutex);

takeaproductB;

signal(mutex);

dif:

=dif-1;}

else{

wait(mutex);

takeaproduct;

signal(mutex);

ifproduct_type=A{

wait(sa);

dif:

=dif+1;}

else{

wait(sb);

dif:

=dif-1;}

selltheproduct;

}

一个数据采集系统,有数据采样进程和数据处理进程及数据输出进程。

采样进程把采到的数据送入buf1中,由数据处理进程取出处理并存入buf2中,然后由数据输出进程将其从buf2中输出,试给出实现三个进程同步的算法。

信号量设置:

semphoreempty1=1;

Semphorefull1=0;

semphoreempty2=1;

sSemphorefull2=0;

Process_A()

{

while(true)

{

采集一个数据;

Wait(empty1);

将数据存入buf1中;

Signal(full1);

}

}

Process_B()

{

while(true)

{

Wait(full1);

从buf1中取出数据;

Signal(empty1);

处理数据;

Wait(empty2);

将处理结果存入buf2;

Signal(full2);

}

}

Process_C()

{

while(true)

{

Wait(full2);

从buf2中取出结果;

Signal(empty2);

打印输出;

}

}

在天津大学与南开大学之间有一条弯曲的小路,这条路上每次每个方向上只允许一辆自行车通过。

但其中有一个小的安全岛M,同时允许两辆自行车停留,可供两辆自行车已从两端进入小路的情况下错车使用。

begin

   t:

=1;s:

=1;l:

=1;k:

=1;m=2;

   cobegin

   Process_T2N()

       begin

           wait(t);

wait(l);

           通过L路段;

wait(m);

           进入安全岛M;

           signal(l);

wait(k);

           通过K路段

           signal(m);

signal(k);

signal(t);

       end

Process_N2T()

       begin

         wait(s);

wait(k);

通过K路段;

wait(m);

进入安全岛M;

signal(k);

wait(l);

通过L路段;

signal(m);

signal(l);

signal(s);

       end

   coend

end

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1