操作系统 信号量机制P、V操作习题全解共34页
- 格式:ppt
- 大小:3.35 MB
- 文档页数:31
操作系统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所⽰。
⏹Linux或Windows或Unix环境下,采用系统调用中的信号量、P、V操作,编程解决以下问题。
⏹理发师问题:一个理发店由一间等候室W和一间工作室B组成。
顾客可以从外面大街上进入W等候理发。
两个房间的入口是并排的,且共享一扇日本式可滑动的推拉门(门总是挡住一个入口)。
顾客在工作室内理完发,可由B的旁门出去。
W中有N把椅子,顾客必须坐着等候。
理发师可由门上小窗查看W中无人就睡觉,否则开门,并叫一位顾客入内理发。
顾客每进入一位,都拉铃通知理发师。
若把顾客和理发师都视为进程,请用P、V操作写出进程的同步算法。
⏹要求打印:⏹初始状态⏹中间变化的状态信息⏹以及最终状态信息。
using 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;}}}}}⏹Linux操作系统环境下C的编译:---编辑环境一般采用vi;---编译命令: g++ 源文件名可执行文件名⏹用到的相关系统调用---shmget( ):开辟共享存储区---semget():用于产生一个信号量数组或查找已创建的信号量数组的描述字。
???信号量的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操作是进程管理中的难点。
首先应弄清PV操作的含义:PV操作由P操作原语和V操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下:P(S):①将信号量S的值减1,即S=S-1;②如果S>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。
PV操作属于进程的低级通信。
什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。
信号量的值与相应资源的使用情况有关。
当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。
注意,信号量的值仅能由PV操作来改变。
一般来说,信号量S>=0时,S表示可用资源的数量。
执行一次P 操作意味着请求分配一个单位资源,因此S的值减1;当S<0时,表示已经没有可用资源,请求者必须等待别的进程释放该类资源,它才能运行下去。
而执行一个V操作意味着释放一个单位资源,因此S 的值加1;若S?0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
利用信号量和PV操作实现进程互斥的一般模型是:进程P1 进程P2 ……进程Pn ………………P(S);P(S);P(S);临界区;临界区;临界区;V(S);V(S);V(S);……………………其中信号量S用于互斥,初值为1。
信号量p、v操作,利用信号量实现互斥的方法-概述说明以及解释1.引言1.1 概述信号量(Semaphore)是一种重要的同步工具,在并发编程中起到了关键的作用。
它是由荷兰计算机科学家艾兹赫尔·迪科斯彻兹于1965年提出的。
信号量可以用于控制对共享资源的访问,实现进程或线程之间的互斥和同步。
在计算机系统中,多个进程或线程可能需要同时访问某个共享资源,这时就会引发竞争条件(Race Condition)问题。
竞争条件会导致数据不一致性和程序错误,为了解决这个问题,需要引入互斥机制来保证共享资源在任意时刻只能被一个进程或线程访问。
信号量的引入能够有效地解决互斥问题。
它通过一个计数器来控制对共享资源的访问。
这个计数器被称为信号量的值,其可以是一个非负整数。
当信号量的值大于等于0时,表示共享资源可用,进程可以继续访问。
当信号量的值小于0时,表示共享资源不可用,进程需要等待其他进程释放该资源后才能继续访问。
信号量的实现依赖于两个操作:P(Proberen)和V(Verhogen)。
P操作用于申请共享资源,即进程想要对共享资源进行访问时,必须先进行P操作。
如果信号量的值大于等于1,即资源可用,那么P操作会将信号量的值减1,并允许进程继续访问共享资源。
如果信号量的值小于1,即资源不可用,那么进程就需要等待。
V操作用于释放共享资源,即进程访问完共享资源后,必须进行V操作,将信号量的值加1,以便其他进程可以访问该资源。
利用信号量实现互斥的方法,就是通过对共享资源进行P和V操作,来控制对资源的访问。
在访问共享资源之前,进程需要先执行P操作锁定资源,访问完毕后再执行V操作释放资源。
这样就能够保证在任意时刻只有一个进程能够访问共享资源,实现了互斥。
总结起来,信号量是一种重要的同步工具,通过P和V操作可以实现对共享资源的互斥访问。
利用信号量实现互斥的方法可以有效地解决竞争条件问题,保证数据的一致性和程序的正确性。
••信号量应用问题:End;Pare nd.写出程序描述下列前趋关系。
1 endS2->S4, S1->S3, S1->S2,S2->S5 , S3->S6, S4->S7,2•请用信号量实现4X 10(4人,每S5->S7, S6->S7人100Var s1,s2, s3,s4:semaphore:=0, 0米, )接力赛的同步过程。
提示:前趋图同步问题,可设0, 0; 4个进程,三个信号量,进程 1 只设BeginV操作,进程4只设ParbeginP操作,其余进程先做P操作再做V P1:begi n 操作。
Var s1,s2,s3:semaphore:=0, 0, 0;.; …Begin V(s1);Parbegin V(s1);Athlete1: begin End;Run 100m; P2: beginV(s1); P(s1);End; …;Athlete2: begin V(s2);P(s1) V(s2);Run 100m; End;V(s2); P3: beginEnd; P(s1)Athlete3: begin …P(s2) ;V(s3)P(s2);Athlete4: begin …P(s3);V(s4);P(s2);Parend ..;endV(s4);3.设公共汽车上,司机和售票员的活 End;动分别是: P6: begin司机:售票员: P(s3)启动车辆 ..xx 乘客V(s4)正常行车关车门到站停车售票 End;P7:begin 开车门P(s4);P(s4)下乘客P(s4)在汽车不断地到站、停车、行驶过 END;程中,这两个活动有什么同步关系? CoEnd;END;请用信号量机制实现他们的同步。
假定初始状态为停车状态,引入信/- 生产者消费者问题:和 Run :号量Stopl BEGIN.桌上有一个可以 xx 两个水果的Run 100m; End;V(s3); P4: beginEnd; Run 100m; P5: beginEnd;盘子,每次只能放或取一个水果爸semaphore Stop,Run;爸放苹果妈妈放橘子,两个儿子Stop:=Run:=0; 吃苹果,两个女儿吃橘子。