版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
进程同步与互斥例题进程同步进程同步:并发进程之间相互合作,完成一项工作,它们之间有一定的时序关系。解题步骤:确定进程的个数及每个进程的工作;确定关键工作步〔需要控制的〕;确定信号量表示的含义〔开始或结束〕;写出伪代码。例1:请用信号量机制描述以下并发进程的同步关系。进程的同步SFP1P2P3P4解法一:信号量表示进程能否开始。设信号量m1、m2、m3、m4分别表示进程P1、P2、P3、P4能否开始执行,其初值m1为1,其余均为0。intm1=1,m2=m3=m4=0;cobeginp1()//P2()//P3()//P4()coend进程的同步思考:哪个信号量可以省略?m1p1(){P(m1);
执行p1;V(m2);V(m3);}p2(){P(m2);
执行p2;V(m4);}p3(){P(m3);
执行p3;V(m4);}p4(){P(m4);P(m4);
执行p4;}解法二:信号量表示进程是否结束。设信号量m1、m2、m3、m4分别表示进程P1、P2、P3、P4是否结束,其初值均为0。intm1=m2=m3=m4=0;cobeginp1()//P2()//P3()//P4()coend进程的同步思考:哪个信号量可以省略?m4p1(){
执行p1;V(m1);V(m1);}p2(){P(m1);
执行p2;V(m2);}p3(){P(m1);
执行p3;V(m3);}p4(){P(m2);P(m3);
执行p4;V(m4);}练习:请用信号量机制描述以下并发进程的同步关系。进程的同步SFP1P2P4P7P3P5P6解法一:信号量表示进程能否开始。设信号量m1~m7分别表示进程P1~P7能否开始执行,其初值m1为1,其余均为0。intm1=1,m2=m3=m4=m5=m6=m7=0;cobeginp1()//p2()//p3()//p4()//p5()//p6()//p7()coend进程的同步解法二:信号量表示进程是否结束。设信号量m1~m7分别表示进程P1~P7是否结束,其初值均为0。intm1=m2=m3=m4=m5=m6=m7=0;cobeginp1()//p2()//p3()//p4()//p5()//p6()//p7()coend进程的同步进程的同步例2:公共汽车中的司机和售票员。司机P1售票员P2while(true)while(true){{
启动车辆;关门;
正常运行;售票;
到站停车;开门;
}}
解法一:信号量表示进程能否开始。设信号量m1表示司机进程P1能否启动汽车,初值为0,m2表示售票员进程p2能否开门,初值为0。intm1=0,m2=0;cobeginp1()//p2()coend进程的同步p1(){while(1){P(m1);启动汽车;正常行驶;到站停车;V(m2);}}p2(){while(1){关门;V(m1);售票;P(m2);开门;}}解法二:信号量表示进程是否结束。设信号量m1表示司机进程P1到站停车结束,初值为0,m2表示售票员进程p2关门结束,初值为0。intm1=0,m2=0;cobeginp1()//p2()coend进程的同步p1(){while(1){P(m2);启动汽车;正常行驶;到站停车;V(m1);}}p2(){while(1){关门;V(m2);售票;P(m1);开门;}}进程的同步例3-1:吃水果。父亲P1儿子P2while(true)while(true){{
洗水果;取水果;
放水果;吃水果;
}}
0父亲儿子水果分析:父亲先放水果,儿子再吃水果;儿子取完水果,父亲再放水果,这两个进程是一个同步关系。解法一:设信号量m1表示父亲能否放水果,m2表示儿子能否取水果。其初值m1=1,m2=0。intm1=1,m2=0;cobeginp1()//p2()coend进程的同步p1(){while(1){洗水果;P(m1);
放水果;V(m2);}}p2(){while(1){P(m2);
取水果;V(m1);吃水果;}}思考:假设盘子能放n个水果,如何修改同步关系?intm1=n,m2=0;分析:父亲先放水果,儿子再吃水果;儿子取完水果,父亲再放水果,这两个进程是一个同步关系。解法二:设信号量m1表示父亲放完水果,m2表示儿子取完水果。其初值m1=0,m2=1。intm1=0,m2=1;cobeginp1()//p2()coend进程的同步p1(){while(1){洗水果;P(m2);
放水果;V(m1);}}p2(){while(1){P(m1);取水果;V(m2);吃水果;}}进程的同步例3-2:吃水果。
父亲P1儿子P2女儿P3
while(true)while(true)while(true){{{
洗水果;取桔子;取苹果;
放水果;吃桔子;吃苹果;
}}}
桔子父亲儿子女儿0苹果分析:父亲先放水果,儿子女儿再吃水果;儿子女儿取完水果,父亲再放水果,这三个进程是一个同步关系。解法一:设信号量m1表示父亲能否放水果,m2表示儿子能否取桔子,m3表示女儿能否取苹果。intm1=1,m2=0,m3=0;cobeginp1()//p2()//p3()coend进程的同步p1(){while(1){洗水果;P(m1);
放水果;if(是桔子)V(m2);elseV(m3);}}p2(){while(1){P(m2);
取桔子;V(m1);吃桔子;}}p3(){while(1){P(m3);
取苹果;V(m1);吃苹果;}}分析:父亲先放水果,儿子女儿再吃水果;儿子女儿取完水果,父亲再放水果,这三个进程是一个同步关系。解法二:设信号量m1表示父亲放完桔子,m2表示父亲放完苹果,m3表示儿子女儿取完水果。intm1=0,m2=0,m3=1;cobeginp1()//p2()//p3()coend进程的同步p1(){while(1){洗水果;P(m3);
放水果;if(是桔子)V(m1);elseV(m2);}}p2(){while(1){P(m1);取桔子;V(m3);吃桔子;}}p3(){while(1){P(m2);
取苹果;V(m3);吃苹果;}}进程的同步例3-3:吃水果。
父亲P1母亲P2儿子P3
while(true)while(true)while(true){{{
洗桔子;洗苹果;取水果;
放桔子;放苹果;吃水果;
}}}
0父亲儿子母亲桔子苹果分析:父母亲先放水果,儿子再取水果吃;父亲与儿子,母亲与儿子是一个同步关系,父亲与母亲要竞争空盘子。解法一:设信号量m1表示是否有空盘子,信号量m2表示儿子能否取水果。intm1=1,m2=0;cobeginp1()//p2()//p3()coend进程的同步p1(){while(1){洗桔子;P(m1);
放桔子;V(m2);}}p2(){while(1){洗苹果;P(m1);放苹果;V(m2);}}p3(){while(1){P(m2);
取水果;V(m1);吃水果;}}分析:父母亲先放水果,儿子再取水果吃;父亲与儿子,母亲与儿子是一个同步关系,父亲与母亲要竞争空盘子。解法二:设信号量m1表示父亲或母亲放完水果,信号量m2表示儿子取完水果。intm1=0,m2=1;cobeginp1()//p2()//p3()coend进程的同步p1(){while(1){洗桔子;P(m2);
放桔子;V(m1);}}p2(){while(1){洗苹果;P(m2);
放苹果;V(m1);}}p3(){while(1){P(m1);
取水果;V(m2);吃水果;}}0进程的同步例3-4:吃水果。
父亲P1母亲P2儿子P3
女儿P4
while(true)while(true)while(true)while(true){{{{
洗桔子;洗苹果;取苹果;取桔子;
放桔子;放苹果;吃苹果;吃桔子;}}}}
桔子父亲女儿母亲苹果儿子分析:父母亲先放水果,儿子女儿再取水果;父亲与女儿,母亲与儿子是一个同步关系,父亲与母亲要竞争空盘子。解法一:设信号量m1表示是否有空盘子,信号量m2表示儿子能否取苹果,m3表示女儿能否取桔子。intm1=1,m2=0,m3=0;cobeginp1()//p2()//p3()//p4()coend进程的同步p1(){while(1){洗桔子;P(m1);
放桔子;V(m3);}}p2(){while(1){洗苹果;P(m1);
放苹果;V(m2);}}p3(){while(1){P(m2);
取苹果;V(m1);吃苹果;}}p4(){while(1){P(m3);
取桔子;V(m1);吃桔子;}}分析:父母亲先放水果,儿子再取水果吃;父亲与儿子,母亲与儿子是一个同步关系,父亲与母亲要竞争空盘子。解法二:设信号量m1表示父亲放完桔子,m2表示母亲放完苹果,信号量m3表示儿子或女儿取完水果。intm1=0,m2=0,m3=1;cobeginp1()//p2()//p3()//p4()coend进程的同步p1(){while(1){洗桔子;P(m3);
放桔子;V(m1);}}p2(){while(1){洗苹果;P(m3);
放苹果;V(m2);}}p3(){while(1){P(m2);
取苹果;V(m3);吃苹果;}}p4(){while(1){P(m1);
取桔子;V(m3);吃桔子;}}进程的同步例4:打印文件。
P1P2P3
while(true)while(true)while(true){{{
从磁盘取文件;从缓冲1取文件;从缓冲2取文件;
放入缓冲1;放入缓冲2;打印文件;
}}}
缓冲1磁盘打印机缓冲2P1P2P3分析:P1做完,P2才能做,P2做完,P3才能做。这三个进程是一个同步关系。解法一:设信号量m1表示P1能否把文件放入缓冲1,m2表示P2能否从缓冲1取文件,m3表示P2能否把文件放入缓冲2,m4表示P3能否从缓冲2取文件。intm1=1,m2=0,m3=1,m4=0;cobeginp1()//p2()//p3()coend进程的同步p1(){while(1){从磁盘读文件;P(m1);
放入缓冲1;V(m2);}}p2(){while(1){P(m2);
从缓冲1取文件;V(m1);P(m3);
放入缓冲2;V(m4);}}p3(){while(1){P(m4);从缓冲2取文件;V(m3);打印文件;}}思考:1.缓冲1可以存放n个文件,缓冲2可以存放m个文件,如何修改同步关系?2.如果P2改为如下形式,会有何影响?intm1=n,m2=0,m3=m,m4=0;P(m2);P(m3);从缓冲1取文件;放入缓冲2;V(m1);V(m4);进程的并发性不如修改前分析:P1做完,P2才能做,P2做完,P3才能做。这三个进程是一个同步关系。解法二:设信号量m1表示P1是否把文件放入缓冲1,m2表示P2是否从缓冲1取完文件,m3表示P2是否把文件放入缓冲2,m4表示P3是否从缓冲2取完文件。intm1=0,m2=1,m3=0,m4=1;cobeginp1()//p2()//p3()coend进程的同步p1(){while(1){从磁盘读文件;P(m2);
放入缓冲1;V(m1);}}p2(){while(1){P(m1);
从缓冲1取文件;V(m2);P(m4);
放入缓冲2;V(m3);}}p3(){while(1){P(m3);从缓冲2取文件;V(m4);打印文件;}}小结进程同步有一定的时序关系。信号量表示进程的关键工作是否可以开始或已经结束。信号量的个数与进程的个数一致,有时可以省略局部信号量。对同一个信号量的PV操作不在一个进程中。表示开始:P自己,V别人表示结束:P别人,V自己进程的同步进程互斥进程互斥:并发进程之间相互竞争临界资源的排他性关系。解题步骤:确定临界资源及个数;确定进程的关键工作步〔使用临界资源的〕;确定信号量的初值;写出伪代码。例1:过独木桥。进程的互斥P1P2{{由西向东过独木桥;由东向西过独木桥;}}P1P2分析:进程P1、P2因竞争独木桥这个资源而成为互斥关系。设:信号量m表示独木桥资源,初值为1表示资源可用。intm=1;cobeginp1()//p2()coend进程的互斥p1(){P(m);
通过独木桥;V(m);}p2(){P(m);
通过独木桥;V(m);}练习:过十字路口〔单道〕。进程的互斥P1P2P3P4{{{{通过路口;通过路口;通过路口;通过路口;}}}}P2P3P4P1分析:进程P1、P2、P3、P4因竞争十字路口这个资源而成为互斥关系。设:信号量m表示十字路口资源,初值为1表示资源可用。intm=1;cobeginp1()//p2()//p3()//p4()coend进程的互斥p1(){P(m);
通过路口;V(m);}p2(){P(m);
通过路口;V(m);}p3(){P(m);
通过路口;V(m);}p4(){P(m);
通过路口;V(m);}练习2:过十字路口〔双道〕。进程的互斥P1P2P3P4{{{{通过路口;通过路口;通过路口;通过路口;}}}}P1P2P3P4例2:读写数据库。某数据库有一个写进程、多个读进程,它们之间读、写操作的互斥要求是:写进程运行时,其他读、写进程不能对数据库进行操作。读进程之间不互斥,可以同时读数据库。请用信号量及PV操作描述这一组进程的工作过程。〔读者-写者问题〕进程的互斥数据库写者读者写者读者{{写数据库;读数据库;}}分析:写进程writer、读进程reader因竞争数据库这个资源而成为互斥关系。因为写进程执行时,不能执行其他读写进程,所以还必须设置一个计数器统计读进程的个数。如果是第一个读进程,就与写进程竞争数据库。如果是最后一个读进程,就释放数据库。因计数器是一个临界资源,所以多个读进程对计数器的操作又是互斥操作。
设:信号量rmutex表示数据库资源,初值为1表示资源可用;wmutex表示计数器count资源,初值为1表示可用。intrmutex=1,wmutex=1;cobeginreader()//writer()coend进程的互斥思考:只要有读进程时,写进程就不能开始,如何改变使写进程之后的读进程在写进程之后执行?例3:哲学家就餐问题。有4位哲学家围着一个圆桌在讨论问题和进餐,在讨论时每人手中什么都不拿,当需要进餐时,每人需要用刀和叉各一把。餐桌上的布置如下图,共有两把刀和两把叉,每把刀或叉供相邻的两个人使用。请用信号量及PV操作说明4位哲学家的同步过程。进程的互斥哲学家{
进餐;讨论问题;}分析:进程pa、pb、pc、pd因竞争刀和叉而成为互斥关系。设:4个互斥信号量fork1,fork2,knife1,knife2,其初值均为“1〞,分别表示叉1、叉2、刀1、刀2是可用的。其工作流程如下图。intfork1=fork2=knife1=knife2=1;cobeginpa()//pb()//pc()//pd()coend进程的互斥pa(){
while(1){P(knife1);P(fork1);
进餐;V(knife1);V(fork1);讨论问题;}}pb(){
while(1){
P(fork1);P(knife2);进餐;V(knife2);V(fork1);讨论问题;}}pc(){
while(1){P(knife2);P(fork2);进餐;V(knife2);V(fork2);讨论问题;}}pd(){
while(1){P(fork2);P(knife1);进餐;V(knife1);V(fork2);讨论问题;}}思考:四位哲学家同时拿起右手的餐具,再拿左手的餐具,会出现什么问题?P(knife1);P(fork2);P(knife2);P(fork1);例4:连续过独木桥。在南开大学和天津大学之间有一条弯曲的小路,其中从S到T有一段路每次只允许一辆自行车通过。但是,其中有一个小的平安岛M〔同时允许两辆自行车停留〕,可以供两辆自行车错车时使用,如下图。试设计一个算法以确保来往自行车的顺利通过。进程的互斥tonan{通过TL;上平安岛M;通过KS;}totian{通过KS;上平安岛M;通过TL;}分析:此图可以简化为:在此题中,需要控制路段T到L,S到K及平安岛M的使用。路段T到L,S到K都只允许一辆自行车通过,而平安岛允许两辆自行车使用,两个路段和平安岛相当于临界资源。通过该路段的两个进程没有必然的先后次序,因此,此题属于互斥问题。另外,为了保证平安岛上最多有两辆自行车,需要对相向行驶的两个方向进行控制,在每个方向上一次只允许一辆自行车通过。设:5个信号量ST、TS、K、L、M,ST表示是否允许自行车从南大到天大,TS表示是否允许自行车从天大到南大,K表示是否允许自行车通过路段SK,L表示是否允许自行车通过路段TL,M表示平安岛上还可以停放自行车的数目。其工作流程如下图。intfork1=fork2=knife1=knife2=1;cobegintotian()//tonan()coend进程的互斥思考:在totian()中,P(ST)与P(K)互换位置,会对进程产生什么影响?假设P(M)与V(K),P(L)与V(M),V(L)与V(ST)互换位置呢?小结进程互斥:进程之间要竞争临界资源。信号量表示临界资源是否可用,或临界资源的数量。信号量的个数与临界资源的个数一致。对同一个信号量的PV操作要在同一个进程中完成。P操作:进入临界区前V操作:离开临界区后进程的互斥进程的同步与互斥解题步骤:确定各个进程的工作步;确定进程的哪些工作是同步关系,哪些工作是互斥关系;同步:有时序关系的互斥:竞争临界资源的确定信号量含义及初值;写出伪代码。例1:读写环形缓冲区。设有一个具有N个信息元素的环形缓冲区〔如下图〕,A进程顺序地把信息写进缓冲区,B进程依次从缓冲区中读出信息,请用PV操作描述A、B进程的同步。〔生产者-消费者问题〕进程的同步与互斥进程A{写数据;}进程B{读数据;}分析:这是一个具有多个缓冲空间的生产者消费者问题,也是一个同步加互斥的问题。A、B两个进程对缓冲区的访问必须互斥。并且当缓冲区满时,A进程不能写入,必须等待;当缓冲区空时,B进程不能读,必须等待,读写进程之间又是同步问题。设:3个信号量:互斥信号量S=1〔表示对缓冲区的互斥使用〕;同步信号量Sw〔代表缓冲区是否有空闲,即写进程能否写〕、Sr〔代表缓冲区是否有数据,即读进程能否读〕,假设初始时缓冲区没有任何数据,那么Sw=N,Sr=0。设一个数组array表示缓冲区,两个整型变量in、out表示写入和读出的位置。其工作流程如下图。#defineN10;intarray[N],in=0,out=0;intS=1,Sw=N,Sr=0;cobeginPA()//PB()coend进程的同步与互斥例2:理发师理发。理发师理发问题。有一个理发师、一把理发椅和n把等候理发顾客坐的椅子。如果没有顾客,那么理发师在理发椅上睡觉;当一个顾客到来时,必须唤醒理发师,进行理发;当理发师正在理发,又有顾客来到时,如果有空椅子,顾客就可以坐下来等候,如果没有空椅子,他就离开。请为理发师和顾客各编一个程序表述他们的行为。进程的同步与互斥barber
{给顾客理发;}customer
{坐下等候;理发;}分析:此题涉及两个进程:理发师和顾客。当有顾客时理发师就可以理发,理完发后,从等候的顾客中选一位顾客继续理发。当理发师正在理发时,顾客要等待,假设没有座位就离开,顾客与理发师的工作是同步关系。有多少顾客在等候,需设计一个计数器来记录,顾客和理发师对计数器的操作是互斥的。所以,这是一个同步加互斥的问题。设:3个信号量:S1表示理发师是否可以开始理发,即是否有顾客;S2表示顾客是否可以被理发,即是否有理发师;S3是对计数器waiting的互斥操作;waiting表示等待顾客的人数。其工作流程如下图。#defineCHAIR10;intS1=0,S2=0,S3=1,waiting=0;cobeginbarber()//customer()coend进程的同步与互斥例3:单行隧道问题。对一个单行的隧道进行模拟,为了防止死锁,必须防止汽车同时从两端进入隧道。如果一次只允许一辆车通过隧道,两个方向按车辆到达的先后顺序依次通过,请用pv操作设计一个算法实现这个控制。进程同步与互斥的综合例题P1()
{通过隧道;}P2()
{通过隧道;}分析:此题涉及两个进程:P1和P2。隧道是一个临界资源,一次只能被一辆车占有,可以把它看作互斥问题。设:一个互斥信号量sd=1,表示隧道是否可用。intsd=1;cobeginP1()//P2()coend进程同步与互斥的综合例题P1()
{P(sd);通过隧道;V(sd);}P2()
{P(sd);通过隧道;V(sd);}问题:两个方向车辆通过隧道的交换比较平凡,系统效率不高分析:为了提高效率,把问题改为:一旦一辆车进入,那么同一方向的车可以立即跟进。写出用信号量解决此问题的代码,不考虑“饥饿〞的情况。(按照读者-写者问题处理)设:3个信号量:c表示计数器,m表示对临界资源计数器的控制,sd表示对临界资源隧道的控制,即隧道是否可用。intc=0,m=1,sd=1;cobeginP1()//P2()coend进程同步与互斥的综合例题P2()
{P(sd);通过隧道;V(sd);}P1(){ P(m);/*m1控制计数器c1*/ if(c==0)P(sd);/*p1第一辆车通过时占有隧道*/ c=c+1; V(m); 通过隧道; P(m); c=c-1; if(c==0)V(sd);/*p1最后一辆车通过后释放隧道*/ V(m);}问题:假设P1过隧道,那么后续车辆可以跟进;假设p2过隧道,一次只能过一辆;P1不会产生“饥饿〞的现象,而p2会产生“饥饿〞的现象。分析:解决p2“饥饿〞现象的方法:再设一个信号量k,让p1、p2排队,可以做到p1方向比p2方向晚来的车辆被k阻止。intc=0,m=1,sd=1,k=1;cobeginP1()//P2()coend进程同步与互斥的综合例题P2()
{
P(k);P(sd);通过隧道;V(sd);
V(k);}P1(){ P(k);
/*与P2一起排队*/P(m);/*m1控制计数器c*/ if(c==0)P(sd);/*P1第一辆车通过时占有隧道*/ c=c+1; V(m);
V(k); 通过隧道; P(m); c=c-1; if(c==0)V(sd);/*P1最后一辆车通过后释放隧道*/ V(m);}问题:假设P1过隧道,那么后续车辆可以跟进;假设p2过隧道,一次只能过一辆。分析:解决p2可以过多辆车的方法:按照读者-读者问题处理。即:p1为读者,p2为读者,但两个读者不能同时读
。int
c1=c2=0,m1=m2=1,sd=1;
//c1、c2为计数器,m1、m2为互斥信号量cobeginP1()//P2()coend进程同步与互斥的综合例题P1(){ P(m1); if(c1==0)P(sd); c1=c1+1; V(m1); 通过隧道; P(m1); c1=c1-1; if(c1==0)V(sd); V(m1);}问题:假设P1过隧道,那么后续车辆可以跟进,有可能使p2“饥饿〞假设P2过隧道,那么后续车辆也可以跟进,有可能使p1“饥饿〞P2(){ P(m2); if(c2==0)P(sd); c2=c2+1; V(m2); 通过隧道; P(m2); c2=c2-1; if(c2==0)V(sd); V(m2);}假设:问题改为:一旦一辆车进入,那么同一方向的车可以立即跟进,隧道最多只能过4辆车,如何修改算法?intc1=c2=0,m1=m2=1,sd=1,k1=4,k2=4;//c1、c2为计数器,m1、m2为互斥信号量cobegin//k1、k2为控制各自方向上通过的车辆数P1()//P2()coend进程同步与互斥的综合例题P1(){ P(k1);P(m1); if(c1==0)P(sd); c1=c1+1; V(m1); 通过隧道; P(m1); c1=c1-1; if(c1==0)V(sd); V(m1);
V(k1);}问题:是p1优先或p2优先的方法。p1后续车辆可以跟进,p2后续车辆也能跟进。P1会产生“饥饿〞的现象,p2也会产生“饥饿〞的现象。P2(){ P(k2);P(m2); if(c2==0)P(sd); c2=c2+1; V(m2); 通过隧道; P(m2); c2=c2-1; if(c2==0)V(sd); V(m2);
V(k2);}解决p1、p2“饥饿〞现象的方法是:一方每过n〔如4〕辆车后,就允许对方也过n辆车。intc1=c2=0,m1=m2=1,sd=1,k1=4,k2=4,n1=0,n2=0;//n1、n2为计数器cobegin//k1、k2为控制各自方向上通过的车辆数P1()//P2()coend进程同步与互斥的综合例题P1(){ P(k1);P(m1); if(c1==0)P(sd); c1++;n1++; V(m1); 通过隧道; P(m1); c1=c1-1; if(c1==0){V(sd);//让本方向再过4车
for(i=1;i<=n1;i++)V(k1);n1=0;} V(m1);V(k1);}P2(){ P(k2);P(m2); if(c2==0)P(sd); c2++;n2++; V(m2); 通过隧道; P(m2); c2=c2-1; if(c2==0){V(sd);//让本方向再过4车
for(i=1;i<=n2;i++)V(k2);n2=0;} V(m2);V(k2);}使用PV操作的规那么:①分清哪些是互斥问题〔互斥访问临界资源的〕,哪些是同步问题〔具有前后执行顺序要求的〕。②对于互斥问题要设置互斥信号量,不管有互斥关系的进程有几个或几类,互斥信号量的个数只与临界资源的种类有关。通常,有几类临界资源就设置几个互斥信号量,且初值为1,代表临界资源可用。③对于同步问题要设置同步信号量,通常同步信号量的个数与参与同步的进程种类有关,即同步关系涉及几类进程,就有几个同步信号量。同步信号量表示该进程是否可以开始或该进程是否已经结束。④在每个进程中用于实现互斥的PV操作必须成对出现;用于实现同步的PV操作也必须成对出现,但是,它们分别出现在不同的进程中;在某个进程中如果同时存在互斥与同步的P操作,那么其顺序不能颠倒。必须先执行对同步信号量的P操作,再执行对互斥信号量的P操作。但是,V操作的顺序没有严格要求。进程的同步与互斥管程进程的缺乏:每个访问临界资源的进程都必须使用PV操作,使得大量的同步操作分散在各个进程中。这不仅给系统的管理带来了麻烦,还可能因同步操作使用不当而导致系统故障,如顺序不当、误写、漏写等。管程的引入:1971年,Dijkstra提出,把所有进程中对某一种临界资源的同步操作都集中起来,构成一个所谓的“秘书〞进程,但凡访问该临界资源的进程,都需要先报告“秘书〞,由“秘书〞来实现进程的同步。1973年,Hansan和Hoare又把“秘书〞进程思想开展为管程的概念。概念一个管程实际上是定义了一个数据结构和在该数据结构上的能为并发进程所执行的一组操作。与信号量的区别信号量机制是基于进程控制来分配和使用资源的。管程是基于资源控制来协调访问资源的进程的。管程的组成局部于管程的共享变量说明对该数据结构进行操作的一组过程对局部于管程的数据设置初始值的语句。此外,每个管程都有惟一的名字来标识。管程类似于面向对象程序设计中的类。
管程利用管程实现同步操作利用管程实现同步,必须设置两个同步操作原语:〔1〕wait原语:当某进程通过管程请求获得临界资源而未得到满足时,管程调用该原语使该进程阻塞,并将它排在该临界资源的阻塞队列上。〔2〕signal原语:仅当一个进程访问完成并释放临界资源时,管程才能调用该原语,唤醒阻塞队列上的队首进程。为了区别阻塞的原因,需要设置一个条件变量。条件变量是一个整型变量,用condition说明,在条件变量上可以使用wait和signal操作原语。管程定义的一般格式为:monitor管程类名/*monitor是关键词*/{ 共享变量说明; 条件变量说明; 过程定义;/*一般有多个*/}管程例1:读写环形缓冲区。设有一个具有N个信息元素的环形缓冲区〔如下图〕,A进程顺序地把信息写进缓冲区,B进程依次从缓冲区中读出信息,请用PV操作描述A、B进程的同步。〔生产者-消费者问题〕管程进程A{写数据;}进程B{读数据;}分析:设in,out,count,buffer[]为共享变量:buffer[]为缓冲区,即生产者和消费者的共享资源。count为缓冲区产品的数量。in指示生产者存放产品的位置。out指示消费者取产品的位置。full,empty为条件变量:full表示当缓冲区产品放满时,生产者排队。empty表示当缓冲区无产品时,消费者排队。put(),get()为两个对缓冲区的操作过程:其中put()表示把产品放入缓冲区。get()表示从缓冲区取产品。管程#defineN10monitorproducer_consumer/*定义生产者-消费者管程*/{ intin=0,out=0,count=0,buffer[N]; conditioanfull,empty; put(intitem) { if(count>=N) full.wait;/*当缓冲区满时排队*/ buffer[in]=item; in=(in+1)%N; count++; empty.signal;/*唤醒消费者等待队列中的进程*/}
get(intitem){ if(count<=0) empty.wait;/*当缓冲区空时排队*/ item=buffer[out]; out=(out+1)%N; count--; full.signal;/*唤醒生产者等待队列中的进程*/}}管程生产者—消费者描述为:intitem;/*产品*/monitorproducer_consumerpc;/*pc为一个具体的生产者-消费者管程*/cobeginproducer()/*生产者*/{ while(1) { 生产一个产品item; pc.put(item);/*调用管程中的过程,存放产品*/}}//consumer()/*消费者*/{ while(1) { pc.get(item);/*调用管程中的过程,取产品*/ 消费产品item;}}coend管程例2:读写数据库。某数据库有一个写进程、多个读进程,它们之间读、写操作的互斥要求是:写进程运行时,其他读、写进程不能对数据库进行操作。读进程之间不互斥,可以同时读数据库。请用管程机制描述这一组进程的工作过程。
管程数据库写者读者写者读者{{写数据库;读数据库;}}分析:设read_cnt,writing为共享变量:read_cnt为当前读资源进程的数目。Writing为是否有写者正在使用这个资源。read,write为条件变量:read为读者等待队列。write为写者等待队列。操作过程:start_read()为开始读过程。end_read()为结束读过程。start_write()为开始写过程。end_write()为结束写过程。管程管程描述如下:monitorreders_writers{intread_cnt=0;/*当前读资源进程的数目*/intwriting=0;/*是否有写者正在使用这个资源*/conditionread,write;/*读者等待队列,写者等待队列*/start_read()/*开始读过程*/{if(writing||!empty(write))read.wait;/*如果正在写或者有写者进程就阻塞读进程*/read_cnt++; read.signal;/*唤醒一个读进程*/}end_read()/*结束读过程*/{ read_cnt=read_cnt-1;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苏教版四年级下册数学第三单元 三位数乘两位数 测试卷完整参考答案
- 框架性合作协议书(10篇)
- 诚信承诺要点保证书
- 货物运输与广告合作协议
- 购房担保合同法律效力
- 购销合同印花税的税率计算器使用便捷
- 购销合同法律保护建议
- 购销合同签订中的合同协同办公
- 资管产品存款策略研究
- 超市食品保证书示例
- 人教版(2024)七年级上册数学第5章单元测试卷(含答案)
- 2024年建筑安全员C证考试题库及答案
- DBJ15 31-2016建筑地基基础设计规范(广东省标准)
- 收款收据格式1页
- 体育守门员站立式下手接地滚球教学设计
- 第四章差分方程方法
- 数字电子技术教学改革及实践
- 铝合金门窗安装技术交底(完整版)
- SFA-5.1手工电弧焊用碳钢焊条标准
- 农村通用对联
- 肾性高血压的超声诊断
评论
0/150
提交评论