PV操作1
PUT MOVE GET Buff1 Buff2
有桥如下图,车流如箭头所示,桥上不允许两 车交会,但允许同方向多辆车依次通行(即桥 上可以有多个同方向的车)。用P、V操作实 现交通管理以防止桥上堵塞。
本题目类似“读者—写作”问题,但又有所不 同。这个题目要解决:南、北互斥(桥上不允许两 车交汇,相当于“读、写互斥”),需要设置一个 互斥信号量mutex,初值为1;南、南共享(相当于 “读、读共享”),套用实现“读、读共享”的模 式,需要设置一个共享变量south,用于记录当前桥 上向南行驶过桥的车辆数目,初值为0,再设置一个 互斥信号量smutex,实现对south的互斥访问;北、 北共享(也相当于“读、读共享”),需要设置一 个共享变量north,用于记录当前桥上向北行驶过桥 的车辆数目,初值为0,再设置一个互斥信号量 nmutex,实现对north的互斥访问。
当为同步操作时,则不在同一进程中出现
如果P(S1)和P(S2)两个操作在一起,那么P 操作的顺序至关重要,一个同步P操作与 一个互斥P操作在一起时同步P操作在互 斥P操作前
而两个V操作无关紧要
3)P.V操作的优缺点 优点: 简单,而且表达能力强(用P.V操作可解决
任何同步互斥问题)
缺点: 不够安全;P.V操作使用不当会出现死锁; 遇到复杂同步互斥问题时实现复杂
同步关系:司机到站停车后,售票员才 能开门;售票员关好车门后,司机才能启动 汽车 设初始状态为停车,车门开着。 close 表示门是否已关,是否允许启动车辆 stop 表示是否到站停车,是否允许开车门 Var close,stop:semaphore:=0,0;
Process 司机 Begin repeat P(close); 启动车辆; 正常行驶; 到站停车; V(stop); until false; End.
作业2:如图所示,有多个PUT操作同时向BUFF1放数 据,有一个MOVE操作不断地将BUFF1的数据移到 BUFF2,有多个GET操作不断地从BUFF2中将数据取 走。BUFF1的容量为m,BUFF2的容量是n,PUT、 MOVE、GET每次操作一个数据,在操作的过程中要 保证数据不丢失。试用wait()、signal()原 语协调PUT、MOVE的操作,并说明每个信号量的含 义和初值。
P(S1) 启动车辆 V(S2) 正常行车 到站停车 V(S3)
苹果桔子问题
桌上有1空盘,允许存放1个水果。爸爸向 盘中放苹果,也可以向盘中放桔子。儿子专 等吃盘中的桔子,女儿专等吃盘中的苹果。 规定当盘空时一次只能放1个水果供吃者取用。 请用Wait()、Signal()原语实现爸爸、儿子、 女儿三个并发进程的同步。【南京大学2000】
Process 售票员
Begin
repeat 关车门; V(close); 售票; P(stop); 开车门; 上下乘客 until false; End.
在一辆公共汽车上,司机和售票员各行其职,司机负责开 车和到站停车;售票员负责售票和开、关门,当售票员关好 车门后,司机才能继续开车行驶。试用P、V操作实现司机与 售票员之间的同步。【北京航天航空大学2002】(注意: 【哈工大 2000】、【山东科技大学 2006】)
Son() { While(1) { Wait(So); 从盘中取出桔子; Signal(S); 吃桔子; } } Daughter() { While(1) { Wait(Sa); 从盘中取出苹果; Signal(S); 吃苹果; } }
作业1:桌上有1空盘,最多可以容纳两个水果, 每次只能放入或取出1个水果。爸爸专向盘中放苹 果,妈妈专向盘中放桔子。儿子专等吃盘中的桔子, 女儿专等吃盘中的苹果。请用Wait()、Signal()原 语实现爸爸、妈妈、儿子、女儿之间的同步与互斥 关系。
解:设三个信号量: S --- 盘子是否为空,初值为1;
So --- 盘中是否有桔子,初值为0;
Sa --- 盘中是否有苹果,初o=0, Sa=0; Main() { Cobegin Father(); Son(); Daughter(); Coend } Father() { While(1) { Wait(S); 将水果放入盘中; If (放入的是桔子) Signal(So); Else Signal(Sa); } }
P.V操作讨论
1) 信号量的物理含义: S>0表示有S个资源可用 S=0表示无资源可用 S<0则| S |表示S等待队列中的进程个数 P(S):表示申请一个资源 V(S)表示释放一个资源。信号量的初值应 该大于等于0
2) P.V操作必须成对出现,有一个P操作就 一定有一个V操作
当为互斥操作时,它们同处于同一进程
这里包括的同步问题有:司机到站 停车后,售票员才能开门;售票员关 好车门后,司机才能启动汽车;司机 启动汽车后,售票员才能售票。 解:设信号量: S1 --- 允许司机启动车辆,初值为1; S2 --- 允许售票员售票,初值为0; S3 --- 允许售票员开车门,初值为0。
司 机 售票员 P(S2) 售票 P(S3) 开车门 关车门 V(S1)
Process 打印进程 Pp Begin repeat P(s2); 从缓冲区中取数; v(s1); 打印数据; untill false; End.
用P.V操作解决司机与售票员的问题
司机进程: REPEAT
启动车辆 正常驾驶 到站停车 UNTIL …
售票 员 进程 : REPEAT
关门 售票 开门 UNTIL …
【分析】这是复杂情况的“生产者—消费者”问题,既有同步又
有互斥。爸爸进程与儿子进程、女儿进程需要同步,儿子进 程与女儿进程需要互斥。设置4个信号量S(盘子是否为空, 初值为1)、So(盘中是否有桔子,初值为0)、Sa(盘中是 否有苹果,初值为0)和mutex(用于对盘子的互斥访问,初 值为1)。由于只有一个盘子(相当于只有一个buffer), 对盘子的互斥访问发生在对盘子的存取操作上,S、So和Sa 就可以保证对盘子的互斥操作了,故mutex也可以省略。
【思考题】
1.用P.V操作解决下图之同步问题: 输入 处理 打印
f
s
t
g
Var s1,s2:semaphore; /*s1表示缓冲区是否可用; s2表示缓冲区有无可供打印的数*/ s1:=1;s2:=0; Porcess 计算进程 Pc Begin repeat P(s1); 计算下一数据并放入缓冲区; V(s2); until false; End.