資源描述:
《進程同步與互斥_問題》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、進程同步與互斥例題進程同步進程同步:并發(fā)進程之間相互合作,完成一項工作,它們之間有一定的時序關系。解題步驟:確定進程的個數(shù)及每個進程的工作;確定關鍵工作步(需要控制的);確定信號量表示的含義(開始或結束);寫出偽代碼。進程的同步例:公共汽車中的司機和售票員。司機P1售票員P2while(true)while(true){{啟動車輛;關門;正常運行;售票;到站停車;開門;}}解法一:信號量表示進程能否開始。設信號量m1表示司機進程P1能否啟動汽車,初值為0,m2表示售票員進程p2能否開門,初值為0。intm1
2、=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
3、);}}p2(){while(1){關門;V(m2);售票;P(m1);開門;}}進程的同步例:吃水果。父親P1兒子P2while(true)while(true){{洗水果;取水果;放水果;吃水果;}}0父親兒子水果分析:父親先放水果,兒子再吃水果;兒子取完水果,父親再放水果,這兩個進程是一個同步關系。解法一:設信號量m1表示父親能否放水果,m2表示兒子能否取水果。其初值m1=1,m2=0。intm1=1,m2=0;cobeginp1()//p2()coend進程的同步p1(){while(1){洗水果;P
4、(m1);放水果;V(m2);}}p2(){while(1){P(m2);取水果;V(m1);吃水果;}}思考:假設盤子能放n個水果,如何修改同步關系?intm1=1,m2=0;分析:父親先放水果,兒子再吃水果;兒子取完水果,父親再放水果,這兩個進程是一個同步關系。解法二:設信號量m1表示父親放完水果,m2表示兒子取完水果。其初值m1=0,m2=1。intm1=0,m2=1;cobeginp1()//p2()coend進程的同步p1(){while(1){洗水果;P(m2);放水果;V(m1);}}p2(){
5、while(1){P(m1);取水果;V(m2);吃水果;}}進程的同步例3-2:吃水果。父親P1兒子P2女兒P3while(true)while(true)while(true){{{洗水果;取桔子;取蘋果;放水果;吃桔子;吃蘋果;}}}桔子父親兒子女兒0蘋果分析:父親先放水果,兒子女兒再吃水果;兒子女兒取完水果,父親再放水果,這三個進程是一個同步關系。解法一:設信號量m1表示父親能否放水果,m2表示兒子能否取桔子,m3表示女兒能否取蘋果。intm1=1,m2=0,m3=0;cobeginp1()//p2(
6、)//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;cobegi
7、np1()//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兒子P3while(true)while(true)while(true){{{洗桔子;洗蘋果;取水果;放桔子;放蘋果;吃水果;}}}0父親兒子母親桔子蘋果分析:父母
8、親先放水果,兒子再取水果吃;父親與兒子,母親與兒子是一個同步關系,父親與母親要競爭空盤子。解法一:設信號量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()