PV操作解决公交车问题
操作系统同步例题
13. 对于生产者—消费者问题,假设缓冲区是无界的,试用信号灯与PV操作给出解法。
答:由于是无界缓冲区,所以生产者不会因得不到缓冲区而被阻塞,不需要对空缓冲区进行管理,可以去掉在有界缓冲区中用来管理空缓冲区的信号量及其PV操作。
semaphore mutex_in=1;semaphore mutex_out=1;semaphore empty=0;int in=0,out=0;生产者活动:while(1){produce next product;P(mutex_in);add the product to buffer[in]; in++;v(mutex_in);V(empty);} 消费者活动:while(1){P(empty);P(mutex_out);take the product from buffer[out]; out++;V(mutex_out);}14. 设有一个可以装A、B两种物品的仓库,其容量无限大,但要求仓库中A、B两种物品的数量满足下述不等式:-M≤A物品数量-B物品数量≤N其中M和N为正整数。
试用信号灯和PV操作描述A、B两种物品的入库过程。
答:已知条件 -M≤A物品数量-B物品数量≤N 可以拆成两个不等式,即A物品数量-B物品数量≤N,B物品数量-A物品数量≤M。
这两个不等式的含义是:仓库中A物品可以比B物品多,但不能超过N个;B物品可以比A 物品多,但不能超过M个。
semaphore a=n;semaphore b=m;void main(){createprocess(A,…);createprocess(B,…);}A物品入库:void A(){ while(1){ B物品入库:void B(){ while(1){P(a);A物品入库; V(b);}} P(b);B物品入库; V(a);}}15. 试用信号灯与PV操作实现司机与售票员之间的同步问题。
设公共汽车上有一个司机和一个售票员,其活动如下图所示。
pv原语练习题带答案
customer( )
begin
L1:走进理发店
P(chair)
P(hairdresser)
V(chair)
让理发师为他理发
13、设存在三个过程get、copy和put分别对缓冲区S和T进行操作,其中get负责将数据块存入缓冲区S,copy负责从缓冲区S读出数据并复制到缓冲区T中,put负责从缓冲区T中读出数据并打印,如图8.2所示。请用P、V操作描述上述三个过程。
答:设信号量SGC表示缓冲区S是否允许放数据,值为1时表示允许,初值为1;信号量SCG表示缓冲区S是否允许取数据,值为1时表示允许,初值为0;信号量SCP表示缓冲区T是否允许放数据,值为1时表示允许,初值为1;信号量SPC表示缓冲区T是否允许取数据,值为1时表示允许,初值为0。进程get、copy和put描述如下:
R1 R2 R3 R4
P1
0 0 3 2
0 0 1 2
1 6 2 2
P2
1 0 0 0
17 5 0
P3
1 3 5 4
2 3 5 6
P4
0 0 3 2
0 6 5 2
P5
011 4
0 6 5 6
答:(1)由于Available为(1 6 2 2),而P1进程Need(0 0 1 2),因而P1进程所需资源可以满足,经过一段时间P1进程可以执行完,所占有的资源可以释放,这是Available为(1 654)((1 6 2 2)+(0 0 3 2)得)。而P4进程Need(0652),因而P4进程所需资源可以满足,经过一段时间P4进程可以执行完,所占有的资源可以释放,这是Available为(1 686)((1 654)+(0 0 3 2)得)。而P5进程Need(0656),因而P5进程所需资源可以满足,经过一段时间P5进程可以执行完,所占有的资源可以释放,这是Available为(17910)((1 686)+(0114)得)。而P2进程Need(17 5 0),因而P2进程所需资源可以满足,经过一段时间P2进程可以执行完,所占有的资源可以释放,这是Available为(27910)((17910)+(100 0)得)。而P3进程Need(2 3 5 6),因而P3进程所需资源可以满足,经过一段时间P3进程可以执行完,系统中所有进程都可执行完,因此系统处于安全状态。
pv操作大题解题思路
pv操作大题解题思路PV操作是指进程同步的一种经典方法,用于解决进程之间的互斥和同步问题。
在解题时,可以按照以下思路进行分析和回答:1. 什么是PV操作?PV操作是指通过对信号量进行P(Proberen)和V(Verhogen)操作来实现进程同步。
P操作用于申请资源,如果资源不可用,则进程进入等待状态;V操作用于释放资源,让等待的进程得以继续执行。
2. PV操作的作用是什么?PV操作用于解决进程之间的互斥和同步问题。
互斥是指同一时间只允许一个进程访问临界资源,而同步是指进程之间按照一定的顺序执行,避免出现竞态条件和死锁等问题。
3. PV操作的原理是什么?PV操作基于信号量(Semaphore)的概念。
信号量是一个计数器,用于控制对共享资源的访问。
P操作会将信号量的值减1,如果结果小于0,则进程进入等待状态;V操作会将信号量的值加1,如果结果小于等于0,则唤醒等待的进程。
4. PV操作的应用场景有哪些?PV操作常用于解决生产者-消费者问题、读者-写者问题、哲学家就餐问题等。
在这些场景中,通过合理使用PV操作可以实现进程之间的协调与同步,避免资源竞争和死锁。
5. PV操作有哪些特点和优势?PV操作具有以下特点和优势:互斥性,PV操作可以确保同一时间只有一个进程访问共享资源,避免数据的不一致性。
同步性,PV操作可以按照一定的顺序执行进程,避免竞态条件和死锁。
简单高效,PV操作是一种经典的进程同步方法,实现简单,高效可靠。
适用性广泛,PV操作可以应用于各种并发场景,解决不同类型的进程同步问题。
总结:PV操作是一种经典的进程同步方法,通过对信号量进行P和V 操作来实现互斥和同步。
它的应用场景广泛,可以解决生产者-消费者问题、读者-写者问题等。
PV操作具有互斥性、同步性、简单高效和适用性广泛等特点和优势。
在解题时,可以根据具体的问题场景,灵活运用PV操作,保证进程之间的协调与同步。
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=1P(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=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)相同.问题4 有一个俱乐部,有甲乙两个服务员,当顾客有请求时,甲负责送烟,乙负责送火,无顾客请求时,服务员睡眠。
计算机操作系统之PV原语分析及计算
操作系统课程之PV原语PV原语通过操作信号量来处理进程间的同步与互斥的问题。
其核心就是一段不可分割不可中断的程序。
信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新的变量类型(semaphore)来记录当前可用资源的数量。
有两种实现方式:1)semaphore的取值必须大于或等于0。
0表示当前已没有空闲资源,而正数表示当前空闲资源的数量;2)semaphore的取值可正可负,负数的绝对值表示正在等待进入临界区的进程个数。
信号量是由操作系统来维护的,用户进程只能通过初始化和两个标准原语(P、V原语)来访问。
初始化可指定一个非负整数,即空闲资源总数。
P原语:P是荷兰语Proberen(测试)的首字母。
为阻塞原语,负责把当前进程由运行状态转换为阻塞状态,直到另外一个进程唤醒它。
操作为:申请一个空闲资源(把信号量减1),若成功,则退出;若失败,则该进程被阻塞;V原语:V是荷兰语Verhogen(增加)的首字母。
为唤醒原语,负责把一个被阻塞的进程唤醒,它有一个参数表,存放着等待被唤醒的进程信息。
操作为:释放一个被占用的资源(把信号量加1),如果发现有被阻塞的进程,则选择一个唤醒之。
具体PV原语对信号量的操作可以分为三种情况:1)把信号量视为一个加锁标志位,实现对一个共享变量的互斥访问。
实现过程:P(mutex); // mutex的初始值为1 访问该共享数据;V(mutex);非临界区2)把信号量视为是某种类型的共享资源的剩余个数,实现对一类共享资源的访问。
实现过程:P(resource); // resource的初始值为该资源的个数N 使用该资源;V(resource); 非临界区3)把信号量作为进程间的同步工具实现过程:临界区C1;P(S);V(S);临界区C2;哲学家问题PV原语程序2009年03月10日星期二 21:29设有5个哲学家,共享一张放有五把椅子的桌子,每人分得一把椅子。
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。
操作系统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操作类的题目
有关pv操作类的题目1、假定系统有三个并发进程read, move和print共享缓冲器B1和B2。
进程read负责从输入设备上读信息,每读出一个记录后把它存放到缓冲器B1中。
进程move从缓冲器B1中取出一记录,加工后存入缓冲器B2。
进程print将B2中的记录取出打印输出。
缓冲器B1和B2每次只能存放一个记录。
要求三个进程协调完成任务,使打印出来的与读入的记录的个数,次序完全一样。
请用PV操作,写出它们的并发程序。
解:beginemptyB1 , fullB1, emptyB2, fullB2 : semaphoreB1,B2 : recordemptyB1 := 1,fullB1:=0,emptyB2:=1,fullB2:=0cobegin process readX : record;begin R: 接收来自输入设备上一个记录X:=接收的一个记录;P(emptyB1);B1:=X;V(fullB1);goto R;end;Process moveY:record;beginM:P(fullB1);Y:=B1;V(emptyB1)加工YP(emptyB2);B2:=Y;V(fullB2);goto M;end;Process printZ:record;beginP:P(fullB2);Z:=B2;V(emptyB2)打印Zgoto P;end;coend;end;2、用PV操作解决读者写者问题的正确程序如下:begin S, Sr: Semaphore; rc: integer;S:=1; Sr:=1; rc:=0;cobegin PROCESS Reader i ( i=1,2…)begin ( P(S5))P(Sr)rc:=rc+1;if rc=1 then P(S);V(Sr);read file;P(Sr);rc:=rc-1if rc=0 thenV(S);V(Sr);( V(S5) )end ;PROCESS Writer j (j=1,2…)begin P(S);Write file;V(S)end;coend ;end;请回答:(1)信号量Sr的作用;(2)程序中什么语句用于读写互斥,写写互斥;(3)若规定仅允许5个进程同时读怎样修改程序?解:(1)Sr用于读者计数变量rc的互斥信号量;(2)if rc=1 then P(S)中的P(S)用于读写互斥;写者进程中的P(S)用于写写互斥,读写互斥。
考研P、V操作习题答案
信号量应用问题:1.写出程序描述下列前趋关系。
S1->S2, S1->S3, S2->S4, S2->S5 , S3->S6, S4->S7, S5->S7, S6->S7Var s1,s2, s3,s4:semaphore:=0, 0, 0, 0;BeginParbeginP1: begin….;V(s1);V(s1);End;P2: beginP(s1);…;V(s2);V(s2);End;P3: beginP(s1)…V(s3)End;P4: beginP(s2);…V(s4);P5: beginP(s2);..;V(s4);End;P6: beginP(s3)..V(s4)End;P7:beginP(s4);P(s4);P(s4);…End;Parendend2. 请用信号量实现4×100(4人,每人100米)接力赛的同步过程。
提示:前趋图同步问题,可设4个进程,三个信号量,进程1只设V操作,进程4只设P操作,其余进程先做P 操作再做V操作。
Var s1,s2,s3:semaphore:=0, 0, 0; BeginParbeginAthlete1: beginRun 100m;V(s1);End;Athlete2: beginP(s1)Run 100m;V(s2);End;Athlete3: beginP(s2) ;Run 100m;V(s3);End;Athlete4: beginP(s3);Run 100m;End;Parendend3.设公共汽车上,司机和售票员的活动分别是:司机:售票员:启动车辆上乘客正常行车关车门到站停车售票开车门下乘客在汽车不断地到站、停车、行驶过程中,这两个活动有什么同步关系?请用信号量机制实现他们的同步。
/-假定初始状态为停车状态,引入信号量Stop和Run:BEGINsemaphore Stop,Run;Stop:=Run:=0;CoBeginDriver: BEGINRepea tWa it(Run);启动车辆;正常行驶;到站停车;Si gnal(Stop);Until False;END;Conductor:BEGINRepea t上乘客;关车门;Si gnal(Run);售票;Wa it(Stop);开车门;下乘客;Until False;END;CoEnd;END;生产者消费者问题:1.桌上有一个可以容纳两个水果的盘子,每次只能放或取一个水果。
PV操作(生产者-消费者问题)
PV操作(生产者-消费者问题) /* 用信号量解决生产者-消费者问题*/#include <STDIO.H>#define N 10typedef int semaphore; /* 信号量是一种特殊的整型变量*/semaphore mutex=1; /* 互斥访问*/semaphore empty=N; /* 记录缓冲区中空的槽数*/semaphore full=0; /* 记录缓冲区中满的槽数*/semaphore buf[N]; /* 有N个槽数的缓冲区buf[N],并实现循环缓冲队列*/ semaphore front=0, rear=0;void p(semaphore *x) /* p操作*/{*x=(*x)-1;}void v(semaphore *y) /* v操作*/{*y=(*y)+1;}void produce_item(int *item_ptr){/*printf("produce an item\n");*/*item_ptr='m'; /* 'm' is "man满" */}void enter_item(int x){front=(front+1)%N;buf[front]=x;printf("enter_item %c to buf[%d]\n", buf[front], front);}void remove_item(int *yy){rear=(rear+1)%N;printf("remove_item %c from buf[%d]", buf[rear], rear);*yy=buf[rear];buf[rear]='k'; /* 'k' is "kong空" */printf(" so the buf[%d] changed to empty--%c\n", rear, buf[rear]);}void consume_item(int y){printf("cosume the item :the screem print %c\n", y);}void producer(void);void consumer(void);/* 生产者*/void producer(void){int item;while(1){produce_item(&item);p(&empty); /* 递减空槽数*/p(&mutex); /* 进入临界区*/enter_item(item); /* 将一个新的数据项放入缓冲区*/v(&mutex); /* 离开临界区*/v(&full); /* 递增满槽数*/if(full==N) /* 若缓冲区满的话,唤醒消费者进程*/consumer();}}/* 消费者*/void consumer(void){int get_item;while(1){p(&full); /* 递减满槽数*/p(&mutex); /* 进入临界区*/remove_item(&get_item); /* 从缓冲区中取走一个数据项*/v(&mutex); /* 离开临界区*/v(&empty); /* 递增空槽数*/consume_item(get_item); /* 对数据项进行操作(消费)*/if(empty==N) /* 若缓冲区全空的话,唤生产者进程*/producer();}}/* 调用生产者-消费者进程实现进程间同步*/ main(){producer();return 0;}。
pv操作总结
实现:begin
例1生产围棋的工人不小心把相等数量的黑子和白子混装载一个箱子里,现要用自动分拣系统把黑子和白子分开,该系统由两个并发执行的进程组成,功能如下:
(1)进程A专门拣黑子,进程B专门拣白子;
(2)每个进程每次只拣一个子,当一个进程在拣子时不允许另一个进程去拣子;
分析:第一步:确定进程间的关系.由功能(2)可知进程之间是互斥的关系.第二步:
end;
process B
begin
L2:P(s);
拣白子;
V(s);
goto L2;
end;
coend;
end;
判断进程间是否互斥,关键是看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应.确定信号量的值是一个关键点,它代表了可用资源实体数.如下实例:
例2某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,厅外的购票者可立即进入,否则需要在外面等待.每个购票者可看成一个进程.
PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用.在PV原语执行期间不允许有中断的发生.
用PV原语实现进程的互斥
由于用于互斥的信号量sem与所有的并发进程有关,所以称之为公有信号量.公有信号量的值反映了公有资源的数量.只要把临界区置于P(sem)和V (sem)之间,即可实现进程间的互斥.就象火车中的每节车厢只有一个卫生间,该车厢的所有旅客共享这个公有资源:卫生间,所以旅客间必须互斥进入卫生间,只要把卫生间放在P(sem)和V(sem)之间,就可以到达互斥的效果.以下例子说明进程的互斥实现.
PV操作例题
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操作写一篇博客,让大家不再惧怕PV操作,我们深入浅出的分析,让大家轻松学习PV操作。
学习PV操作之前,我们首先来了解两个很基础的概念:同步、互斥:同步:其实说同步还不如说”协作“,就是我们的目标只有一个,我们奔着同一个目标去的,都是在大家的努力下共同完成这么一件事情。
还是比较容易理解的吧。
不见得太难。
互斥:借用别人的一句话“千军万马过独木桥”,很通俗的一句话,就把咱们这个概念表达的淋漓尽致,就好比有一个大部队来到独木桥这,但是必须排好队,一个一个来;其实现实生活中,还有一个很好的例子可以说明这个互斥的概念,比如打印机,打印机这个工具就非常好的体现了互斥的概念,打印机一旦被别人占用了,那无乱你有多着急,都只能等着,对吧。
其实借用别人的话或者资料或者工具来让咱们的学习更加轻松,为咱们的学习加把油,何乐而不为呢?这就是我要说的“站在巨人的肩膀上”来看问题,许多问题就变得轻松起来;这是一种思想,旨在为咱们的学习加把油~这是题外话,但是更重要的是一种思想,很值得学习。
我们接下来还继续看一下一张同步的图:这张图也特别的形象具体,我们具体来看看这张图,A仓库有货物,然后我们需要把货物搬运到B仓库,由搬运工甲和搬运工乙来完成这个过程;那么他们的目标就只有一个,就是把货物从A搬到B去,共同奔着这个方向去发展,所以我们说这是一个同步的问题。
临界资源:就是咱们刚刚说的互斥,诸进程间需要互斥方式对其进行共享资源,如打印机、光驱等。
临界区:就是进程访问临界资源的那段代码。
讲了那么久,我们才引入了PV操作,看来这个PV操作还是挺有意思的。
PV操作:解决互斥和同步的问题。
PV操作是分开来看的:P操作:使S=S-1,若S>=0,则该进程继续执行,否则该进程排入等待队列。
V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。
pv操作例题
pv操作例题(原创实用版)目录1.PV 操作概述2.PV 操作的实例3.PV 操作的解题技巧4.总结正文一、PV 操作概述PV 操作是计算机编程中的一种操作,主要用于处理并发读写问题。
PV 操作是基于 C 语言的线程操作,通过 PV 操作,可以实现线程之间的同步和互斥。
PV 操作主要包括 P 操作和 V 操作两个方面。
P 操作用于线程申请资源,如果资源已经被其他线程占用,则线程需要等待。
V 操作用于线程释放资源,当有其他线程正在等待该资源时,V 操作会唤醒等待的线程。
二、PV 操作的实例下面通过一个简单的实例来介绍 PV 操作的使用方法。
假设有两个线程,线程 A 负责生产产品,线程 B 负责消费产品。
由于产品库存有限,需要通过 PV 操作来实现线程之间的同步和互斥。
1.定义一个 PV 结构体,包括 P 操作和 V 操作的 sem_t 结构体。
```ctypedef struct {sem_t p;sem_t v;} PV;```2.初始化 PV 结构体。
```cPV pv = {0};```3.线程 A 执行 P 操作申请资源。
```cpv.p = sem_wait(&pv.p);```4.线程 A 执行生产操作。
```c// 生产产品操作```5.线程 A 执行 V 操作释放资源。
```csem_post(&pv.v);```6.线程 B 执行 P 操作申请资源。
```cpv.p = sem_wait(&pv.p);```7.线程 B 执行消费操作。
```c// 消费产品操作```8.线程 B 执行 V 操作释放资源。
```csem_post(&pv.v);```三、PV 操作的解题技巧在实际编程过程中,PV 操作的解题技巧主要包括以下几点:1.根据实际需求,合理地设置 PV 操作的资源。
2.确保 PV 操作的同步和互斥性,避免死锁现象的发生。
3.在编写 PV 操作时,要注意线程之间的切换和调度。
PV操作应用题
理发师问题(Dijkstra 1965) 问题描述:一个理发店由一个有几张椅子的等候 室和一个放有一张理发椅的理发室组成。若没有 要理发的顾客,则理发师就去睡觉;若一顾客走 进理发店且所有的椅子都被占用了,则该顾客就 离开理发店;若理发师正在为人理发,则该顾客 就找一张空椅子坐下等待;若理发师在睡觉,则 顾客就唤醒他,设计一个协调理发师和顾客的程 序。
busman() {while (1) { 关车门; v(s1);
售票;
p(s2); 开车门; 上下乘客; } }
四人之间的关系
爸爸,妈妈要互斥使用盘子,所以两者之 间是互斥关系; 爸爸放的苹果,女儿吃,所以两者是同步 关系; 妈妈放的桔子,儿子吃,所以两者也是同 步关系。
司机—售票员问题 设公共汽ቤተ መጻሕፍቲ ባይዱ上,司机和售票员的活动分别是: 司机: 售票员: 启动车辆 上下乘客 正常行车 关车门 到站停车 售票 开车门 上下乘客 在汽车不断到站,停车,行驶过程中,这两个 活动的同步关系。
• semaphore s1=0;s2=0; • Main() • {cobegin • driver(); • busman(); • coend;} • Driver() • {while (1) • {p(s1); • 启动车辆; • 正常行车; • 到站停车; • V(s2); • } • }
Void customeri(i=1,2,3,…) {p(mutex); If (waiting<CHAIRS) { Waiting++; V(customers); V(mutex); P(leisure); Get_haicut(); } Else V(mutex); }
吃水果问题 • 问题描述:桌上有一只盘子,每次只能放一个水 果,爸爸专向盘中放苹果,妈妈专向盘中放桔子, 儿子专等吃盘里的桔子,女儿专等吃盘里的苹果。 只要盘子空,则爸爸或妈妈可向盘中放水果,仅 当盘中有自己需要的水果时,儿子或女儿可从中 取出,请给出四人之间的同步关系,并用PV操作 实现四人正确活动的程序。
用信号量机制来解决进程的同步与互斥: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操作
进程通信:指进程间的信息交换过程进程通信方式:互斥、同步、消息缓冲一、开、关锁进程进入临界资源的操作: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个缓冲块组成的缓冲池。
pv操作典型例题
例1 在某展示厅设置一个自动计数系统,以计数器count表示在场的人数,count是动态变化的,若有一个人进入展示厅进程pin对计数器count加1,当有一个人退出展示厅时,进程pout实现计数器减1。
由于进、出所以展示厅的人是随机的,用P-V操作实现。
(并发进程之间的互斥问题)解:定义信号量:S——表示是否有进程进入临界区,初值为1.(表示没有进程进入临界区)begincount: Integer;S: semaphore;count:=0;S:=1;cobeginprocess PinR1: Integer;beginP (S);R1:=count;R1:=R1+1;count:=R1;V(S);end;Process PoutR2: Integer;beginP (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;cobeginprocess producer (生产者进程)beginL1:produce a product;P(sp);Buffer:=product;V(sg);goto L1endprocess consumer(消费者进程)beginL2: P(sg);Take a product;V(sp);consume;goto L1end;coend;例3 如果一个生产者和一个消费共享缓冲器容量为可以存放n件物品时,生产者总可继续存入物品;同时当缓冲器的物品不为“0”时,消费者总可从缓冲器中取走物品,用P-V操作实现。
PV操作解决公交车问题
设公共汽车上,司机和售票员的活动分别是:
司机的活动: 启动车辆; 正常行车; 到站停车; 售票员的活动:关车门; 售票; 开车门; 在汽车不断地到站、停车、行驶过程中, 这两个活动有什么同步关系?用信号量和P、 V操作实现它们的同步。
解:
在汽车行驶过程中,司机活动与售票员活 动之间的同步关系为:售票员关车门后,向司 机发开车信号,司机接到开车信号后启动车辆, 在汽车正常行驶过程中售票员售票,到站时司 机停车,售票员在车停后开车门让乘客上下车。 因此司机启动车辆的动作必须与售票员关车门 的动作取得同步;售票员开车门的动作也必须 与司机停车取得同步, 在本题中,应设置两个信号量:S1、S2。 S1表示是否允许司机启动汽车,其初值为0; S2表示是否允许售票员开门,其初值为0。用 P、V原语描述如下:
ቤተ መጻሕፍቲ ባይዱ
int Sl=0; busman() driver() int S2=0; { { main() while(1) while(1) { { { cobegin 关车门; P(S1); driver(); V(Sl); 启动车辆; busman(); 售票; 正常行车; coend P(S2); 到站停车; } 开车门; V(S2); 上下乘客; } } } }
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
司机的活动: 启动车辆; 正常行车; 到站停车; 售票员的活动:关车门; 售票; 开车门; 在汽车不断地到站、停车、行驶过程中, 这两个活动有什么同步关系?用信号量和P、 V操作实现它们的同步。
解:
在汽车行驶过程中,司机活动与售票员活 动之间的同步关系为:售票员关车门后,向司 机发开车信号,司机接到开车信号后启动车辆, 在汽车正常行驶过程中售票员售票,到站时司 机停车,售票员在车停后开车门让乘客上下车。 因此司机启动车辆的动作必须与售票员关车门 的动作取得同步;售票员开车门的动作也必须 与司机停车取得同步, 在本题中,应设置两个信号量:S1、S2。 S1表示是否允许司机启动汽车,其初值为0; S2表示是否允许售票员开门,其初值为() driver() int S2=0; { { main() while(1) while(1) { { { cobegin 关车门; P(S1); driver(); V(Sl); 启动车辆; busman(); 售票; 正常行车; coend P(S2); 到站停车; } 开车门; V(S2); 上下乘客; } } } }