資源描述:
《操作系統(tǒng)進(jìn)程同步互斥問題》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、利用軟件方法解決進(jìn)程互斥問題假設(shè)有兩個(gè)進(jìn)程Pi和Pj,它們共享一個(gè)臨界資源R,請(qǐng)使用軟件方法使進(jìn)程Pi和Pj能互斥地訪問資源R。算法1:設(shè)置整形變量turn,用于指示被允許進(jìn)入臨界區(qū)的進(jìn)程的編號(hào),即若turn=0,表示允許進(jìn)程Pi進(jìn)入臨界區(qū)。注意:該算法強(qiáng)制兩個(gè)進(jìn)程輪流進(jìn)入臨界區(qū),不考慮實(shí)際需要。很容易造成資源的不充分利用。對(duì)Pi進(jìn)程的描述如下:repeatwhile?turn≠i?do??no-opcritical?sectionturn:=jremaindersectionuntil?false算法2:在每一個(gè)進(jìn)程訪問臨界資源之前,先去查看一下臨界資源是否正被訪問,若正被訪問,該進(jìn)程等
2、待;否則,進(jìn)入自己的臨界區(qū)。設(shè)置數(shù)組flag,使其中每個(gè)元素的初值為false——表示所有進(jìn)程都未進(jìn)入臨界區(qū),而當(dāng)其中的第i個(gè)元素值非false時(shí),即若flag[i]=ture——表示進(jìn)程Pi正在臨界區(qū)內(nèi)執(zhí)行。注意:該算法解決了有空讓進(jìn)的原則,但當(dāng)Pi和Pj的訪問標(biāo)志flag都為false時(shí),如果Pi和Pj幾乎同時(shí)都要求進(jìn)入臨界區(qū),因而都發(fā)現(xiàn)對(duì)方的標(biāo)志為false,于是,兩進(jìn)程都???先后進(jìn)入臨界區(qū),又違背了忙則等待的原則。算法描述如下:Var?flag:arry[0,1,,…n]?of?Boolean;RepeatWhileflag[j]?do?no-opFlag[i]:=true;Cr
3、iticalsectionFlag[i]:=false;RemaindersectionUntil?false算法3:設(shè)數(shù)組flag[n],當(dāng)flag[i]=ture——表示進(jìn)程Pi希望進(jìn)入臨界區(qū),即每當(dāng)Pi要進(jìn)入臨界區(qū)前,先將flag[i]=ture——表示進(jìn)程已要求進(jìn)入臨界區(qū),再去查看Pj的標(biāo)志,若flag[j]=ture,則Pi等待,否則,Pi進(jìn)入臨界區(qū)。(即要求進(jìn)入臨界區(qū)的進(jìn)程先設(shè)置其要求進(jìn)入的標(biāo)志,然后再去查看其他進(jìn)程的標(biāo)志)注意:該算法可以有效地防止兩個(gè)進(jìn)程進(jìn)入臨界區(qū),但又可能導(dǎo)致最終都不進(jìn)入臨界區(qū)的情況它即違背了“有空讓進(jìn)”的準(zhǔn)則,又違背了“有限等待”的準(zhǔn)則,描述如下:rep
4、eatflag[i]:=ture;whileflag[i]dono-opcriticalsectionflag[i]:=false;remainder?sectionuntilfalse算法4:該算法為進(jìn)程Pi設(shè)置了標(biāo)志位flag[i],當(dāng)flag[i]=ture——表示Pi要求進(jìn)入臨界區(qū),或正在臨界區(qū)中執(zhí)行。還設(shè)置了ture變量——指示允許進(jìn)入臨界區(qū)的進(jìn)程編號(hào)。注意:保證了“忙則等待”和“有空讓進(jìn)“的準(zhǔn)則。Repeatflag[i]:=ture;turn:=j;?表示Pi已進(jìn)入臨界區(qū),輪到Pj進(jìn)入臨界區(qū)。whileflag[i]andturn:=jdono-op;?若flag[i]and
5、turn:=j為false,則Pj進(jìn)入臨界區(qū)。criticalsectionflag[i]:=false;remainder?sectionuntilfalse用硬件法解決進(jìn)程互斥的問題1、利用Test—and---set指令實(shí)現(xiàn)互斥function?TS(VAR??lock:boolean):boolean;beginTS:=lock;Lock:=true;End其中:lock=false——表示該資源空閑;當(dāng)lock=true——表示該資源正在使用。2、利用TS實(shí)現(xiàn)進(jìn)程互斥(1)可為每個(gè)臨界資源設(shè)置一個(gè)布爾變量lock,初值為false——表示資源空閑。FunctionTS(varlo
6、ck:Boolean):BooleanBeginTS:=lock;Lock:=true;End(2)利用TS實(shí)現(xiàn)進(jìn)程互斥為每一個(gè)臨界資源設(shè)置一個(gè)布爾變量lock,初值為false——表示資源空閑;用TS指令將變量lock的狀態(tài)記錄在變量TS中,并將true賦予lock;這等于關(guān)閉了臨界區(qū),使任何進(jìn)程都不能進(jìn)入臨界區(qū)。利用TS指令實(shí)現(xiàn)互斥的循環(huán)進(jìn)程可描述為:repeatwhile?TS(lock)?doskip;criticalsectionlock:=false;remaindersectionuntilfalse3、利用Swap指令實(shí)現(xiàn)進(jìn)程互斥(1)Swap指令Procedure?Swa
7、p(var?a,b:Boolean)(交換兩個(gè)字的內(nèi)容)Vartemp:boolean;BeginTemp:=a;A:=b;B:=temp;End?(2)利用Swap指令實(shí)現(xiàn)進(jìn)程互斥repeatkey:=true;repeatswap(lock,key);until?key=false;criticalsectionlock:=false;remaindersection