ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:73.88KB ,
资源ID:6695973      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6695973.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(PV操作专讲.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

PV操作专讲.docx

1、PV操作专讲第3章 进程的同步与通信3.1 基本点、重点和难点在多道程序系统中,程序的执行失去了封闭性和再现性,程序的运行具有不确定性,这是我们所不希望看到的。如果多道程序系统中程序的执行不加控制,程序的每次执行就可能得到不同的结果。如何使多道程序的执行的结果具有再现性和确定性?这就需要通过进程间的同步和互斥来实现,将原来无序的、不确定的程序的执行转换为有序的、确定的执行。解决同步和互斥问题最常用的方法就是信号量的方法,通过在程序中使用P、V操作达到同步和互斥的目的。在使用信号量和P、V操作时,很多学生觉得无从下手,感到困惑。这主要是因为他们对进程的本质理解还不够深入、对多道程序设计的原理还不

2、够清楚、对信号量的含义还不够明白造成的。但这部分内容又是各类考试的必考点。本章有很多经典问题,其解题的方法和答案在很多资料上都可以见到。但这些解题的结果是专家们长期精炼而成的,初学者在开始时不可能得到这样的结果。对于初学者而言,迫切想知道的已不单是解题的结果,而是问题解决的思考和分析过程。为此,本章中对一些问题的解答给出了详细的分析过程。3.1.1 进程的同步和互斥的概念1. 同步(Synchronization)相互合作的进程需要在某些点上协调,先到达某点的进程需要等待后到达的进程,进程间的这种协调关系叫同步。2. 互斥(Mutex)互斥是一种特殊的同步方式。当多个进程需要使用相同的资源,而

3、此资源在任一时刻却只能供一个进程使用,获得资源的进程可以继续执行,没有获得资源的进程必须等待。进程间的这种相互排斥关系叫互斥。3. 临界资源与临界区(Critical Resource and Critical Section)临界资源是一次只允许一个进程使用的资源。临界区是在进程中操作临界资源的程序段。3.1.2锁操作法实现互斥1 基本思想实现互斥的基本思想是使多个进程不能同时进入临界区。给每个临界资源分配一个锁:锁打开时,进程进入临界区,将锁关闭,开始操作临界资源,离开临界区时,将锁打开;锁关闭时,需要进入临界区的进程要等待。2 操作锁的步骤(1) 确定临界资源;(2) 确定临界区;(3)

4、 确定锁个数;(4) 设置锁操作。3.1.3 信号量与P、V操作1. 信号量的引入1965年,荷兰学者Dijkstra提出的信号量机制是一种卓有成效的进程同步工具。在长期且广泛的应用中,信号量机制得到了很大的发展:它从整型信号量经记录型信号量,进而发展为“信号量集”机制。现在的信号量机制已被广泛的应用于单处理机、多处理机系统和计算机网络中。2. 信号量(Semaphore)设S为信号量,可以将S看成一个信号灯,但S能比信号灯表达更丰富的含义。(1) 当S0时,是绿灯,进程看到绿灯可以通过。S值越大,通过进程的能力越大,供进程使用的相关资源越多。S值反映了可供进程使用的相关资源的数量。(2) 当

5、S=0时,是红灯,进程看到红灯需要等待。此时|S|表示等待S信号的进程的个数。3 信号量的操作最初由Dijkstra把整型信号量定义为一个整型量,除初始化外,仅能通过两个标准的原子操作Wait(S)和Signal(S)来访问,其它方法都不能操作信号量。这两个操作很长时间以来,一直被分别称为P、V操作,因为希腊语的Wait词头为P,Signal的词头为V。对信号量的操作定义如下:(1) P(S)或Wait(S):是等待信号的操作,是查看信号的操作,是看灯操作。若为绿灯,进程继续前进;若为红灯,进程必须等待。在该操作中,进行S=S-1,操作使S的值向负方向转化,即操作使信号灯S向红的方向转化。(2

6、) V(S)或Signal(S):是发送信号的操作。在该操作中,进行S=S+1, 操作使S的值向正方向转化,即操作使信号灯S向绿的方向转化。4 P(S)、V(S)的实现(1) 整型信号量P(S): while s=0 do no-opS:=S-1;V(S):S:=S+1;(2) 记录型信号量在整型信号量机制中的wait操作,只要是信号量S=0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是该进程处于“忙等”的状态。记录型信号量机制则是一种不存在“忙等”问题的进程同步机制。但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的问题。为此,在信号量机制中,除了需要一个

7、用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接或记录上述的所有因此信号量而等待的进程。记录型信号量是由于它采用了纪录型的数据结构而得名的。它所包含的上述两个数据项可描述为:type semaphore=recordvalue:integer;L:list of process;End相应地,wait(s)和singal(s)操作可描述为:Procedure wait(s) var s:semaphore; Begin S.value:=S.value-1; If S.value0 then Begin Insert(*, S.L);Block(*); EndEndPr

8、ocedure signal (s)var S:semaphore;BeginS.value:=S.value+1;If S.value=0 thenBegin N=remove(S.L) ;Wakeup(N); EndEnd每次的wait操作,意味着进程请求一个单位的资源,因此描述为S.value:=S.value-1;当S.value0时,表示资源已分配完毕,进程需要等待而进入阻塞状态。为了便于唤醒,在当前进程需要进入阻塞状态前,将当前进程号插入到信号量链表S.L中,进程调用block原语,进行自我阻塞,放弃处理机。因为只有在S.value0时进程才进入阻塞状态,所以当S.value0时,

9、S.value的绝对值表示在该信号量阻塞进程链表中进程的数目。每次signal操作,表示执行进程释放一个单位资源,故S.value:=S.value+1操作表示资源数目加1。若加1后仍是S.value0时,进程可以操作临界资源,可以进入临界区,否则mutex0;,S1没有执行时,信号量S=0。初始状态S1语句没有执行,因此S=0。因为S1执行后S应变成大于0的值,所以S应被初始化为0。这样,若P2先执行必定阻塞自己,只有在进程P1执行完S1;signal(s)后,使S增为1时,P2进程才能执行语句S2。同样,可以利用信号量,按下图语句间的前趋关系,写出一个可并发执行的程序。详细描述如下:var

10、 a,b,c,d,e,f,g:semaphore:=0,0,0,0,0,0,0;beginparbeginbegin S1; signal(a);signal(b);end;begin wait(a);S2;signal(c);signal(d);end;begin wait(b);S3;signal(e);end;begin wait(c);S4;signal(f);end;begin wait(d);S5;signal(g);end;begin wait(e);wait(f);wait(g);S6;end;parendend图4.1 进程前趋关系图3. 解决同步和互斥问题的步骤(1) 确定

11、并发和顺序操作哪些操作是并发的?哪些操作是顺序的?这是解决同步和互斥问题时首先要确定的。并发操作可以用多个进程实现,同步和互斥就发生在这多个进程之间。多个进程操作同一临界资源就是进程间的互斥问题,多个进程要按一定的顺序进行操作就是进程间的同步问题。(2) 确定互斥和同步的规则分析具体问题,确定同步和互斥的基本方式,确定能够进行正确操作的条件,在这些条件中隐含着同步和互斥的规则。(3) 确定同步、互斥的操作流程 按操作的步骤,写出每个进程操作的流程(4) 确定信号量的个数和含义根据同步和互斥规则以及操作流程确定信号量的个数,确定信号量代表的含义,只有确切地知道信号量所代表的含义,设置这个信号量才

12、有意义。(5) 确定信号量的初值同步信号量的初值则要根据进程的初始状态确定,具体问题要具体分析,没有统一的方法。(6) 确定P、V操作的位置根据同步和互斥规则和每个进程的操作流程就可以确定P、V操作的位置。需要说明的是无论是互斥问题还是同步问题,只要是需要进程进入阻塞状态,就必须想到在什么时候将进程唤醒。初学者开始时可以按上述步骤解决同步和互斥问题,熟练后,就可以不局限于这些规则,灵活应用。这好象学骑自行车一样,开始时需要左看右看,掌握了基本要领,熟练操作以后就可以随心所欲。以上讲述的只是一般的求解规则,虽然有一定的可操作性,但在实际应用中还是要针对具体情况,多做多想,领悟出其中的原理和窍门。

13、4. 同步和互斥的经典问题(1) 生产者和消费者问题(PCP:Producer-Consumer Problem)。例如,消息缓冲通信的管理。(2) 读者和写者问题(RWP:Reader-Writer Problem)。例如,共享文件的读写问题。(3) 哲学家进餐问题(DPP:Dining Philosopher Problem)。例如,进程对多类资源的竞争使用。3.2 例题解析例3.2.1 多道程序系统程序的执行失去了封闭性和再现性,因此多道程序的执行不需要这些特性,这种说法是否正确 ?解 这种说法不正确。可以想象,如果一个程序在多道程序系统中,在相同的输入的情况下,多次执行所得结果是不同的

14、,有谁还敢使用这个程序?因此,多道程序的执行也需要封闭性和再现性,只不过单道程序系统的封闭性和再现性是先天固有的,多道程序系统的程序执行要想获得封闭性和再现性,需通过程序员的精心设计才能得到。所使用的方法就是同步和互斥的方法。例3.2.2 多个进程对信号量S进行了5次 P操作,2次V操作后,现在信号量的值是 -3,与信号量S相关的处于阻塞状态的进程有几个?信号量的初值是多少? 解 (1) 因为S的当前值是-3,因此因为S处于阻塞状态的进程有3个;(2) 因为每进行一次P(S)操作,S的值都减1,每执行1次V操作S的值加1,故信号量的初值为-3+5-2=0;例3.2.3 如下锁的实现方法存在什么

15、缺点?如何改进? LOCK(X) UNLOCK(X) do while X=1 ; X=0; X=1 解 存在的缺点是:当锁是关闭时,采用的是循环等待的方法,这样的等待还是要占用处理机的时间,应该采用阻塞等待的方法。 改进的锁实现如下: LOCK(X) UNLOCK(X) if X.value=1 if not empty(X.L) insert( *, X.L); P=remove(X.L); Block (*) Wakeup(P) else X.Value=1 else X.Value=0 这里X.value是锁的值,X.L是存放由于锁X而阻塞的进程的队列。insert( *, X.L)将

16、当前进程的进程号插入到X.L,remove(X.L)是从X.L中移出一个进程号。例3.2.4 使用多个进程计算Y=F1(X)+F2 (X).解 (1) 确定并发和顺序操作在这个问题中,F1(X)和F2 (X)的计算是可以并行处理的,因此F1(X)和F2 (X)可以分别出现在两个进程中。(2) 确定互斥或同步的规则在F1(X)+F2 (X)中,必须在F1(X)和F2(X)计算完毕,才能进行加法运算,因此本问题是同步问题。(3) 同步的操作流程进程main 创立进程p1来计算F1(X); 创立进程p2来计算F2(X); F1(X)计算是否完成?没有,等待; F2(X)计算是否完成?没有,等待; 进

17、行加法运算。进程p1y1= F1(X); 设置F1(X)计算完成标志; 进程p2 y1= F2(X); 设置F2(X)计算完成标志。 (4) 确定信号量的个数和含义根据同步规则以及操作流程确定信号量的个数是2个,S1和S2:S1含义是F1(X)计算是否完成; S2含义是F2(X)计算是否完成。 (5) 确定信号量的初值S1=0;S2=0。 (6) 确定P、V操作的位置上面处是一个P操作,P(S1);上面处是一个P操作,P(S2);上面处是一个V操作,V(S1);上面处是一个V操作,V(S2)。解法1Main ( )Public y, y1, y2,. P1, P2Semaphore S1,S2

18、 S1=0;S2=0;P1=Creat(N-F1, F1,x,);P2=Creat(N-F2, F2, x,);P(S1);P(S2);y=y1+y2;Procedure F1(x)y1= 计算1;V(S1);Procedure F2(x)y2=计算2;V(S2)解法2Main ( )Public y, y1, y2,. P1,xSemaphore S1 input(x);S1=0;P1=Creat(N-F1, F1,x,);Y2=F2(x);P(S1);y=y1+y2;Procedure F1(x)y1= 计算1;V(S1)采用2个进程和1个信号量来实现Y=F1(X)+F2 (X)的时候,采

19、用的方法是父进程创立子进程,F1(X)在子进程中计算,F2 (X)在父进程中计算,因此F1(X)和F2(X)计算仍然是并发进行的。S1信号量的含义为F1(X)是否完成。改进的方法比原来的方法节约一个进程和一个信号量,但并发操作的程度并没有降低。例3.2.5 生产者消费者问题演变。情况1 一个buffer,一个生产者,一个消费者,生产者只生产一个东西,消费者只进行一次消费,即:生产者只进行一次putdata操作,消费者只进行一次getdata操作。 解 这是一个同步问题,生产者和消费者分别是2个并发的进程。(1)操作规则如果buffer为空,则消费者只能等待。(2)操作流程 putdata; 设

20、置Buffer有数据标志 V(S) 判断buffer是否有产品,没有则等待; getdata; (3) 信号量设置1个信号量full,full表示buffer是否有数据,初值为0。(4) P、V操作实现var full:semaphore:=0; buffer: array 1 of item; begin parbegin producer: begin putdata; V(full); end consumer:begin P(full); getdata; end parend end情况2 一个buffer,一个生产者,一个消费者,生产者不断地进行putdata操作,消费者不断地进行

21、getdata操作,即:生产者不断地生产,消费者不断地消费(1) 操作规则只有buffer为空时才能进行putdata操作;只有buffer有数据时才能进行putdata操作。(2) 操作流程 repeat判断buffer是否为空,不空则等待; putdata ; 设置buffer有数据的标志; until falserepeat判断buffer是否有数据,没有数据则等待; getdata; 设置buffer为空标志;until false (3) 信号量 设置2个信号量full和empty。full表示buffer是否有数据。因为进程在初始状态时,buffer 中没有数据,故初值为0,变化范

22、围-11。 empty表示buffer是否为空。因为进程在初始状态时,buffer为空,故初值为0初值为1,变化范围-11。(4) P、V操作实现 var full:semaphore:=0; emptyl:semaphore:=1; buffer: array 1 of item; begin parbegin producer: begin repeat P(empty); putdata; V(full); until false end consumer:begin repeat P(full); getdata; V(empty); until false. end parend e

23、nd情况3 一个buffer,多个生产者,多个消费者,多个生产者和消费者都在不断地存取buffer,即生产者不断地进行putdata操作,消费者不断地进行getdata操作。(1) 操作规则只有buffer为空时才能进行putdata操作;只有buffer有数据时才能进行putdata操作。这时buffer变成了临界资源,不允许多个进程同时操作buffer,即不允许多个消费者同时进行gedata,不允许多个生产者同时进行putdata操作。(2) 操作流程 repeat判断buffer是否为空,不则等待; 是否可操作buffer;putdata; 设置buffer可操作标志; 设置buffer

24、有数据的标志; until false repeat判断buffer是否有数据,没有则等待; 是否可操作buffer;getdata ;设置buffer可操作标志; 设置buffer为空标志;until false (3) 信号量 设置3个信号量full、empty和B-M。full表示buffer是否有数据,初值为0; empty表示buffer是否为空,初值为1; B-M 表示 buffer是否可操作,初值为1。由于buffer只有一个,full和empty可以保证对buffer的正确操作,故B-M 是多余的,可以省略。(4) P、V操作实现 repeat repeat P(empty);

25、 P(full); P(B-M); P(B-M); putdata; getdata; V(B-M); V(B-M); V(full); V(empty); until false. until false 情况4 多个生产者,多个消费者,N个buffer,多次循环存取buffer,即,即多个生产者不断地进行putdata操作,多个消费者不断地进行getdata操作。(1) 操作规则只有buffer有空间才能进行putdata操作;只有buffer有数据才能进行putdata操作;这时buffer变成了临界资源,不允许多个消费者和生产者同时对同一个buffer 进行gedata和putdata

26、操作。(2) 操作流程 repeat判断buffer是否有空间,没有则等待; 是否可操作buffer;putdata; 设置buffer可操作标志; 设置buffer有数据的标志; until false repeat判断buffer是否有数据,没有则等待; 是否可操作buffer;getdata; 设置buffer可操作标志; 设置buffer有空间标志;until false (3) 信号量 full表示buffer是否有数据,初值为0; empty表示buffer是否为空,初值为N;B-M 表示 buffer是否可操作,初值为1。(4) P、V操作实现 repeat repeat P(e

27、mpty); P(full); P(B-M); P(B-M); putdata; getdata; V(B-M); V(B-M); V(full); V(empty); until false until false (5) 改进的P、V操作实现 在上述的实现中,putdata和getdata操作都在临界区中,因此多个进程对多个buffer的操作是不能并发进行的,进程间并行操作的程度很低。实际上只要保证多个进程同时操作不同buffer就可以实现对整个buffer的并行操作。因此,只要保证为不同的进程分配不同buffer,putdata和getdata操作是可以同时进行。这样互斥不是发生在对buffer的存取操作上,而是发生在对buffer的分配上,这个时间与存取buffer的时间相比是较短的,因此减少了进程处

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1