您好,欢迎访问三七文档
第3章进程的同步与通信1第3章进程的同步与通信3.1基本点、重点和难点在多道程序系统中,程序的执行失去了封闭性和再现性,程序的运行具有不确定性,这是我们所不希望看到的。如果多道程序系统中程序的执行不加控制,程序的每次执行就可能得到不同的结果。如何使多道程序的执行的结果具有再现性和确定性?这就需要通过进程间的同步和互斥来实现,将原来无序的、不确定的程序的执行转换为有序的、确定的执行。解决同步和互斥问题最常用的方法就是信号量的方法,通过在程序中使用P、V操作达到同步和互斥的目的。在使用信号量和P、V操作时,很多学生觉得无从下手,感到困惑。这主要是因为他们对进程的本质理解还不够深入、对多道程序设计的原理还不够清楚、对信号量的含义还不够明白造成的。但这部分内容又是各类考试的必考点。本章有很多经典问题,其解题的方法和答案在很多资料上都可以见到。但这些解题的结果是专家们长期精炼而成的,初学者在开始时不可能得到这样的结果。对于初学者而言,迫切想知道的已不单是解题的结果,而是问题解决的思考和分析过程。为此,本章中对一些问题的解答给出了详细的分析过程。3.1.1进程的同步和互斥的概念1.同步(Synchronization)相互合作的进程需要在某些点上协调,先到达某点的进程需要等待后到达的进程,进程间的这种协调关系叫同步。2.互斥(Mutex)互斥是一种特殊的同步方式。当多个进程需要使用相同的资源,而此资源在任一时刻却只能供一个进程使用,获得资源的进程可以继续执行,没有获得资源的进程必须等待。进程间的这种相互排斥关系叫互斥。3.临界资源与临界区(CriticalResourceandCriticalSection)临界资源是一次只允许一个进程使用的资源。临界区是在进程中操作临界资源的程序段。3.1.2锁操作法实现互斥1.基本思想实现互斥的基本思想是使多个进程不能同时进入临界区。给每个临界资源分配一个锁:锁打开时,进程进入临界区,将锁关闭,开始操作临界资源,离开临界区时,将锁打第3章进程的同步与通信2开;锁关闭时,需要进入临界区的进程要等待。2.操作锁的步骤(1)确定临界资源;(2)确定临界区;(3)确定锁个数;(4)设置锁操作。3.1.3信号量与P、V操作1.信号量的引入1965年,荷兰学者Dijkstra提出的信号量机制是一种卓有成效的进程同步工具。在长期且广泛的应用中,信号量机制得到了很大的发展:它从整型信号量经记录型信号量,进而发展为“信号量集”机制。现在的信号量机制已被广泛的应用于单处理机、多处理机系统和计算机网络中。2.信号量(Semaphore)设S为信号量,可以将S看成一个信号灯,但S能比信号灯表达更丰富的含义。(1)当S0时,是绿灯,进程看到绿灯可以通过。S值越大,通过进程的能力越大,供进程使用的相关资源越多。S值反映了可供进程使用的相关资源的数量。(2)当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)V(S)或Signal(S):是发送信号的操作。在该操作中,进行S=S+1,操作使S的值向正方向转化,即操作使信号灯S向绿的方向转化。4.P(S)、V(S)的实现(1)整型信号量P(S):whiles=0dono-opS:=S-1;V(S):S:=S+1;(2)记录型信号量在整型信号量机制中的wait操作,只要是信号量S=0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是该进程处于“忙等”的状态。记录型信号量机制则是一种不存在“忙等”问题的进程同步机制。但在采取了“让权等待”的策略后,又会第3章进程的同步与通信3出现多个进程等待访问同一临界资源的问题。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接或记录上述的所有因此信号量而等待的进程。记录型信号量是由于它采用了纪录型的数据结构而得名的。它所包含的上述两个数据项可描述为:typesemaphore=recordvalue:integer;L:listofprocess;End相应地,wait(s)和singal(s)操作可描述为:Procedurewait(s)vars:semaphore;BeginS.value:=S.value-1;IfS.value0thenBeginInsert(*,S.L);Block(*);EndEndProceduresignal(s)varS:semaphore;BeginS.value:=S.value+1;IfS.value=0thenBeginN=remove(S.L);Wakeup(N);EndEnd每次的wait操作,意味着进程请求一个单位的资源,因此描述为S.value:=S.value-1;当S.value0时,表示资源已分配完毕,进程需要等待而进入阻塞状态。为了便于唤醒,在当前进程需要进入阻塞状态前,将当前进程号插入到信号量链表S.L中,进程调用block原语,进行自我阻塞,放弃处理机。因为只有在S.value0时进程才进入阻塞状态,所以当S.value0时,S.value的绝对值表示在该信号量阻塞进程链表中进程的数目。每次signal操作,表示执行进程释放一个单位资源,故S.value:=S.value+1操作表示资源数目加1。若加1后仍是S.value=0,则表示在该信号量链表中,仍有等待该资源的进程被阻塞,故还应从该信号量链表中移出一个进程,调用wakeup原语将该进程唤醒。第3章进程的同步与通信43.1.4信号量实现进程的同步与互斥1.利用信号量实现互斥当信号量用于互斥时,信号量mutex的含义是进程是否可以操作临界资源,进程是否可以进入临界区。mutex0时,进程可以操作临界资源,可以进入临界区,否则mutex=0时进程必须等待。为了使多个进程能互斥地访问某临界资源,只需为该临界资源设置互斥信号量mutex。如果每次只允许一个进程操作临界资源,其初值为1;如果最多允许k个进程使用某个资源,信号量的初值为k。然后将各进程的临界区CS置于wait(mutex)和signal(mutex)操作之间即可。这样,每个欲访问该临界资源的进程,在进入临界区之前,都要对mutex执行wait操作。若该资源此刻未被访问,本次wait操作成功,进程便可进入自己的临界区,这时若有其他的进程欲进入自己的临界区,进程执行wait操作必然阻塞,从而保证了该临界资源被互斥访问。当访问临界资源的进程退出临界区后,进程对mutex执行signal操作,释放该临界资源。要注意的是,在利用信号量机制实现进程互斥时,wait(mutex)和signal(mutex)必须成对出现。缺少wait(mutex)将会导致系统混乱,不能保证对临界资源的互斥访问;而缺少signal(mutex)将会使临界资源永远不被释放,从而使等待该资源而阻塞的进程永远不能被唤醒。2.利用信号量实现同步当信号量用于互斥时,信号量S的含义是某事件是否发生,某条件是否满足。下面看一下如何用信号量来描述程序或语句之间的前趋关系。设有两个并发执行的进程P1和P2。P1中有语句S1;P2中有语句S2。如果我们希望执行S1后再执行S2。为实现这种前趋关系,我们只需使进程P1和P2共享一个公用信号量S,并赋予其初值为0,将signal(s)操作放在S1后面;而在S2语句前面插入wait(s)操作,即:在进程P1中,S1;signal(s)在进程P2中,wait(s);S2S的含义是S1语句是否执行:S1执行后,信号量S0;,S1没有执行时,信号量S=0。初始状态S1语句没有执行,因此S=0。因为S1执行后S应变成大于0的值,所以S应被初始化为0。这样,若P2先执行必定阻塞自己,只有在进程P1执行完S1;signal(s)后,使S增为1时,P2进程才能执行语句S2。同样,可以利用信号量,按下图语句间的前趋关系,写出一个可并发执行的程序。详细描述如下:vara,b,c,d,e,f,g:semaphore:=0,0,0,0,0,0,0;beginparbeginbeginS1;signal(a);signal(b);end;beginwait(a);S2;signal(c);signal(d);end;beginwait(b);S3;signal(e);end;第3章进程的同步与通信5beginwait(c);S4;signal(f);end;beginwait(d);S5;signal(g);end;beginwait(e);wait(f);wait(g);S6;end;parendend图4.1进程前趋关系图3.解决同步和互斥问题的步骤(1)确定并发和顺序操作哪些操作是并发的?哪些操作是顺序的?这是解决同步和互斥问题时首先要确定的。并发操作可以用多个进程实现,同步和互斥就发生在这多个进程之间。多个进程操作同一临界资源就是进程间的互斥问题,多个进程要按一定的顺序进行操作就是进程间的同步问题。(2)确定互斥和同步的规则分析具体问题,确定同步和互斥的基本方式,确定能够进行正确操作的条件,在这些条件中隐含着同步和互斥的规则。(3)确定同步、互斥的操作流程按操作的步骤,写出每个进程操作的流程(4)确定信号量的个数和含义根据同步和互斥规则以及操作流程确定信号量的个数,确定信号量代表的含义,只有确切地知道信号量所代表的含义,设置这个信号量才有意义。(5)确定信号量的初值同步信号量的初值则要根据进程的初始状态确定,具体问题要具体分析,没有统一的方法。(6)确定P、V操作的位置S1S3S5S6S2S4第3章进程的同步与通信6根据同步和互斥规则和每个进程的操作流程就可以确定P、V操作的位置。需要说明的是无论是互斥问题还是同步问题,只要是需要进程进入阻塞状态,就必须想到在什么时候将进程唤醒。初学者开始时可以按上述步骤解决同步和互斥问题,熟练后,就可以不局限于这些规则,灵活应用。这好象学骑自行车一样,开始时需要左看右看,掌握了基本要领,熟练操作以后就可以随心所欲。以上讲述的只是一般的求解规则,虽然有一定的可操作性,但在实际应用中还是要针对具体情况,多做多想,领悟出其中的原理和窍门。4.同步和互斥的经典问题(1)生产者和消费者问题(PCP:Producer-ConsumerProblem)。例如,消息缓冲通信的管理。(2)读者和写者问题(RWP:Reader-WriterProblem)。例如,共享文件的读写问题。(3)哲学家进餐问题(DPP:DiningPhilosopherProblem)。例如,进程对多类资源的竞争使用。3.2例题解析例3.2.1多道程序系统程序的执行失去了封闭性和再现性,因此多道程序的执行不需要这些特性,这种说法是否正确?解这种说法不正确。可以想象,如果一个程序在多道程序系统中,在相同的输入的情况下,多次执行所得结果是不同的,有谁还敢使用这个程序?因此,多道程序的执行也需要封闭性和再现性,只不过单道程序系统的封闭性和再现性是先天固有的,多道程序系统的程序执行要想获得封闭性和再现性,需通过程序员的精心设计才能得到。所使用的方法就是同步和互斥的方法。例3.2.2多个进程对信号量S进行了5次P操作,2次V操作后,现在信号量的值是-3,与信号量S相关的处于阻塞状态的进程有几个?信号量的初值是多少?解(1)因为S的当前值是-3,因此因为S处于阻塞状态的进
本文标题:进程的同步与通信
链接地址:https://www.777doc.com/doc-320696 .html