用PV操作实现进程同步的示例
pv操作2
线程是进程的一个组成部分,一个进程可以有多个线程,而且至少有一个可执行线程。
进程的多个线程都在进程的地址空间内活动。
资源是分给进程的,而不是分给线程的,线程需要资源时,系统从进程的资源配额中扣除并分配给它。
处理机调度的基本单位是线程,线程之间竞争处理机,真正在处理机上运行的是线程。
线程在执行过程中,需要同步。
例题1解:设信号量初值S=1汽车进程Pi(i=1,2,3,…)到达桥头P(s)桥行驶到达桥另一端V(s)例题二若有一售票厅只能容纳300人,当少于300人时,可以进入。
否则,需在外等候,若将每一个购票者作为一个进程,请用P、V操作编程。
解:信号量初值S=300购票者进程Pi(i=1,2,3,…)P(s)进入售票厅购票退出售票厅V(s)例题三有一只铁笼子,每次只能放入一只动物,猎手向笼中放入老虎,农民向笼中放入猪,动物园等待取笼中的老虎,饭店等待取笼中的猪,试用P、V操作写出能同步执行的程序。
解:两个生产者和两个消费者共享了一个仅能存放一件产品的缓冲器,生产者各自生产不同的产品,消费者各自取自己需要的产品,P、V操作编程为:猎手进程农民进程动物园进程饭店进程P(s) P(s) P(s1) P(s2)放入虎放入猪买老虎买猪V(s1) V(s2) V(s) V(s)其中S初值=1,S1=S2=0例题四桌上有一只盘子,每次只能放入一个水果。
爸爸专向盘中放苹果,妈妈专向盘中放桔子,女儿专等吃盘中的苹果,儿子专等吃盘中的桔子。
用P、V操作写出它们能正确同步的程序。
解:信号量初值S1=0,S2=0,S=1爸爸进程妈妈进程女儿进程儿子进程repeat repeat repeat repeatP(s) P(s) P(s1) P(s2)放苹果放桔子取苹果取桔子V(s1) V(s2) V(s) V(s)until false until false until false until false例题五设有两个优先级相同的进程P1和P2如下,S1和S2初值均为0,求:P1,P2并发执行结束后,x,y,z分别是多少?进程P1进程P2y:=1; x:=1;y:=y+2; x:=x+1;V(s1); P(s1);z:=y+1; x:=x+y;P(s2); V(s2)y:=z+y; z:=x+z;解:因为P1、P2是并发进程,所以P1和P2调度顺序不确定。
pv操作题目 软考
PV操作在软考中的深入探讨1. 基本概念PV操作是用于进程同步的两种基本操作。
P操作通常表示为一个进程需要一个资源,而V操作表示释放一个资源。
这两种操作通常用于实现进程间的同步和互斥。
2. PV操作原理PV操作基于信号量机制。
信号量是一个整数值,通常用于表示资源的数量。
P操作会尝试获取资源,减少信号量的值;而V操作会释放资源,增加信号量的值。
如果P操作不能立即获得资源(即信号量为0),则该进程会被阻塞或等待,直到资源可用。
3. PV操作在进程同步中的应用PV操作在进程同步中有着广泛的应用。
例如,在生产者-消费者问题中,生产者用于生成数据,消费者用于消费数据。
通过PV操作,可以确保生产者在没有数据被消费之前不会继续生产,同时确保消费者在没有数据可供消费时不会继续消费。
4. PV操作和互斥量互斥量是一种特殊的信号量,其值只能为0和1。
当一个进程获得互斥量时,其他任何进程都无法获得该互斥量,直到第一个进程释放它。
这使得互斥量可以用于保护某些临界区域,以实现互斥访问。
PV操作和互斥量通常一起使用,以实现更复杂的同步问题。
5. PV操作的编程实现在大多数编程语言中,PV操作可以通过系统调用或库函数实现。
例如,在UNIX系统中,可以使用semop函数进行PV操作。
在实现PV操作时,需要注意避免死锁和饥饿等问题。
6. PV操作的复杂度分析PV操作的复杂度取决于所使用的算法和数据结构。
在一些算法中,例如二叉堆或斐波那契堆,PV操作的平均时间复杂度可以达到O(1)。
然而,在最坏的情况下,PV操作的复杂度可能会达到O(n),其中n是信号量的值。
7. PV操作与信号量信号量是一种同步机制,用于控制多个进程对共享资源的访问。
PV操作是信号量机制中的基本操作,通过它们可以实现对共享资源的互斥访问和同步。
信号量通常用于保护临界区、实现进程间的同步和互斥等。
8. PV操作与死锁预防死锁是操作系统中的一个重要问题,它发生在两个或多个进程无限期地等待对方释放资源的情况。
网络操作系统 习题PV操作
分析:四人之间的关系: 1父亲,母亲要互斥使用盘子,所以两者之间是互斥关系; 2父亲放的苹果,女儿吃,所以两者是同步关系; 3母亲放的桔子,儿子吃,所以两者也是同步关系。 semaphore S_Plate=1, S_Apple=0, S_Orange=0; void son( ) // 儿子进程 { while(1) { P(S_Orange); 从盘中取出一个 桔子; V(S_Plate); 吃桔子; } }
吃水果问题2
题目:桌上有一只盘子,允许存放一个水果,父亲 专向盘中放苹果,母亲专向盘中放桔子,儿子专等 吃盘里的桔子,女儿专等吃盘里的苹果。只要盘子 空,则父亲或母亲可向盘中放水果,仅当盘中有自 己需要的水果时,儿子或女儿可从中取出。 请给出四人之间的同步关系,并用PV操作实现四人 正确活动的程序。
试用P、V操作写出能同步执行的程序。
使用信号量解决取动物问题
分析:四者之间的关系: 1.猎人和农民要互斥使用笼子,所以两者之间是互斥关系; 2.猎人放老虎,动物园取老虎,所以两者是同步关系; 3.农民房猪,饭店取猪,所以两者也是同步关系。
semaphore S_EmptyCage=1, S_Tiger=0, S_Pig=0; void hunter( ) // 猎人进程 { while(1) { P(S_EmptyCage); 往笼子里放入一只老虎; V(S_Tiger); } } void zoo( ) // 动物园进程 { while(1) { P(S_Tiger); 从笼子里取出一只老虎; V(S_EmptyCage);; } } void farmer( ) // 农民进程 { while(1) { P(S_EmptyCage); 往笼子里放入一只猪; V(S_Pig); } } void restaurant( ) // 饭店进程 { while(1) { P(S_Pig); 从笼子里取出一只猪; V(S_EmptyCage);; } }
PV操作经典例题
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=1P(S)P(MUTEX)登记V(MUTEX)阅读P(MUTEX)注销V(MUTEX)V(S)问题3 有一座东西方向的独木桥;用P,V操作实现:(1)每次只允许一个人过桥;(2)当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待。
(3)当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向,只允许一个人单独过桥。
(此问题和读者与写者问题相同,东向西的为读者,西向东的为写者)。
(1)解设信号量MUTEX=1P (MUTEX)过桥V (MUTEX)(2)解设信号量:MUTEX=1 (东西方互斥)MD=1 (东向西使用计数变量互斥)MX=1 (西向东使用计数变量互斥)设整型变量:CD=0 (东向西的已上桥人数)CX=0 (西向东的已上桥人数)从东向西:P (MD)IF (CD=0){P (MUTEX) }CD=CD+1V (MD)过桥P (MD)CD=CD-1IF (CD=0){V (MUTEX) }V (MD)从西向东:P (MX)IF (CX=0){P (MUTEX) }CX=CX+1V (MX)过桥P (MX)CX=CX-1IF (CX=0){V (MUTEX) }V (MX)(3) 解:从东向西的,和(2)相同;从西向东的和(1)相同。
操作系统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(){cobeginP1( );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所示。
系统调用中的信号量PV操作 理发师问题
⏹理发师问题:一个理发店由一间等候室W和一间工作室B组成。
顾客可以从外面大街上进入W等候理发。
两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。
顾客在工作室内理完发,可由B 的旁门出去。
W中有N把椅子,顾客必须坐着等候。
理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。
顾客每进入一位,都拉铃通知理发师。
若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。
⏹要求打印:题目中要求描述理发师和顾客的行为,因此需要两类线程barber()和customer ()分别描述理发师和顾客的行为。
其中,理发师有活动有理发和睡觉两个事件;等待和理发二个事件。
店里有固定的椅子数,上面坐着等待的顾客,顾客在到来这个事件时,需判断有没有空闲的椅子,理发师决定要理发或睡觉时,也要判断椅子上有没有顾客。
所以,顾客和理发师之间的关系表现为:(1)理发师和顾客之间同步关系:当理发师睡觉时顾客近来需要唤醒理发师为其理发,当有顾客时理发师为其理发,没有的时候理发师睡觉。
(2)理发师和顾客之间互斥关系:由于每次理发师只能为一个人理发,且可供等侯的椅子有限只有n把,即理发师和椅子是临界资源,所以顾客之间是互斥的关系。
(3)故引入3个信号量和一个控制变量:ⅰ控制变量waiting用来记录等候理发的顾客数,初值为0;ⅱ信号量customers用来记录等候理发的顾客数,并用作阻塞理发师进程,初值为0;ⅲ信号量barbers用来记录正在等候顾客的理发师数,并用作阻塞顾客进程,初值为1;ⅳ信号量mutex用于互斥,初值为1using System;using System.Collections.Generic;using System.Text;using System.Threading;namespace理发师问题2{internal class Program{// Fieldsprivate static Semaphore barbers = new Semaphore(1, 10);private static int chairs;private static int count = 0;private static Semaphore customers = new Semaphore(0, 10);private static int finish = 0;private static Semaphore mtx = new Semaphore(1, 10);private static int waiting = 0;// Methodspublic static void barber(){while (true){customers.WaitOne();mtx.WaitOne();waiting--;barbers.Release();mtx.Release();cuthair();finish++;}}public static void customer(){mtx.WaitOne();count++;Console.WriteLine("叮咚!第{0}个顾客来了", count);if (waiting < chairs){if (waiting > 0){Console.WriteLine("此时有{0}个人在等待理发", waiting);}else{Console.WriteLine("没有人在等待");}waiting++;Console.WriteLine("还有{0}个座位,顾客留下", (chairs - waiting) + 1);mtx.Release();customers.Release();barbers.WaitOne();gethaircut();}else{Console.WriteLine("座位已满,第{0}个顾客离开", count); mtx.Release();}}public static void cuthair(){Console.WriteLine("开始理发!这是理发师的第{0}个顾客.", finish + 1);Thread.Sleep(0x2328);Console.WriteLine("理发完成 !");}public static void gethaircut(){Thread.Sleep(0x238c);Console.WriteLine("第{0}个顾客理发完毕,离开.", finish);}private static void Main(string[] args){string str = string.Empty;Console.WriteLine("请输入椅子的总数目:");chairs = Convert.ToInt32(Console.ReadLine());Console.WriteLine("理发店共有{0}把椅子", chairs);Console.WriteLine("开门接待顾客吗?Y/N");for(string str2 = Console.ReadLine(); (str2 != "Y") && (str2 != "y"); str2 = Console.ReadLine()){Console.WriteLine("********对不起,尚未开门!********");Console.WriteLine("开门接待顾客吗?Y/N");}Console.WriteLine("********营业中,欢迎光临!********");new Thread(new ThreadStart(Program.barber)).Start();while ((str != "y") && (str != "Y")){Random random = new Random(lisecond);Thread.Sleep(random.Next(1, 0x2710));Console.WriteLine("*******************************");new Thread(new ThreadStart(Program.customer)).Start();if ((finish >= 10) && (waiting == 0)){Console.WriteLine("已经为{0}个顾客理发了,要关门下班吗?(Y/N)", finish);str = Console.ReadLine();}if ((str == "Y") || (str == "y")){Console.WriteLine("************暂停营业!**********");break;}}}}}题目: 用多线程同步方法解决睡眠理发师问题(Sleeping-Barber Problem)理发店有一位理发师,一把理发椅和n把用来等候理发的椅子。
操作系统进程同步
司机 P1: 启动 正常运行 到站停
售票员 P2: 关门 售票 开门
用P、V原语实现进程同步
解: 1)设close为进程P1的私有信号量,表示 售票员是否关门,stop为进程P2的私有 信号量,表示车辆是否停止到站。 2)设初始值close=1,stop=0,表示车正 在运行。 3)描述:
用P、V原语实现进程同步
工人2的活动: Do{ 加工一个车轮; 将车轮放入箱子中; }while(1)
工人3的活动 Do{ 从箱子中取1个车架; 从箱子中取2个车轮; 组装为一辆车; }while(1); 用信号量与PV操作实现3个工人的合作,要求不 包含死锁。
Hale Waihona Puke 答案Proess P2 While (true){ P(odd); P(mutex); getodd(); V(mutex); V(empty); countodd(); }
答案
Proess P2 While (true){ P(even); P(mutex); geteven(); V(mutex); V(empty); counteven(); } }coend
1每次只能存入一种产品a或b1每次只能存入2a产品数量b产品数量m3b产品数量a产品数量n期中mn是正整数试用pv操作描述产品a和b的入库过程种产品a或b有桥如图所示车流如箭头所示桥上不允许两车交汇但允许同一方向多辆车依次通行即桥上可以有多个同方向的依次通行即桥上可以有多个同方向的车
进程同步
补充
练习
P1: A:P(close)
启动 行车 停车 P2: B:P(stop)
开门
关门
V(close)
售票 Goto B
V(stop)
Goto A
用PV操作实现进程同步的示例
void PROCESS R(void) { int x; while(TRUE) { 从输入设备上读一个整数到x; 从输入设备上读一个整数到 ; P(empty); B=x; if(x%2==1) V(SW1); else V(SW2); } }
11
void PROCESS SW1(void) { int y; while(TRUE) { P(SW1); y=B; V(empty); 打印y中的数 中的数; 打印 中的数; } } void PROCESS SW2(void) { int z; while(TRUE) { P(SW2); z=B; V(empty); 打印z中的数 中的数; 打印 中的数; } }
3
正确解决方法:设置同步信号量 , 正确解决方法:设置同步信号量S1,表示开始时缓 冲区中没有数据可供进程B读的整数 初值为0; 读的整数, 冲区中没有数据可供进程 读的整数,初值为 ;设 置同步信号量S2,表示开始时缓冲区中有n个空位 置同步信号量 ,表示开始时缓冲区中有 个空位 置可供进程A送 个整数 初值为n。 个整数, 置可供进程 送n个整数,初值为 。
9
解答:
个同步信号量: 设3个同步信号量: 个同步信号量 是进程R的私有信号量 ①empy是进程 的私有信号量,初值为 ,表示 是进程 的私有信号量,初值为1, 开始时进程R可向缓冲器 中送一整数; 可向缓冲器B中送一整数 开始时进程 可向缓冲器 中送一整数; 是进程W1的私有信号量 初值为0, 的私有信号量, ②SW1是进程 的私有信号量,初值为 ,表示 是进程 开始时缓冲器B中无奇数可供进程 取; 中无奇数可供进程W1取 开始时缓冲器 中无奇数可供进程 是进程W2的私有信号量 初值为0, 的私有信号量, ③ SW2是进程 的私有信号量,初值为 ,表示 是进程 开始时缓冲器B中无偶数可供进程 取; 中无偶数可供进程W2取 开始时缓冲器 中无偶数可供进程 3个进程的同步并发程序如下: 个进程的同步并发程序如下: 个进程的同步并发程序如下 struct semaphore empty,SW1,SW2=1,0,0; int B; 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操作
用信号量机制来解决进程的同步与互斥:PV操作首先确定进程间的关系,然后确定信号量及其值。
判断进程间是否互斥的关键:看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。
确定信号量的值是一个关键点,它代表了可用资源实体数。
举例:票大厅容纳的人数限制为20人,少于20人时购票者可以进入,否则要在厅外等候。
进程间是同步时:是否存在合作关系,是否需要互通消息首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。
举例:公交车上司机与售票员的行为,司机到站停车后,售票员方可开门,售票员关门后,司机方可开车。
进程同步应用示例讲解:1桌上有一个盘子,可以存放一个水果。
父亲总是把苹果放在盘子中,母亲总是把香蕉放在盘子中;一个儿子专等吃盘中的香蕉,一个女儿专等吃盘中的苹果。
1)系统要设几个进程来完成这个任务?各自的工作是什么?2)这些进程间有什么样的相互制约关系?3)用P,V操作写出这些进程的同步算法(注:标明信号量的含义)。
1)需要四个进程进程描述:Father:父亲放置苹果的进程;Mother:母亲放置香蕉的进程;Son:儿子吃香蕉的进程;Daughter:女儿吃苹果的进程。
分析:四人公用一个盘子;盘子每次只能放一个水果,当盘子为空时,父母均可尝试放水果,但一次只能有一人成功;盘中是香蕉,儿子吃,女儿等;盘中是苹果,女儿吃,儿子等。
2)进程之间既有互斥又有同步关系。
Father进程和Mother进程要互斥的向盘中放水果,应设置一互斥信号量dish,初值为1,表示盘子为空;Father进程要设置同步信号量apple,用于给Daughter进程传送消息,初值为0,表示还没有消息产生,即没有放苹果;相应Daughter进程也要向父、母进程传送盘子为空的消息。
Mother进程要设置同步信号量banana,用于给Son进程传送消息,初值为0,表示还没有消息产生,即没有放香蕉。
典型例题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
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操作例题
cobegin process producer
begin L1:produce a product; B[k]:=product; k:=(k+1)mod n; V(sg); goto L1 coend; process consumer begin L2:P(sg); Tack a product from B[t]; t:=(t+1)mod n; V(sp); consume; goto:= L2 end coend
例 12 考虑下述页面走向: 1,2,3,4,2,1,5,6,2,1,2,3,7,6,3,2,1,2,3,6
当内存块数量分别为 3 时,试问 FIFO、LRU、OPT 这三种置换算法的缺页次数各是多少? 答:缺页定义为所有内存块最初都是空的,所以第一次用到的页面都产生一次缺页。 当内存块数量为 3 时:
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;
father (); mother ();
son (); daughter ();
coend } father () { P(dish); … 放苹果 … V(apple); } mother() { P(dish);
…
放桔子 …
V(orange); } son () { P(orange);
… 取桔子
sp:=1;sg:=0; cobegin process producer (生产者进程)
进程同步典型例题(操作系统)
进程同步练习题1.在公共汽车上,司机和售票员的工作流程如图所示。
为保证乘客的安全,司机和售票员应密切配合协调工作。
请用信号量来实现司机与售票员之间的同步。
司机售票员图司机和售票员工作流程图①约束:怎么密切配合协调工作才能保证安全呢?a)关车门之后再启动车辆;利用前驱图解释b)到站停车之后再开车门;②根据约束定义信号量;关车门和启动车辆需要一个信号量进行同步S1;到站停车和开车门之间需要一个信号量进行同步S2;③建立几个进程呢?a)为司机建立一个进程Driver;b)为售票员建立一个进程Conductor;Driver:Repeat启动车辆;正常行驶;到站停车;Until false;Conductor:Repeat关车门;售票;开车门;Until false;④加入同步关系:Driver:RepeatWait (s1);启动车辆;正常行驶;到站停车;Signal(s2)Until false;Conductor:Repeat关车门;Signal(s1);售票;Wait(s2)开车门;Until false;main(){Driver();Conductor ();}2.桌子上有一只盘子,盘子中只能放一只水果。
爸爸专向盘子中放苹果,妈妈专向盘子中放橘子,一个儿子专等吃盘子中的橘子,一个女儿专等吃盘子中的苹果。
用PV操作实现他们之间的同步机制。
分析:①约束:a)爸爸和妈妈竞争盘子,往盘子放水果,爸爸在放时,妈妈等待,或者相反;b)爸爸和女儿要同步,即爸爸放完苹果之后通知女儿来吃;同时女儿吃完之后要通知盘子可用;c)妈妈和儿子要同步,即妈妈放完橘子之后通知儿子来吃;同时儿子吃完之后要通知盘子可用;②经上述分析可知:需要3个信号量:S1表示临界资源盘子,初值1;爸爸和女儿需要一个信号量进行同步S2=0 妈妈和儿子需要一个信号量进行同步S3=0;③建立进程?爸爸:妈妈:女儿:儿子:取一个苹果;取一个橘子;从盘子取一个苹果;从盘子取一个橘子;放入盘子;放入盘子吃苹果;吃橘子;Until false; Until false; Until false; Until false;④加入同步关系。
P,V操作实例分析
P,V操作实例分析刚开始学习的时候,就听说PV操作,简单说说PV操作。
● P(S): S=S-1如果S≥0,则该进程继续执⾏;S<0,进程暂停执⾏,放⼊信号量的等待队列● V(S): S=S+1如果S>0,则该进程继续执⾏;S≤0,唤醒等待队列中的⼀个进程到底怎么分析,下⾯看看⼀个具体的问题:⾸先设信号量S1,S2,其中S1,表⽰是否允许司机启动汽车,其初值为0,S2,表⽰是否允许售票员开车门,初值为O;●分析:司机进程:P:S1=S1-1 得:S1=0-1=-1<0 司机进程暂停执⾏,放⼊信号量的等待队列(售票员进程)售票员进程:关车门;V:S1=S1+1得:S1=-1+1=0≤ 0 唤醒等待队列中的⼀个进程(解释:唤醒司机进程,使司机进程成为就绪状态,司机可以启动车辆,正常⾏驶,……,直到到V(S2), S2=S2+1 得:S2=0+1=1>0 ,司机进程在此时往下就没有操作了;在唤醒司机进程的同时,售票员可以售票,执⾏售票进程,到P(S2)。
如果之前司机进程到V(S2),这⾥P(S2):S2=S2-1得:S2=1-1=0 ≥ 0,接着往下执⾏,到最后上下客;如果之前司机进程未到V(S2),售票员的进程到P(S2),则如下进⾏)售票;(同时司机可能,启动车辆;正常⾏驶;……)P:S2=S2-1得:S2=0-1=-1< 0 售票员进程暂停执⾏,放⼊信号量的等待队列(运⾏司机进程)司机进程:(接着上⾯未完成的继续往下执⾏)启动车辆;正常⾏驶;到站停车;S2=S2+1 得:S2=-1+1=0≤ 0 唤醒等待队列中的⼀个进程(运⾏售票员进程)售票员进程:开车门;上下客;以上过程(可以是如下):在售票员进程进程到V(S1),往下售票的同时司机可以启动车辆、……●使⽤PV操作实现进程同步时应该注意的是:(1)分析进程间的制约关系,确定信号量种类。
在保持进程间有正确的同步关系情况下,哪个进程先执⾏,哪些进程后执⾏,彼此间通过什么资源(信号量)进⾏协调,从⽽明确要设置哪些信号量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
示例1 示例1
设有n个整数环形缓冲区和一个无穷整数序列。 设有 个整数环形缓冲区和一个无穷整数序列。进 个整数环形缓冲区和一个无穷整数序列 逐个地把整数写入环形缓冲区, 程A逐个地把整数写入环形缓冲区,进程 则逐 逐个地把整数写入环形缓冲区 进程B则逐 个地把缓冲区中的整数读出。请回答: 个地把缓冲区中的整数读出。请回答: 进程间的具体制约关系; (1)叙述 、B进程间的具体制约关系; )叙述A、 进程间的具体制约关系 的初值为0,信号量S2的值是 的值是n-1, (2)若信号量 的初值为 ,信号量 的值是 )若信号量S1的初值为 , 则下图用PV操作描述的算法有何错误? 则下图用 操作描述的算法有何错误? 操作描述的算法有何错误
10
void PROCESS R(void) { int x; while(TRUE) { 从输入设备上读一个整数到x; 从输入设备上读一个整数到 ; P(empty); B=x; if(x%2==1) V(SW1); else V(SW2); } }
11
void PROCESS SW1(void) { int y; while(TRUE) { P(SW1); y=B; V(empty); 打印y中的数 中的数; 打印 中的数; } } void PROCESS SW2(void) { int z; while(TRUE) { P(SW2); z=B; V(empty); 打印z中的数 中的数; 打印 中的数; } }
进程A 进程 P(S2); 一个整数写入缓冲区; 一个整数写入缓冲区 V(S1); 进程B 进程 P(S1); 从缓冲区中取出一个整数; 从缓冲区中取出一个整数 V(S2);
4
示例2 示例2
生产围棋的工人不小心把相等数量的黑子和白子混 装在一个箱子里, 装在一个箱子里,现要用自动分拣系统把黑子和 白子分开,该系统由两个并发执行的进程组成, 白子分开,该系统由两个并发执行的进程组成, 系统功能如下: 系统功能如下: 专门拣黑子, 专门拣白子; (1)进程 专门拣黑子,进程 专门拣白子; )进程A专门拣黑子 进程B专门拣白子 (2)每个进程每次只拣一个子,当一个进程在拣 )每个进程每次只拣一个子, 子时不允许另一个进程去拣子; 子时不允许另一个进程去拣子; (3)当一个进程拣了一个子(黑子或白子)以后, )当一个进程拣了一个子(黑子或白子)以后, 必让另一个进程拣一个子(白子或黑子); 必让另一个进程拣一个子(白子或黑子); 用PV操作管理这两个并发进程,使其能正确实现 操作管理这两个并发进程, 操作管理这两个并发进程 上述功能。 上述功能。
9
解答:
个同步信号量: 设3个同步信号量: 个同步信号量 是进程R的私有信号量 ①empy是进程 的私有信号量,初值为 ,表示 是进程 的私有信号量,初值为1, 开始时进程R可向缓冲器 中送一整数; 可向缓冲器B中送一整数 开始时进程 可向缓冲器 中送一整数; 是进程W1的私有信号量 初值为0, 的私有信号量, ②SW1是进程 的私有信号量,初值为 ,表示 是进程 开始时缓冲器B中无奇数可供进程 取; 中无奇数可供进程W1取 开始时缓冲器 中无奇数可供进程 是进程W2的私有信号量 初值为0, 的私有信号量, ③ SW2是进程 的私有信号量,初值为 ,表示 是进程 开始时缓冲器B中无偶数可供进程 取; 中无偶数可供进程W2取 开始时缓冲器 中无偶数可供进程 3个进程的同步并发程序如下: 个进程的同步并发程序如下: 个进程的同步并发程序如下 struct semaphore empty,SW1,SW2=1,0,0; int B; cobegin
3
正确解决方法:设置同步信号量 , 正确解决方法:设置同步信号量S1,表示开始时缓 冲区中没有数据可供进程B读的整数 初值为0; 读的整数, 冲区中没有数据可供进程 读的整数,初值为 ;设 置同步信号量S2,表示开始时缓冲区中有n个空位 置同步信号量 ,表示开始时缓冲区中有 个空位 置可供进程A送 个整数 初值为n。 个整数, 置可供进程 送n个整数,初值为 。
7
• (1)应定义的信号量及初值 ) 信号量S(允许任一方向的人过桥),初值为 信号量 (允许任一方向的人过桥),初值为1 ),初值为 • (2)在下列的程序中填上适当的 、V操作, 操作, )在下列的程序中填上适当的P、 操作 以保证它们能正确并发工作。 以保证它们能正确并发工作。
Process (E-W)i ) (i=1,2,……) begin L1: ① 过桥; 过桥; ② goto L1; end;
Process A begin L1: Process B
;
P(S1);
; ;
begin L2:
P(S2);
; ;
V(S2);
end;
6
① 拣黑子; 拣黑子; ② goto L1;
③ 拣白子; 拣白子; ④ V(S1);河上有一座独木桥, 一条小河上有一座独木桥,规定每次只允许一 个人过桥,现河东、河西都有人要过桥, 个人过桥,现河东、河西都有人要过桥,如 果把每个过桥者都看做一个进程, 果把每个过桥者都看做一个进程,为保证安 请用PV操作管理这两个并发进程 操作管理这两个并发进程, 全,请用 操作管理这两个并发进程,使其 能正确实现上述功能。 能正确实现上述功能。
8
;
Process (W-E)i ) (i=1,2,……) begin L2:
P(S);
; ;
P(S);
; ;
V(S);
V(S);
end;
③ 过 桥; ④ goto L2;
示例4 示例
假定有3个进程 , 共享一个缓冲器B, 假定有 个进程R,W1,W2共享一个缓冲器 ,B 个进程 , 共享一个缓冲器 中每次只能存放一个整数。进程R每次启动输入 中每次只能存放一个整数。进程 每次启动输入 设备读一个整数且把它存放到缓冲器B中 设备读一个整数且把它存放到缓冲器 中。若存 放到缓冲器B中的是奇数 则由进程W1将其取出 中的是奇数, 放到缓冲器 中的是奇数,则由进程 将其取出 打印,否则,由进程W2将其取出打印。规定进程 将其取出打印。 打印,否则,由进程 将其取出打印 R存入缓冲器 的数,由进程 存入缓冲器B的数 存入缓冲器 的数,由进程W1和W2正确无误地 和 正确无误地 打印出来(即要求打印的与存入的完全一致)。 打印出来(即要求打印的与存入的完全一致)。 要求用PV操作管理这 个并发进程, 操作管理这3个并发进程 要求用 操作管理这 个并发进程,使它们能正 确同步工作。 确同步工作。
进程A 进程 V(S1); 进程B 进程 P(S1);
一个整数写入缓冲区; 一个整数写入缓冲区 P(S2); 2
从缓冲区中取出一个整数; 从缓冲区中取出一个整数 V(S2);
解答:
和进程B是合作进程 (1)进程 和进程 是合作进程,必须同步。进程 )进程A和进程 是合作进程,必须同步。进程A 应该超前进程B,但不能超前进程Bn个缓冲单元 个缓冲单元; 应该超前进程 ,但不能超前进程 个缓冲单元; 进程B不能超前进程 不能超前进程A。 进程 不能超前进程 。 操作放在“ (2)进程 中V(S1)操作放在“整数写入缓冲区”之 )进程A中 操作放在 整数写入缓冲区” 前有逻辑错。因为可能进程A执行 执行V(S1)后,在 前有逻辑错。因为可能进程 执行 后 整数写入缓冲区”之前,进程A被中断而调度进 “整数写入缓冲区”之前,进程 被中断而调度进 执行, 将通过P(S1),从而从缓冲区中读 程B执行,进程 将通过 执行 进程B将通过 , 取尚未写入的整数,造成错误。 取尚未写入的整数,造成错误。
12
13
5
• (1)应定义的信号量及初值 ) 信号量S1(允许进程 拣黑子)、S2 拣黑子)、 信号量 (允许进程A拣黑子)、 (允许进 拣白子),初值为1, 程B拣白子),初值为 ,0 拣白子),初值为 • (2)在下列的程序中填上适当的 、V操作, 操作, )在下列的程序中填上适当的P、 操作 以保证它们能正确并发工作。 以保证它们能正确并发工作。