信号量及PV操作实例

合集下载

信号量的PV操作(例题]

信号量的PV操作(例题]

???信号量的PV操作是如何定义的?试说明信号量的PV操作的物理意义。

参考答案:P(S):将信号量S减1,若结果大于或等于0,则该进程继续执行;若结果小于0,则该进程被阻塞,并将其插入到该信号量的等待队列中,然后转去调度另一进程。

V(S):将信号量S加1,若结果大于0,则该进程继续执行;若结果小于或等于0,则从该信号量的等待队列中移出一个进程,使其从阻塞状态变为就绪状态,并插入到就绪队列中,然后返回当前进程继续执行。

PV操作的物理含义:信号量S值的大小表示某类资源的数量。

当S>0时,其值表示当前可供分配的资源数目;当S<0时,其绝对值表示S信号量的等待队列中的进程数目。

每执行一次P操作,S值减1,表示请求分配一个资源,若S≥0,表示可以为进程分配资源,即允许进程进入其临界区;若S<0,表示已没有资源可供分配,申请资源的进程被阻塞,并插入S的等待队列中,S的绝对值表示等待队列中进程的数目,此时CPU将重新进行调度。

每执行一次V操作,S值加1,表示释放一个资源,若S>0,表示等待队列为空;若S≤0,则表示等待队列中有因申请不到相应资源而被阻塞的进程,于是唤醒其中一个进程,并将其插入就绪队列。

无论以上哪种情况,执行V操作的进程都可继续运行。

1、设公共汽车上,司机和售票员的活动分别是:司机的活动:启动车辆;正常行车;到站停车;售票员的活动:关车门;售票;开车门;在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用P、V操作实现它们的同步。

设两个信号量S和C,初值为S=0;C=0;司机: L1:正常行车售票员: L2:售票到站停车 P(S)V(S)开车门P(C)关车门启动开车 V(C)GO TO L1 GO TO L22、请用PV操作实现他们之间的同步关系:(1)桌上一个盘子,只能放一只水果。

爸爸放苹果,妈妈放桔子,儿子只吃桔子,女儿只吃苹果。

(2)桌上一个盘子,只能放一只水果。

经典PV操作问题详解(最全面的PV资料)

经典PV操作问题详解(最全面的PV资料)

经典P、V操作问题详解lionxcat@一、基本概念1. 信号量struct semaphore{int value; // 仅且必须附初值一次,初值非负PCBtype* wait_queue; // 在此信号量上阻塞的进程队列} S; // 信号量实例为S2. P、V操作P(S){S := S-1;if (S<0)调用进程自己阻塞自己,等待在S的等待队列末尾;}V(S){S := S+1;if (S≤0)从S等待队列头释放一进程就绪在就绪队列尾;调用进程继续执行;}3. 使用方法(i). P、V操作成队出现,处理互斥时出现在同一进程中;处理同步时出现在不同进程中。

(ii). 同步P先于互斥P调用,V的顺序无关。

4. 另类P、V操作导致的问题(或信号量的栈实现方法或漏斗法)[习题P174-23]某系统如此定义P、V操作:P(S): S = S-1; 若S<0,本进程进入S信号量等待队列的末尾;否则,继续执行。

V(S): S=S+1; 若S≤0,释放等待队列中末尾的进程,否则继续运行。

(1)上面定义的P、V操作是否合理?有什么问题?(2)现有四个进程P1、P2、P3、P4竞争使用某一个互斥资源(每个进程可能反复使用多次),试用上面定义的P、V操作正确解决P1、P2、P3、P4对该互斥资源的使用问题。

答:(1)不合理:先进后出;可能“无限等待”,即等待队列头的进程得不到释放。

(2)思路:令每个信号量上的等待队列中始终只有一个进程。

解决方案如下:(n个进程)n个进程至多有n-1个等待。

设置n-1个信号量,每个进程阻塞在不同的信号量上,使每个等待队列至多有一个进程等待。

用循环模拟队列。

Procedure_i(){int j;DO_PRE_JOB();for(j=n-2; j>=0; j--)P(S[j]);DO_JOB_IN_CRITICAL_SECTION();for(j=0;j<=n-2;j++)V(S[j]);……}二、经典进程同步问题总述:进程同步问题主要分为以下几类:一(生产者-消费者问题);二(读者写者问题);三(哲学家就餐问题);四(爱睡觉的理发师问题);五(音乐爱好者问题);六(船闸问题);七(红黑客问题)等。

信号量PV操作

信号量PV操作

操作系统——关于PV操作在操作系统的进程管理中,PV是重点和难点。

先来看一下信号量和PV操作的定义:信号量:信号量是个数据结构。

struct semaphore{int value;pcb *blockqueue;}mutex;其中value是信号量的值;blockqueue是等待使用该信号量的进程排成的队列的对手指针。

PV操作p操作:当一个进程对对信号量mutex执行p操作时,执行两个动作:1mutex.valu–;//申请一个资源2if (mutex.value<0) //申请失败sleep(); //本进程进入该信号量等待队列睡眠v操作:当一个进程对对信号量mutex执行v操作时,执行两个动作:3mutex.value++;//释放一个资源4if (mutex.value>=0) //如果有进程在等待使用本进程wakeup(); //从该信号量的等待队列中唤醒一个进程注:操作系统会保证PV操作的原子性,也就是说当一个进程执行PV 操作,检测信号量时,不受中断。

接下来来看一下PV操作实现的功能:5实现进程之间的互斥;6实现进程之间的同步;区别:互斥是为了保证资源一次只能由一个进程使用;而同步是为了实现进程通信,即传递资源当前的态是否适合一个进程进行使用。

分别看个例子:1.互斥:进出教室问题:有一个变量count,初值为0,一个学生进入教室则count++,出教室则count–。

mutex = 1;IN: OUT:p(mutex); p(mutex);count++; count–;v(mutex); v(mutex);过程:一个学生进入教室执行IN,p操作,mutex.value = 0;假设在进行count++之前遇到了中断,而中断之后跳回来时正好这个学生又在出教室,那么这时候就会执行OUT,mutex.value = -1,该OUT进程进入睡眠,返回IN进程,count = 1,v操作,mutex.value = 0(说明有等待使用count的进程);唤醒OUT进程,count = 0,v操作,mutex.value = 1。

信号量地PV操作(例题)

信号量地PV操作(例题)

???信号量的PV操作是如何定义的?试说明信号量的PV操作的物理意义。

参考答案:P(S):将信号量S减1,若结果大于或等于0,则该进程继续执行;若结果小于0,则该进程被阻塞,并将其插入到该信号量的等待队列中,然后转去调度另一进程。

V(S):将信号量S加1,若结果大于0,则该进程继续执行;若结果小于或等于0,则从该信号量的等待队列中移出一个进程,使其从阻塞状态变为就绪状态,并插入到就绪队列中,然后返回当前进程继续执行。

PV操作的物理含义:信号量S值的大小表示某类资源的数量。

当S>0时,其值表示当前可供分配的资源数目;当S<0时,其绝对值表示S信号量的等待队列中的进程数目。

每执行一次P操作,S值减1,表示请求分配一个资源,若S≥0,表示可以为进程分配资源,即允许进程进入其临界区;若S<0,表示已没有资源可供分配,申请资源的进程被阻塞,并插入S的等待队列中,S的绝对值表示等待队列中进程的数目,此时CPU将重新进行调度。

每执行一次V操作,S值加1,表示释放一个资源,若S>0,表示等待队列为空;若S≤0,则表示等待队列中有因申请不到相应资源而被阻塞的进程,于是唤醒其中一个进程,并将其插入就绪队列。

无论以上哪种情况,执行V操作的进程都可继续运行。

1、设公共汽车上,司机和售票员的活动分别是:司机的活动:启动车辆;正常行车;到站停车;售票员的活动:关车门;售票;开车门;在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?用P、V操作实现它们的同步。

设两个信号量S和C,初值为S=0;C=0;司机: L1:正常行车售票员: L2:售票到站停车 P(S)V(S)开车门P(C)关车门启动开车 V(C)GO TO L1 GO TO L22、请用PV操作实现他们之间的同步关系:(1)桌上一个盘子,只能放一只水果。

爸爸放苹果,妈妈放桔子,儿子只吃桔子,女儿只吃苹果。

(2)桌上一个盘子,只能放一只水果。

PV操作例题

PV操作例题
S1:表示R1是否已向缓冲器存入从键盘上读入的一个数,初始值为0.
S2:表示R2是否已向缓冲器存入从磁盘上读入的一个数,初始值为0.
Begin
S,S1,S2:semaphore;
S:=1;S1:=S2:=0;
Cobegin
process R1
xl:integer
begin
L1:从键盘读一个数;
x1:=读入的数;
儿子
V(SM)
P(SA)
拿苹果
V(SE)
吃苹果
女儿
V(SF)
P(SB)
拿香蕉
V(SE)
吃香蕉
问题6有一个超市,最多可容纳N个人进入购物,当N个顾客满员时,后到的顾客在超市外等待;超市中只有一个收银员。可以把顾客和收银员看作两类进程,两类进程间存在同步关系。写出用P;V操作实现的两类进程的算法(2003年系统设计员考试的题目)
答:这四个进程实际上是两个生产者R1,R2和两个消费者W1,W2.各自生成不同的产品中各自的消费对象去消费,他们共享一个的缓冲器。由于缓冲器只能存放一个数,所以,R1和R2在存放数时必须互斥。而R1和W1、R2和W2之间存在同步。为了协调它们的工作可定义三个信号量:
S:表示能否把数存人缓冲器B,初始值为1.
(3)解:从东向西的,和(2)相同;从西向东的和(1)相同。
问题4有一个俱乐部,有甲乙两个服务员,当顾客有请求时,甲负责送烟,乙负责送火,无顾客请求时,服务员睡眠。顾客自己不能带烟和火,当顾客要抽烟时,可请求服务员送烟和火,烟和火还未送到时,顾客必须等待。
设信号量:SY, SH,CY,CH:初值都为0
(1)解
设信号量MUTEX=1
P (MUTEX)
过桥
V (MUTEX)

pv操作

pv操作

用信号量机制来解决进程的同步与互斥:PV操作首先确定进程间的关系,然后确定信号量及其值。

判断进程间是否互斥的关键:看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。

确定信号量的值是一个关键点,它代表了可用资源实体数。

举例:票大厅容纳的人数限制为20人,少于20人时购票者可以进入,否则要在厅外等候。

进程间是同步时:是否存在合作关系,是否需要互通消息首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。

举例:公交车上司机与售票员的行为,司机到站停车后,售票员方可开门,售票员关门后,司机方可开车。

例1生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:(1)进程A专门拣黑子,进程B专门拣白子;(2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;分析:第一步:确定进程间的关系。

由功能(2)可知进程之间是互斥的关系。

第二步:确定信号量及其值。

由于进程A和进程B要互斥进入箱子去拣棋子,箱子是两个进程的公有资源,所以设置一个信号量s,其值取决于公有资源的数目,由于箱子只有一个,s的初值就设为1。

实现:begins:semaphore;s:=1;cobeginprocess AbeginL1: P(s);拣黑子;V(s);goto L1;end;process BbeginL2:P(s);拣白子;V(s);goto L2;end;coend;end;例2某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待。

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

分析:第一步:确定进程间的关系。

售票厅是各进程共享的公有资源,当售票厅中多于20名购票者时,厅外的购票者需要在外面等待。

操作系统PV操作经典例题与答案

操作系统PV操作经典例题与答案

操作系统PV操作经典例题与答案1. 推广例子中的消息缓冲问题。

消息缓冲区为k个,有1个发送进程,n个接收进程,每个接收进程对发送来的消息都必须取一次若有m个发送进程呢?Send:SB=k; //信号量,标记当前空余缓冲区资源。

i = 0; //标记存放消息的缓冲区位置while (true) {P(SB);往Buffer [i]放消息;V(SM);i = (i+1) % k;};Receive:j = 0; //标记取产品的缓存区位置SM=0;//信号量,标记初始没有消息ReadCount=0;//读进程计数器Mutex =1;//读进程互斥信号量SW=0; //信号量,读进程在此信号量等待while (true) {P(SM);从Buffer[j]取消息;ReadCount++If(ReadCount<n){< p="">V(SM);P(SW)}else{V(SB);j = (j+1) % k;for(int g=1; g< ReadCount;g++)V(SW);ReadCount=0;}};2.第二类读者写者问题:写者优先条件:1)多个读者可以同时进行读2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行)3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)rc=0, //正在读者计数器wc, //写计数器rw, //读等计数器R //等待读信号量W //等待写信号量读者:while (true) {P(mutex);if (wc >0){rw++P (R);}rc++;If(rw>0&&wc=0){V(R)rw--}V(mutex);读P(mutex);rc --;if (rc==0){If(wc>0)V(w)}V(mutex);};写者:while (true) {P(mutex);wc ++;if((wc >1)||(rc>0)){P(W)}V(mutex);写P(mutex);Wc --;if(wc>0)V(W);Else if(rw>0)V(R)rw--V(mutex);};3.理发师睡觉问题理发店里有一位理发师,一把理发椅和N把供等候理发的顾客坐的椅子如果没有顾客,则理发师便在理发椅上睡觉。

典型例题PV操作

典型例题PV操作
试写出读者“进入”和“注销”之间的同步算法。
答:读者的动作有两个,一是填表进入阅览室读书,这时要考虑阅览室里是否有座位;二是读者阅读完毕,需要注销登记再离开阅览室,这时的操作要考虑阅览室里是否有读者存在。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。
因此,设置算法所涉及的三个信号量:empty资源信号量——表示阅览室里的空座位的数目,初值为100;full资源信号量——表示阅览室里有人的座位的数目(或表示阅览室里的读者的数目),初值为0;mutex互斥信号量——表示对登记表这个临界资源的互斥访问,初值设为1。
使用信号量机制对读者“进入”阅览室和“注销”登记之间的同步算法描述如下:
Semaphoreempty,full,mutex;//首先定义两个资源信号量empty、full和一个互斥信号量mutex
empty.value=100;full.value=0;mutex.value=1;
cobegin
process getin() //读者“进入”阅览室的进程过木桥;wait(SB);
countB:=countB-1;
if (countB=0) then signal(mutex);
signa(SB);
end
parend
end
2、有一阅览室,共有100个座位。为了很好利用它,读者进入时必须先在登记表上进行登记。该表表目设有座位号和读者姓名;离开时再将其登记项摈除。试用P、V操作描述进程之间的同步或算法。
Var SA,SB,mutex:semaphore:=1,1,1;
CountA,countB:integer:=0,0:
begin
parbegin
processA: begin

6.信号量与PV操作

6.信号量与PV操作

9 0
3.3.4 生产者消费者问题
① ② ③ ④ ⑤ ⑥ 一个生产者、一个消费者共享一个缓冲区 一个生产者、一个消费者共享多个缓冲区 多个生产者、多个消费者共享多个缓冲区 多个生产者、多个消费者共享一个缓冲区 多个生产者、一个消费者共享多个缓冲区 一个生产者、多个消费者共享多个缓冲区
一个生产者一个消费者共享一个缓冲区的解
记 录 型 信 号 量 解 决 理 发 师 问 题
var waiting : integer; /*等候理发的顾客数*/ CHAIRS:integer; /*为顾客准备的椅子数*/ customers, barbers,mutex : semaphore; customers := 0;barbers:=1; waiting:=0; mutex := 1; procedure barber; begin while(TRUE); /*理完一人,还有顾客吗?*/ P(cutomers); /*若无顾客,理发师等顾客*/ P(mutex); /*进程互斥*/ waiting := waiting – 1; /*等候顾客数少一个*/ V(mutex); /*开放临界区*/end; cut-hair( ); /*正在理发*/ V(barbers); /*理发师唤醒下一个顾客*/ procedure customer begin P(mutex); /*进程互斥*/ if waiting<CHAIRS begin /*看看有没有空椅子*/ waiting := waiting+1; /* 等候顾客数加1*/ V(mutex); /*开放临界区*/ V(customers); /*必要的话唤醒理发师 */ P(barbers); /*无理发师, 顾客坐着等理发师*/ get-haircut( ); /*一个顾客坐下等理发*/ end else V(mutex); /*人满了,走吧!*/ end;

pv例题详解

pv例题详解

pv例题详解
PV操作是操作系统中的一种常见概念,P表示进程请求资源,V表示进程
释放资源。

在PV操作中,通常使用信号量(semaphore)来实现进程间的同步和互斥。

以下是一个PV操作的示例,解决的是“过独木桥”问题:
假设有两个方向的行人需要过同一座独木桥,当某一方向的行人过桥时,另一方向的行人必须等待。

当某一方向无人过桥时,另一方向的行人可以过桥。

首先,定义两个信号量s1和s2,分别表示是否允许某一方向的行人过桥。

初始时,s1和s2都为0。

然后,定义两个进程,一个是代表东行方向行人的进程,另一个是代表西行方向行人的进程。

东行方向的进程执行以下操作:
1. P(s1):如果s1小于0,表示西行方向的行人正在过桥,东行方向的行人需要等待;否则,继续执行下一步。

2. 过桥:表示东行方向的行人正在过桥。

3. V(s2):释放西行方向的行人的过桥权限,将s2加1。

西行方向的进程执行以下操作:
1. P(s2):如果s2小于0,表示东行方向的行人正在过桥,西行方向的行人需要等待;否则,继续执行下一步。

2. 过桥:表示西行方向的行人正在过桥。

3. V(s1):释放东行方向的行人的过桥权限,将s1加1。

通过以上操作,可以保证同一方向的行人连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。

以上是一个简单的PV操作示例,实际应用中需要根据具体问题进行分析和设计。

信号量与PV操作

信号量与PV操作

哲学家吃通心面问题 问题
有五个哲学家围坐在一圆桌旁, 有五个哲学家围坐在一圆桌旁 , 桌中央 有一盘通心面, 每人面前有一只空盘于, 有一盘通心面 , 每人面前有一只空盘于 , 每两人之间放一把叉子。 每个哲学家思 每两人之间放一把叉子 。 饥饿、 然后吃通心面。 为了吃面, 考 、 饥饿 、 然后吃通心面 。 为了吃面 , 每个哲学家必须获得两把叉子, 每个哲学家必须获得两把叉子 , 且每人 只能直接从自己左边或右边去取叉子
记录型信号量与PV操作 记录型信号量与PV操作
推论1 若信号量s为正值, 推论 1 : 若信号量 s 为正值 , 则该值等于在封 锁进程之前对信号量s可施行的P操作数、 锁进程之前对信号量 s 可施行的 P 操作数 、 亦 等于s 等于s所代表的实际还可以使用的物理资源数 推论2 若信号量s为负值, 推论 2 : 若信号量 s 为负值 , 则其绝对值等于 登记排列在该信号量s 登记排列在该信号量s队列之中等待的进程个 亦即恰好等于对信号量s实施P 数 、 亦即恰好等于对信号量 s 实施 P 操作而被 封锁起来并进入信号量s 封锁起来并进入信号量s队列的进程数 推论3 通常, 操作意味着请求一个资源, 推论3:通常,P操作意味着请求一个资源,V 操作意味着释放一个资源。在一定条件下, 操作意味着释放一个资源。在一定条件下,P 操作代表挂起进程操作, 操作代表挂起进程操作,而V操作代表唤醒被 挂起进程的操作
一个生产者一个消费者共享一个缓冲区
B : integer; sput:semaphore; sput:semaphore ; /* 可以使用的空缓冲区数 */ sget:semaphore; /* 缓冲区内可以使用的产品数 */ sput := 1; /* 缓冲区内允许放入一件产品 */ sget := 0; /* 缓冲区内没有产品 */ process producer process consumer begin begin L1: L2: product; produce a product ; P(sget); B; P(sput); product:= B ; product; B := product ; V(sput); product; V(sget); consume a product ; goto L1; goto L2; end; end;

PV操作

PV操作

进程通信:指进程间的信息交换过程进程通信方式:互斥、同步、消息缓冲一、开、关锁进程进入临界资源的操作:1:检查X的值.X=1,表示资源正在使用,返回继续进行检查;X=0,表示资源可以使用,X:=1(关锁); 2:进入临界区,访问临界资源;3:释放临界资源, X:=0(开锁).二、P、V操作P/V操作、信号量♦P/V操作由P操作原语和V操作原语组成,意义是:在一个整型变量S上定义了两个操作。

♦信号量:整型变量S称为信号量,仅能由P、V操作修改的整型变量。

P操作♦P操作:申请资源操作(1)S:=S-1;(2)如果S≥0,则表示有资源,该进程继续执行;如果S<0,则表示已无资源,执行原语的进程被置成阻塞状态,并使其在S信号量的队列中等待,直至其他进程在S上执行V操作释放它为止。

V操作V操作:释放资源操作(1)S:=S+1;(2)如果S>0,则该进程继续执行;如果S≤0,则释放S信号量队列的排头等待者并清除其阻塞状态,即从阻塞状态转变到就绪状态,执行V(S)者继续执行。

三、消息缓冲消息缓冲消息:进程之间以不连续的成组方式发送的信息消息缓冲区:包含有指向发送进程的指针、指向消息接受进程的指针、指向下一个消息缓冲区的指针、消息长度、消息内容等信息的一个缓冲区。

是进程通信的基本单位。

四、P、V操作例题Var信号量、变量Process 1Begin……End……Process nBegin……Endbegin初始化cobegin并发进程……并发进程coendendVar信号量、变量begin初始化cobeginprocedure1;begin……end……proceduren;begin……endcoendend1、生产者、消费者问题var mutex,empty,full:psemaphore;i,j,goods:integer;buffer:array [0…n-1] of item;procedure producer;生产者进程beginwhile true dobeginproduce next product;P(empty);P(mutex);buffer(i):=product;i:=(i+1) mod(n);V(mutex);V(full);endend;procedure consumer;消费者进程beginwhile true dobeginP(full);P(mutex);goods:= buffer(j) ;j:=(j+1) mod(n);V(mutex);V(empty);consume product ;endend;beginseminitial (mutex.v,1;empty.v,n;full.v,0);i:=j:=0;cobeginproducer;consumer;coendend2、设有三个进程A、B、C,其中A与B构成一对生产者与消费者(A 为生产者,B为消费者),共享一个由n个缓冲块组成的缓冲池;B 与C也构成一对生产者与消费者(此时B为生产者,C为消费者),共享另一个由m个缓冲块组成的缓冲池。

信号量及P、V操

信号量及P、V操

分析
通过分析可知,CP、IOP必须遵守以下 同步规则: • 当CP进程把计算结果送入缓冲区时,IOP 进程才 能从缓冲区中取出结果去打印; • 当IOP进程把缓冲区中的数据取出打印后, CP进程才能把下一个计算结果送入缓冲 区

• 为此设有两个信号量Sa=0,Sb=1,Sa表示缓冲区 中有无数据,Sb表示缓冲区中有无空位置。 • 两个进程的同步可以描述如下:
总结 进程互斥: 进程互斥:在OS中,当某一进程正在访问cs时,就不 允许其它进程来读写(访问),否则就会发 生后果无法估计的错误,进程之间的这种 相互制约关系为进程互斥。 进程同步: 进程同步: 并发进程在一些关键点上可能需要互相等 待与互通消息,这种相互制约的等待与互 通消息,称为进程同步。
进程同步与互斥关系: 进程同步与互斥关系 : 都反映了在异步环境下并发 进程间的相互制约关系。可归于同步范 畴,但互斥是同步问题的一个特例,互 斥解决临界区的使用,同步是并发进程 在一些关键点上需互相等待互发消息。

(1)定义二个信号量S1、S2,初值均为1, 即:S1=1,S2=1。其中进程A和C使用 信号量S1,进程B和D使用信号量S2。 (2)从[1]到[8]分别为:P(S1) V(S1) P(S2) 2 [1] [8] P(S1) V(S2) P(S1) V(S1) P(S2) V(S2)
【思考题】
【思考题】
• 四个进程A、B、C、D都要读一个共享文件F, 系统允许多个进程同时读文件F。但限制是 进程A和进程C不能同时读文件F,进程B和 进程D也不能同时读文件F。为了使这四个进 程并发执行时能按系统要求使用文件,现用 PV操作进行管理,请回答下面的问题:
• (1)应定义的信号量及初值: • (2)在下列的程序中填上适当的P、V操作,以 保证它们能正确并发工作: • A() B() C() D() • { { { { • [1]; [3]; [5]; [7]; • read F; read F; read F; read F; • [2]; [4]; [6]; ,S2,初值均为0。 司机进程: 司机进程: while(1) { P(S1) 启动车辆 正常驾驶 到站停车 V(S2) }… 售票 员 进程 : while(1) { 关门 V(S1) 售票 P(S2) 开门
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

信号量及P、V操作练习
(进程互斥实例)某小型超级市场,可容纳50人同时购物。

入口处有篮子,每个购物者可拿一只篮子入内购物。

出口入结账,并归还篮子(出、入口禁止多人同时通过)。

试用信号量和P、V操作写出购物物者的同步算法。

考虑:1、出、入口合一;2、出、入口分开。

①所用信号量设置如下:
Ⅰ)互斥信号量S,初值为50,用以保证最多可以有50个购物者同时进入超市。

Ⅱ)互斥信号量mutex1、mutex2,初值为1,用以保证同时只能有一个购物者进程进入出、入口拿起篮子或者结帐后放下篮子。

②用信号量机制给出的每个购物者购物过程的算法描述如下:
购物者进程:
P(S);
P(mutex1);
从入口处进超市,并取一只篮子;
V(mutex1);
进超市内选购商品;
P(mutex2);
到出口结帐,并归还篮子;
V(mutex2);
从出口离开超市;
V(S)
(生产者消费者问题实例)桌上有个只能盛得下一个水果的空盘子。

爸爸可向盘中放苹果和桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。

规定:当盘子空时,一次只能放入一个水果供者取用。

要求:试用信号量和P、V操作实现爸爸、儿子和女如鱼得水这三个循环进程之间的同步。

一、Ⅰ)爸爸进程的同步信号量empty,初值为1,表示盘子是空的,即儿子或女儿已把盘中的水果取走。

Ⅱ)儿子进程的同步信号量orange,初值为0,表示爸爸尚未把桔子放入盘中。

Ⅲ)女儿进程的同步信号量apple,初值为0,表示爸爸尚未把苹果放入盘中。

●爸爸进程(P):儿子进程(C1):女儿进程(C2):
●P(empty);P(orange );P(apple);
●将水果放入盘中;从盘中取出桔子;从盘中取出苹果;
●若放入的是桔子,V(empty);V(empty);
●则V(orange);吃桔子;吃苹果;
●否则,V(apple);
二、
●Semaphore S=1,S1=S2=0;
●void father()
●{
●while(1)
●{
●准备苹果;
●wait(S);
●将苹果放在盘子内;
●signal(S1);
●}
●}
●void mother()
●{
●while(1)
●{
●准备橘子;
●wait(S);
●将橘子放在盘子内;
●signal(S2);
●}
●}

●void daughter()
●{
●while(1)
●{
●wait(Sl);
●从盘子里拿走苹果;
●signal(S);
●吃苹果;
●}
●}
●void son()
●{
●while(1)
●{
●wait(S2);
●从盘子里拿走橘子;
●signal(S);
●吃橘子;
●}
●}

●main()
●{
●cobegin{
●father();
●mother();
●daughter();
●son();
●}
●}


(读者写者问题实例)设A、B两点之间是一段东西向的单行车道,现在要设计一个AB路段自动管理系统,管理规则如下:当AB间有车辆在行驶时同方向的车可以驶入AB段,但另一方向的车必须在AB段外等待;当AB段之间无车辆行驶时,到达AB段的任一方向的车都可以进入AB段,但不能从两个方向同时驶入,即可能有一个方向的车驶入;当某方向在AB段行驶的车辆驶出了AB段且暂无车辆进入AB段时,应让另一方向等待的车辆驶入AB段行驶。

试用信号量和P、V操作管理AB路段车辆的行驶。

解析:
读者-写着问题的变形。

我们设置3个信号量S1、S2和Sab,分别用于从a点进入的车互斥访问共享变量ab(用于记录当前ab段上由a点进入的车辆的数量),从b点进入的车互斥访问共享变量ba(用于记录当前ab段上由b点进入的车辆的数量)和a、b点的车辆互斥进入ab段。

3个信号量的初值分别为1、1和1,两个共享变量ab和ba的初值分别为0、0。

Semaphore S1=1,S2=1,Sab=1;
int ab=ba=0;
void Pab ()
{
while(1)
{
wait(S1);
if(ab==0) wait(Sab);
ab=ab+1;
signal(S1);
车辆从a点驶向b点;
wait(S1);
ab=ab-1;
if(ab==0) signal(Sab);
signal(S1);
}
}
void Pba ()
{
while(1)
{
wait(S2);
if(ba==0) wait(Sab);
ba=ba+1;
signal(S2);
车辆从b点驶向a点;
wait(S2);
ba=ba-1;
if(ba==0) signal(Sab);
signal(S2);
}
}
main()
{
cobegin{ Pab (); Pba (); }
}。

相关文档
最新文档