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)
操作系统PV操作习题
一、用P、V操作描述前趋关系。P1、P2、P3、P4、P5、 P6为一组合作进程,其前趋图如图2.3所示,试用P、V 操作描述这6个进程的同步。p23 图2.3说明任务启动后P1先执行,当它结束后P2、P3可以开始执行,P2完成后P4、P5可以开始执行,仅当P3、P4、P5都执行完后,P6才能开始执行。为了确保这一执行顺序,设置5个同步信号量n、摄、f3、f4、g分别表示进程P1、P2、P3、P4、P5是否执行完成,其初值均为0。这6个进程的同步描述如下:
图2.3 描述进程执行先后次序的前趋图 int f1=0; /*表示进程P1是否执行完成*/int f2=0; /*表示进程P2是否执行完成*/int f3=0; /*表示进程P3是否执行完成*/int f4=0; /*表示进程P4是否执行完成*/int f5=0; /*表示进程P5是否执行完成*/main() { cobegin P1( ); P2( ); P3( ); P4( ); P5( ); P6( ); coend } P1 ( ) { ┇ v(f1); v(f1): } P2 ( ) { p(f1); ┇ v(f2);
v(f2); ) P3 ( ) { p(f1); ┇ v(f3); } P4( ) { p(f2); ┇ v(f4); } P5 ( ) { p(f2); ┇ v(f5); } P6( ) { p(f3); p(f4); p(f5); ┇ } 二、生产者-消费者问题p25
生产者-消费者问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。生产者-消费者问题是许多相互合作进程的一种抽象。例如,在输入时,输入进程是生产者,计算进程是消费者;在输出时,计算进程是生产者,打印进程是消费者。因此,该问题具有很大实用价值。 我们把一个长度为n的有界缓冲区(n>0)与一群生产者进程P1、P2、…、Pm和一群消费者进程C1、C2、…、Ck 联系起来,如图2.4所示。假定这些生产者和消费者是互相等效的。只要缓冲区未满,生产者就可以把产品送入缓冲区,类似地,只要缓冲区未空,消费者便可以从缓冲区中取走物品并消耗它。生产者和消费者的同步关系将禁止生产者向满的缓冲区输送产品,也禁止消费者从空的缓冲区中提取物品。 图2.4 生产者-消费者问题 为解决这一类生产者-消费者问题,应该设置两个同步信号量,一个说明空缓冲单元的
P,V操作经典例题
P就是请求资源,V就是释放资源。 问题1 一个司机与售票员的例子 在公共汽车上,为保证乘客的安全,司机和售票员应协调工作: 停车后才能开门,关车门后才能行车。用PV操作来实现他们之间的协调。 S1:是否允许司机启动汽车的变量 S2:是否允许售票员开门的变量 driver()//司机进程 { while (1)//不停地循环 { P(S1);//请求启动汽车 启动汽车; 正常行车; 到站停车; V(S2); //释放开门变量,相当于通知售票员可以开门 } } busman()//售票员进程 { while(1) { 关车门; V(S1);//释放开车变量,相当于通知司机可以开车 售票 P(S2);//请求开门 开车门; 上下乘客; } } 注意:busman() driver() 两个不停循环的函数 问题2 图书馆有100个座位,每位进入图书馆的读者要在登记表上登记,退出时要在登记表上注销。要几个程序?有多少个进程?(答:一个程序;为每个读者设一个进程) (1)当图书馆中没有座位时,后到的读者在图书馆为等待(阻塞) (2)当图书馆中没有座位时,后到的读者不等待,立即回家。 解(1 )
设信号量:S=100; MUTEX=1 P(S) P(MUTEX) 登记 V(MUTEX) 阅读 P(MUTEX) 注销 V(MUTEX) V(S) 解(2) 设整型变量COUNT=100; 信号量:MUTEX=1; P(MUTEX); IF (COUNT==0) { V(MUTEX); RETURN; } COUNT=COUNT-1; 登记 V(MUTEX); 阅读 P(MUTEX); COUNT=COUNT+1; V(MUTEX); RETURN; 问题3 有一座东西方向的独木桥;用P,V操作实现: (1)每次只允许一个人过桥; (2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。 (3)当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。 (1)解 设信号量MUTEX=1 P (MUTEX) 过桥 V (MUTEX) (2)解 设信号量:MUTEX=1 (东西方互斥) MD=1 (东向西使用计数变量互斥) MX=1 (西向东使用计数变量互斥)
银行排队服务问题pv操作
Process A //对公服务用户 { P(&mutex) If(incustoms==10)//里面座位已满 { 产生随机数判断用户是离开,还是门口等待 If(顾客选择等待) { Outcustoms++; } Else //顾客选择离开 {返回;} V(&mutex); P(&out); Outcustoms--; } Else { V(&mutex); } P(&seat); P(&h-mutex); 在取号机上取号 取号成功,等待服务 Incustoms++; V(&h-mutex) V(&hsemaphorepubcus) } Process B //对公服务窗口 { P(&hsemaphorepubcus) 通过叫号,为队列中的对公顾客服务 If(outcustoms>0) { V(&seat) V(&out) Incustoms--; } Else {
Incustoms--; } Process C //对公服务用户 { P(&mutex) If(incustoms==10)//里面座位已满 { 产生随机数判断用户是离开,还是门口等待 If(顾客选择等待) { Outcustoms++; } Else //顾客选择离开 {返回;} V(&mutex); P(&out); Outcustoms--; } Else { V(&mutex); } P(&seat); P(&h-mutex); 在取号机上取号 取号成功,等待服务 Incustoms++; V(&h-mutex) V(&hsemaphorepricus) } Process B //对公服务窗口 { P(&hsemaphorepricus) 通过叫号,为队列中的对公顾客服务 If(outcustoms>0) { V(&seat)
经典PV操作问题
经典P、V操作问题详解 lionxcat@https://www.360docs.net/doc/fa2162935.html, 一、基本概念 1. 信号量 struct semaphore { int value; // 仅且必须附初值一次,初值非负 PCBtype* wait_queue; // 在此信号量上阻塞的进程队列 } S; // 信号量实例为S 2. 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个信号量,每个进程阻塞在不同的信号量上,使每个等待队列至多有一个进程等待。用循环模拟队列。
pv操作典型例题
例1 在某展示厅设置一个自动计数系统,以计数器count表示在场的人数,count是动态变化的,若有一个人进入展示厅进程pin对计数器count加1,当有一个人退出展示厅时,进程pout实现计数器减1。由于进、出所以展示厅的人是随机的,用P-V操作实现。(并发进程之间的互斥问题) 解:定义信号量:S——表示是否有进程进入临界区,初值为1.(表示没有进程进入临界区)begin count: Integer; S: semaphore; count:=0; S:=1; cobegin process Pin R1: Integer; begin P (S); R1:=count; R1:=R1+1; count:=R1; V(S); end; Process Pout R2: Integer;
begin P (S); R2:=count; R2:=R2-1; count:=R2; V (S); end; count; end; 例2 与生产者和消费过者相似的问题,把―A进程将记录送入缓冲器‖看生产者生产了一件物品且把物品存入缓冲器,把―B进程从缓冲器中取出记录并加工‖看作是消费者从缓冲器取出物品去消费,缓冲器中只能放一个记录(一件物品),用P-V操作实现。(并发进程之间的同步问题) 解:定义两个信号量为:sp和sg。 sp:表示生产者是否右以把物品存入缓冲器。由于缓冲器只能存放一个物品,因此sp的初值为1,即sp:=1。 sg:表示缓冲是否存有物品,它的初值应该为0,即sg:=0,表示缓冲器中还没有物品存在。 生产者和消费者两个进程并发执行时,可按以下的方式实现同步: sp:=1;sg:=0; cobegin
PV操作题
PV操作题 1.独木桥问题:若规定同一方向的人可连续过桥,但同时在桥上人 数最多4人,当某方向无人过桥后,另一方向的人才能过桥.请用PV操作模拟实现. 2.独木桥问题:若规定同一方向的人可连续过桥最多10人,当某方 向连续通过达到10人后,另一方向的人才能过桥.请用PV操作模拟实现. 3.类似题目:车辆过单行隧道,火车过单行轨道 4.有一阅览室只能容纳100人(每人一个座位),读者进入时必须先在一张登记表上登记一个座位,离开时要销掉登记内容。请用PV机制描述读者进程的同步关系。 5.超市购物过程:共有100个购物篮,每人进入取一个篮子购物,出去结帐并归还篮子。出入口共用一个通道。 6.地下停车场车位管理。(共100个车位) 7.某银行最多只允许容纳N个储户办理业务,如果此时银行只有一个柜员,将此柜员和储户的行为看成两个不同进程,请用PV操作模拟上述过程。 其中储户取号等待叫号,若叫到则到柜员处办理业务,结束自行离开;柜员按顺序叫号并为储户办理业务,若N个号已取完需结束当前业务后才能让后来者取号
8. 某银行最多只允许容纳N个储户办理业务,如果此时银行有M个柜员,将此柜员和储户的行为看成两个不同进程,请用PV操作模拟上述过程。 其中储户取号等待叫号,若叫到则到柜员处办理业务,结束自行离开;柜员按顺序叫号并为储户办理业务,若N个号已取完需结束当前业务后才能让后来者取号,但是柜员间叫号是互斥的 9.有个师傅和三个徒弟,徒弟不断组装产品,做一个产品需要A,B,C 三种零件(分别被三个徒弟掌握),师傅不断提供上述三种零件,但每次只能将其中两种放到桌上,具有另一种零件的徒弟则组装产品,且做完后向师傅发信号,然后师傅再拿出两种零件放到桌上,如此反复,请用PV操作模拟上述活动。 10.书本上司机和售票员问题 后续内容继续更新中……
PV操作题
1、某寺庙有小、老和尚若干,有一水缸,由小和尚提水入缸供老和尚饮用。水缸可以容纳10桶水,水取自同一井水。水井狭窄,每次只能容一个桶取水。水桶总数为3个。每次入、出水缸仅一桶,且不可同时进行。试给出有关取水、入水的算法描述。 Var mutex1, mutex2, empty, full, count: semaphore; mutex1:=1; mutex2:=1; empty:=10; full:=0; count:=3; process 小和尚: begin repeat wait(empty); wait(count); wait(mutex1); 从井中取水; signal(mutex1); wait(mutex2); 送水入水缸; signal(mutex2); signal(count); signal(full); until false; end process 老和尚: begin repeat wait(full); wait(count); wait(mutex2); 从缸中取水; signal(mutex2); signal(empty); signal(count); until false; end 2、桌子上有一个空盘子,允许存放一只水果,爸爸可以向盘中放苹果,妈妈向盘子中放橘子,女儿专门吃盘子中的苹果,儿子专门吃盘子中的橘子。规定当盘子空的时候一次只能放一只水果,请用信号量实现他们之间的同步与互斥。 3:有一个阅览室,读者进入时必须先在一张登记表上进行登记,该表为每一座位列一表目,包括座号和读者姓名,读者离开时,要删掉登记的信息,阅览室共有100个座位,试问: (1)为描写读者动作,应编写几个程序,应设置几个进程?进程与程序间关系如何? (2)试问P、V操作写出这些进程间的同步算法。 解法1: