OS进程同步信号量典型题.docx

上传人:b****5 文档编号:6238871 上传时间:2023-01-04 格式:DOCX 页数:19 大小:398.85KB
下载 相关 举报
OS进程同步信号量典型题.docx_第1页
第1页 / 共19页
OS进程同步信号量典型题.docx_第2页
第2页 / 共19页
OS进程同步信号量典型题.docx_第3页
第3页 / 共19页
OS进程同步信号量典型题.docx_第4页
第4页 / 共19页
OS进程同步信号量典型题.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

OS进程同步信号量典型题.docx

《OS进程同步信号量典型题.docx》由会员分享,可在线阅读,更多相关《OS进程同步信号量典型题.docx(19页珍藏版)》请在冰豆网上搜索。

OS进程同步信号量典型题.docx

OS进程同步信号量典型题

例题1(北京大学1999年)

有一个仓库,可以存放A和B两种产品,仓库的存储空间足够大,但要求:

(1)一次只能存人一种产品((A或B);

(2)一N

其中,N和M是正整数。

试用“存放A’和‘存放B’以及P操作和V操作描述产品A和产品B的人库过程。

解答:

应先将表达式转换成制约条件,不可在程序中直接使用该表达式

将表达式分解为:

B产品数量—A产品数量

A产品数量—B产品数量<M

可这样理解:

(1)若只放人A产品,而不放入B产品,则A产品最多可放M—1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为M—1),当计数器值为0时,进程程A被阻塞;每当放入一个B产品,则可令A产品的计数器增加1,表明A产品可以多一次放入产品的机会;同理,

(2)若只放人B产品,而不放入A产品,则B产品最多可;放N一1次便被阻塞,即A进程每操作一次就应当将计数器减1(计数器初值为N—1)。

当计数器值为0时,进程B被阻塞;每当放人一个A产品,则可令B产品的计数器增加1,表明B产品可以多一次放入产品的机会。

由此可见,该问题是一个同步控制问题。

又因为一次仅允许一种产品人库,设置信号量mutex控制粮进程互斥访问临界资源(仓库)。

过程如下:

begin

mutex:

=1;

Sa:

=M-1;

Sb:

=N-1;

Parbegin

A产品

begin

repeat

P(Sa);

P(mutex);

A人库;

V(mutex);

V(Sb);

Untilfalse;

End;

B产品

begin

repeat

P(Sb);

P(mutex);

B人库;

V(mutex);

V(Sa);

Untilfalse;

End;

rend;

例题2(华中理工大学1999年试题)

设公共汽车上,司机和售票员的活动分别是:

司机:

售票员:

启动车辆上乘客

正常行车关车门

到站停车售票

开车门

下乘客

在汽车不断地到站,停车,行驶过程中,这两个活动有什么同步关系?

并用信号灯的P,V操作实现它们的同步。

解答:

该题没有给出具体的控制关系,可根据常识自己定。

(1)售票员关车门后司机才可以启动车辆。

(2)司机到站停车后,票员方可开车门。

由此可见本题的控制关系较为简单。

过程如

下:

定义信号量run,stop;

Stop:

=0;run:

=0;

Purbegin

司机:

begin

L1:

P(run);

启动车辆;

正常行车;

到站停车;

V(stop);

GotoLl;

End;

售票员:

begin

L2:

上乘客;

关车门;

V(run);

售票;

P(stop);

开车门;

下乘客;

gotoL2;

end;

parend.

例题3(南开大学1997年试题)

天大

在南开大学和天津大学之间有一条弯曲的小路,其中从S到T一段路每次只允许一辆自行车通过,但中间有一个小的“安全岛”M(同时允许两辆自行车停留),可供两辆自行车已从两端进人小路情况下错车使用,如图4.3所示。

试设计一个算法使来往的自行车均可顺利通过。

T

L

K

S

南开

解答:

本题临界资源较多,需仔细考虑。

首先中间的安全岛M仅允许两辆自行车通过,应作为临界资源设置信号量。

但仔细分析发现,在任何时刻进人小路的自行车最多不会超过两辆(南开和天大方向各一辆),因此不需为安全岛M设置信号量。

在路口S处,南开出发的若干辆自行车应进行路口资源的争夺,以决定谁先进人小路SK段,为此设置信号量S,用以控制路口资源的争夺;同理,设置信号量T,控制天大方向自行车对路口T的争夺。

又小路SK段仅允许一辆车通过,设置信号量SK初值为1,同理设置小路LT段信号量LT初值为1。

程序如下:

S:

=l;T:

=1;SK:

=1;LT:

=1;

Parbegin

进程P:

(南开方向自行车)

begin

P(S);{与其它同方向的自行车争夺路口S}

P(SK);{同对面自行车争夺路段SK}

通过SK;

进人M;**

V(SK);{一旦进人M,便可释放路段SK}

P(LT);{同对面的自行车争夺路段LT}

通过LT;

V(LT);{将路段LT释放}

V(S);{将路口S释放给同方向的正在路口S处等待的自行车}

end,

 

进程Q:

(天大方向自行车‘)

begin

P(T);

P(LT);

通过LT;

进人M;

V(LT);

P(SK);

通过SK;

V(SK);

V(T);

End;

Parend。

说明**:

P进程进人安全岛M后,释放了路段SK,但没有释放路口S,原因在于它是向对面的4进程释放路段资源SK,而在P进程离开小路LT后,才会将路口S释放给其他P进程,如不这样,就会死锁。

请考虑如下情况:

两个方向各有一辆车前进,若在P进程到达安全岛M后,执行V(S)及V(SK)操作,则有可能使得同方向的其它P进程得到路段SK的使用权,而进人小路;同理,Q进程到达安全岛后执行V(LT)及V(T)操作,有可能使得同方向的其它Q进程得到路段LT而进人小路。

此时共有四辆车在整个路径中,最终出现死锁状态。

例题4(北京理工大学1996年试题)

进程之间存在哪几种相互制约关系?

各是什么原因引起的?

下列活动分别属于哪种

制约关系?

(1)若干同学去图书馆借书;

(2)两队举行篮球比赛;

(3)流水线生产的各道工序;

(4)商品生产和社会消费。

解答:

有直接制约关系(即同步问题)和间接制约关系(即互斥问题);同步问题是存在逻辑关系的进程之间相互等待所产生的制约关系,互斥问题是相互无逻辑关系的进程间竞争使用资源所发生的制约关系。

(1)约属于互斥关系,因为书的个数是有限的,一本书只能借给一个同学;

(2)属于互斥关系,篮球只有一个,两队都要争夺;

(3)属于同步关系,各道工序的开始都依赖前道工序的完成;

(4)属于同步关系,商品没生产出来,消费无法进行,商品未消费完,生产也无须

进行。

例题5。

(北京邮电大学1999年试题)

某招待所有100个床位,住宿者住人要先登记(在登记表上填写姓名及床位号),离去时要撤消登记(在登记表上删去姓名和床位号)。

请给出住宿登记及撤消登记(退宿)过程的算法描述。

解答:

该题同有限缓冲区的生产者/消费者问题一致,缓冲单元为100个,顾客人住时执行生产者操作,登记过程对应于放产品过程,故对登记表的修改须互斥执行,当床位客满时便不可人住(即放产品).顾客离开时执行消费者操作,退宿过程对应于取产品过程,包括修改登记表,删去姓名(即取产品),并将床位归还(空出一个单元)。

过程:

例题6。

(南京大学2000年试题)

桌子上有一只盘子,最多可容纳两个水果,每次只能放人或取出一个水果。

爸爸专向盘子中放苹果(apple),妈妈专向盘子中放橘子(orange),两个儿子专等吃盘子中的橘子,两个女儿专等吃盘子中的苹果。

请用P,V操作来实现爸爸、妈妈、儿子、女儿之间的同步与互斥关系。

解答:

盘子为互斥资源,因可以放两个水果,empty初值为2;father放苹果前先看看有无空间,若有则抢盘子,放人apple。

后向女儿发信号(V(apple));mother放橘子前先看看有无空间,若有则抢盘子,放人橘子后向儿子发信号(V(orange));女儿先看有无苹果,若有则抢盘子,取走苹果后将盘子置空(V(empty));儿子先看有无橘子,若有则抢盘子,取走橘子后将盘子置空。

该题是生产者/消费者问题的变形,有两对生产者和消费者。

生产者需指明是给哪个消费者的产品,但消费者取走产品后无须特别通知某个生产者,因为空出的缓冲区(盘子)可由两个生产者随意争夺。

设信号量mutex初值为1,控制对盘子的互斥访问;apple表示盘中苹果个数,orange表示盘中橘子个数,初值均为0.

parbegin

father:

begin

Ll:

P(empty);

P(mmex);

放苹果;。

V(mutex);

V(apple);

GotoLl;

End;

mother:

begin

L2:

P(empty);

P(mutex);

放橘子;

V(murex);

V(orange);

CotoL2;

End;

daughter:

begin

L3:

P(apple);

P(mutex);

取苹果

V(murex);

V(empty);

GotoL3;

End;

son:

begin

L4:

P(orange);

P(mutex);

取橘子

V(mutex);

V(empty);

GotoM;

End;

Parend

例题7。

某工厂有两个生产车间和一个装配车间,两个生产车间分别生产A,B两种零件,装配车间的任务是把A,B两种零件组装成产品。

两个生产车间每生产一个零件后都要分别把它们送到装配车向的货架F1,F2上,Fl存放零件A,F2存放零件B,Fl和F2的容量均为可以存放10个零件。

装配工人每次从货架上取一个A零件和一个B零件然后组装成产品。

请用PV操作进行正确管理。

解答:

该题是生产者/消费者问题的变形,可认为一个消费者(装配工人)同两个生产者(A,B车间)互斥使用两个缓冲区(Fl,F2),可设mutexl,mutex2(初值为1)控制进程对Fl,F2的互斥操作,另设一emptyl,empty2(初值均为10),fulll,full2(初值均为0)。

过程如下:

parbegin

A车间:

begin

Ll:

生产一个产品;

P(emptyl);

P(mutexl);

放人Fl;

V(mutexl);

V(full));

GotoLl;

End;

B车间:

begin

L2:

生产一个产品;

P(empty2);

P(mutex2);

放人F2;

V(mutex2);

V(full2);

GotoL2;

装配工人:

begin

L3:

P(full1);

P(full2);

P(mutexl);

P(mutex2);

取A和B;

V(mutex1);

V(mutex2);

V(emptyl);

V(empty2);

GotoL3;

End;

Parend.

例题8(北京邮电大学1998年试题)

某寺庙,有小、老和尚若干,有一水缸,由小和尚提水人缸(向缸中倒水)供老和尚饮用。

水缸可容10桶水,水取自同一井中。

水井径窄,每次只能容一个捅取水。

水桶总数为3个。

每次人、取缸水仅为1桶,且不可同时进行。

试给出有关从缸中取水和向缸中倒水的算法描述。

解答:

应首先考虑清楚本题需要几个进程。

从井中取水后向缸中倒水为连续动作,可算同一进程,从缸中取水为另一进程。

再考虑信号量.有关互斥的资源有水井(一次仅一个水桶进出)和水缸(一次入、取水为一桶),分别为之设信号量mutexl,mutex2控制互斥;

另有同步问题存在:

三个水桶无论从井中取水还是人出水缸都是一次一个,应为之设信号量count,抢不到水桶的进程只好等待;还有水缸满时,不可人水,设信号量empty控制人水量.水缸空时不可出水,设信号量full,控制出水量。

mutexl:

=1;mutex2:

=1;empty:

=10;full:

=0;  count:

=3;

parbegin

入水:

begin

Ll:

P(empty);

P(count);

P(mutexl);

从井中取水;

V(mutext1);

P(mutex2);

送人水缸;

V(mutex2);

V(count);

V(full);

GotoLl;

End;

取水:

begin

L2:

P(full);

P(count);

P(mutex2);

从缸中取水;

V(mutex2);

V(empty);

V(count);

GotoL2;

End;

Parend.

例题9(北方交通大学1999年试题)

有一阅览室,读者进人阅览室必须先在一张登记表((TB)上登记,该表为每一座位设一个表目,读者离开时要消掉其登记信息,阅览室共有100个座位,为了描述读者的动作,请用类Pascal语言和P,V操作写出进程间的同步算法。

约定:

1)flag的值:

0座位空闲,1座位被占用。

2)用语句I=getflag(0)可搜索到一个空座位i,用语句i.flag=0或1,可给标志位赋值。

3)用i=getname(readername)可搜索到某读者所登记的座位号i;

用i..name=0或i.name=readrname。

可给姓名字段赋值,0表示清除读者姓名。

4)计数信号量用count,互斥信号量用mutex.

解答:

该题所提供的已知条件和语句过多,容易给考生造成混乱,因此看到此题应先理清思路,先不要考虑约定中提供的各种语句。

首先,按照惯常的同步互斥问题思路来思考。

读者进程:

讲入阅览室首先应检杳是否有空位子。

若没有则等待,若有则登记,可设信号量count,控制各进程对座位的争夺;读者离去时,便可释放该座位。

登记时要对表中各量进行修改,该过程相对于各进程而言为互斥操作,因此设信号量mutex,控制读者进人和离去时对表的互斥修改,题目所提供的各种语句只是用在修改登记表时所进行的具体操作,对本题的同步互斥问题无任何影响,照抄即可。

count:

=100;mutex:

=1;

读者进程:

begin

进人阅览室;

P(count);

P(mutex);

i=getflag(0);

i.flag=1;

i.name=readername;

V(mutex);

坐下看书;

P(mutex);

i=getname(readername);

i.name=0;i.flag=0;

V(mutex);

V(count);

离开;

end.

例题10。

用信号量描述4乘100米接力过程

解答:

P1:

P2:

P(Sl);P3:

P(S2);P4:

P(S3);

起跑,前进l00m;起跑,前进l00m;起跑,前进l00m;起跑,前进l00m;

V(S1);V(S2);V(S3);到达终点。

例题11(北京大学1992年试题)

有桥如图4.15所示。

车流如箭头所示。

桥上不允许两车交会,但允许同方向多辆车依次通行(即桥上可以有多个同方向的车)。

用P,V操作实现交通管理以防桥上堵塞。

解答:

设置:

信号量mutex1,murex2,初值为1;bridge初值为1;计数器count1,count2,初值为0。

北方:

南方:

P(mutex1);P(mutex2);

count1:

=count1+1;count2:

=count2+1;

ifcount1=1thenP(bridge);ifcount2=1thenP(bridge);

V(mutexl);V(mutex2);

过桥;过桥;

P(mutexl);P(mutex2);

count1:

=count1一1;count2:

=count2一1;

ifcount1=0thenV(bridge);ifcount2=0thenV(bridge);

V(mutex1);V(mutex2);

例题12。

“吸烟者”问题:

假设一个系统有三个吸烟者(Smoker)进程和一个供货商((Agent)进程。

每个吸烟者连续不断地制造香烟并吸掉它。

但是,制造一支香烟需要三种材料;烟丝、纸、火柴。

第一个吸烟者进程有纸,第二个有烟丝,第三个有火柴。

供货商进程可以无限地提供这三种材料。

供货商将两种材料一起放在桌上,持有另一种材料的吸烟者即可以制造一支香烟并吸掉它。

供货商一次只能处理一个吸烟者的请求。

当此吸烟者抽香烟时,它发出一个信号通知供货商进程,供货商进程马上给出另外两种材料,如此循环往复。

试编写一个程序使供货商与吸烟者同步执行。

解答:

varsmoker1,smoker2,smoker3:

Boolean;/*表明smokeri是否需要抽烟*/

semaphoret,w,m;/*t—烟丝信号量,w—纸信号量,m—火柴信号量*/

binarysemaphoremutex1,mutex2,mutex3,

/*控制agent每次只能为一个吸烟者按顺序服务*/

binarysemaphoresmoker_mutex;

/*控制三个吸烟者每次只能有一个提出申请并从桌子上取材料*/

begin

smoker1:

=false;smoker2:

=false;smoker3:

=false;

t:

=0;w:

=0;m:

=0;

mutex1:

=1;mutex2:

=1;mutex3:

=1;smoker_mutex:

=1;

Agent:

Loop

P(mutex1);

Ifsomker1=true/*第一个拥有纸的吸烟者想吸烟*/

thenV(t);/*提供烟丝*/

V(m);/*提供火柴*/

somker1=false;

V(mutex1);

P(mutex2);

Ifsomker2=true/*第二个拥有烟丝的吸烟者想吸烟*/

thenV(w);/*提供纸*/

V(m);/*提供火柴*/

Somker2=false;

V(mutex2);

P(mutex3);

Ifsomker3=true/*第三个拥有火柴的吸烟者想吸烟*/

thenV(w);/*提供纸*/

V(t);/*提供烟丝*/

Somker3=false;

V(mutex3);

Endloop

Smoker1:

LoopP(smoker_mutex)/*判断是否有其它吸烟者正在向供货商提出申请*/

P(mutex1)/*判断所需的烟丝和火柴是否已经放在桌子上*/

Smoker1:

=true;

V(mutex1);

P(m);

P(t);

V(smoker_mutex)

Endloop

Smoker2和Smoker3与Smoker1类似。

【09真题】

三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。

P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd()统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并用counteven()统计偶数个数。

请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义的信号量的含义。

要求用伪代码描述。

 

1.定义信号量S1控制P1与P2之间的同步;S2控制P1与P3之间的同步;empty控制生产者与消费者之间的同步;mutex控制进程间互斥使用缓冲区。

程序如下:

Vars1=0,s2=0,empty=N,mutex=1;

Parbegin

P1:

begin

 X=produce(); /*生成一个数*/

 P(empty);    /*判断缓冲区是否有空单元*/

 P(mutex);    /*缓冲区是否被占用*/

 Put();

 Ifx%2==0

   V(s2); /*如果是偶数,向P3发出信号*/

 else

   V(s1); /*如果是奇数,向P2发出信号*/

 V(mutex);    /*使用完缓冲区,释放*/

end.

P2:

begin

 P(s1); /*收到P1发来的信号,已产生一个奇数*/

 P(mutex);    /*缓冲区是否被占用*/

 Getodd();Countodd():

=countodd()+1;V(mutex); /*释放缓冲区*/

 V(empty); /*向P1发信号,多出一个空单元*/

end.

P3:

begin

 P(s2)        /*收到P1发来的信号,已产生一个偶数*/

 P(mutex); /*缓冲区是否被占用*/

 Geteven();Counteven():

=counteven()+1;V(mutex); /*释放缓冲区*/

 V(empty); /*向P1发信号,多出一个空单元*/

end.

Parend.

【11真题】

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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