操作系統(tǒng) 第2部分-進程互斥與同步2_第1頁
操作系統(tǒng) 第2部分-進程互斥與同步2_第2頁
操作系統(tǒng) 第2部分-進程互斥與同步2_第3頁
操作系統(tǒng) 第2部分-進程互斥與同步2_第4頁
操作系統(tǒng) 第2部分-進程互斥與同步2_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

2.5進程互斥與同步?采用多道程序設(shè)計技術(shù)的操作系統(tǒng),允許多個進程同時駐留內(nèi)存并發(fā)執(zhí)行。?如何協(xié)調(diào)多個進程對系統(tǒng)資源,如內(nèi)存空間、外部設(shè)備等的競爭和共享??如何解決多個進程因為競爭資源而出現(xiàn)執(zhí)行結(jié)果異常,甚至導致系統(tǒng)不穩(wěn)定、失效等問題??例如,多個進程同時申請文件打印,如何有效分配打印機?例如銀行的聯(lián)網(wǎng)儲蓄業(yè)務(wù)允許儲戶同時用儲蓄卡和存折對同一帳戶進行存取款操作,如果某儲戶同時(在ATM機和營業(yè)柜臺)辦理兩筆存款業(yè)務(wù)(假設(shè)分別為1000和2000元)從系統(tǒng)的角度看,有兩個進程將同時對儲戶余額等數(shù)據(jù)進行修改。如果兩個進程同時讀出原余額(假設(shè)為5000元),兩個進程分別將最新余額修改為6000(5000+1000)和7000(5000+2000)。分析及措施最后,儲戶余額可能是6000,或者7000,顯然都不正確。原因:兩個進程同時修改同一數(shù)據(jù),而沒有進行有效控制。正確的方法:如果有多個進程需要同時修改某一數(shù)據(jù),系統(tǒng)必須控制,一次僅允許一個進程完成讀數(shù)據(jù),并修改數(shù)據(jù)兩件事以后,才允許別的進程對同一數(shù)據(jù)的讀和修改操作。例假設(shè)系統(tǒng)中有3個進程P1、P2、P3,其中P1和P2是計算進程,P3是打印進程,每當P1或P2計算出一個結(jié)果以后,將計算結(jié)果送到緩存區(qū)中,以便P3進程從中取出數(shù)據(jù)打印。假設(shè)緩沖區(qū)被劃分為0、1、2...n-1共n個單元。有兩個指針:in指針用于計算進程存放數(shù)據(jù),指向緩沖區(qū)中下一個空閑的單元,out指針用于打印進程取數(shù)據(jù),指向緩沖區(qū)中下一個將取走數(shù)據(jù)的單元。例假設(shè)某時刻,0到3號單元空閑,4到6號單元被占用,這時候P1、P2進程都準備將數(shù)據(jù)送入緩沖區(qū),如圖2.23所示。

012345678n-1:被占用單元:空閑單元inout圖2.23多個進程同時訪問共享區(qū)可能發(fā)生的情況進程P1需要向緩沖區(qū)存儲數(shù)據(jù),并知道in指針當前指向7號空閑緩沖單元。若這時進程P1的時間片用完,被中斷,調(diào)度程序調(diào)度進程P2執(zhí)行。P2正好也需要向緩沖區(qū)存放數(shù)據(jù),首先獲取in指針位置,同樣也是7,于是,P2將數(shù)據(jù)送入7號單元,并將in指針移動一格,指向8號單元,然后繼續(xù)執(zhí)行其他操作。

可能發(fā)生的情況當進程P1再次被調(diào)度執(zhí)行時,將從上次的斷點繼續(xù)執(zhí)行,即將數(shù)據(jù)送入7號單元(覆蓋進程P2的數(shù)據(jù)),并移動in指針指向8號單元,然后繼續(xù)執(zhí)行其他操作。進程P3不會發(fā)現(xiàn)上述錯誤,繼續(xù)從緩沖區(qū)取數(shù)據(jù),進行打印。顯然,進程P2的相應(yīng)計算結(jié)果不會被打印輸出。

分析該例中,由于進程P1和P2共享緩沖區(qū)和位置指針,而未對這種共享進行有效控制,導致打印數(shù)據(jù)的丟失。如果控制進程P1、P2互斥地訪問緩沖區(qū)和修改位置指針,將避免這種因為并發(fā)執(zhí)行而導致的程序執(zhí)行結(jié)果的不確定性。結(jié)論

通過上述兩個例子可見,采用多道程序并發(fā)設(shè)計技術(shù)的操作系統(tǒng)對諸進程的并發(fā)控制是非常重要和必需的。并發(fā)控制

-競爭資源

當并發(fā)進程競爭使用同一資源時,它們之間就會發(fā)生沖突。如果操作系統(tǒng)將資源分配給其中的某一個進程使用,另一個進程就必須等待,直到申請的資源可用時,由操作系統(tǒng)分配給它。如果競爭某資源的進程太多,這些進程還必須等待在一個隊列中,如就緒隊列,阻塞隊列等。一種極端的情況是,被阻塞進程永久得不到申請的資源,而死鎖。并發(fā)控制

-競爭資源進程競爭資源首先必須解決“互斥”問題。某些資源必須互斥使用,如打印機、共享變量、表格、文件等。這類資源又稱為臨界資源,訪問臨界資源的那段代碼稱為臨界區(qū)。任何時刻,只允許一個進程進入臨界區(qū),以此實現(xiàn)進程對臨界資源的互斥訪問。臨界區(qū)進入?yún)^(qū)退出區(qū)進程喚醒阻塞隊列

進程互斥進入臨界區(qū)互斥使用臨界資源當進程需要使用臨界資源時,通過獲得臨界區(qū)的使用權(quán)實現(xiàn)的。首先,在“進入?yún)^(qū)”判斷是否可以進入臨界區(qū),如果可以進入,則必須設(shè)置臨界區(qū)使用標志,阻止其它后來的進程進入臨界區(qū)。后來的進程通過查看臨界區(qū)使用標志,知道自己不能進入臨界區(qū),就進入阻塞隊列,將自己阻塞。當臨界區(qū)內(nèi)的進程使用完畢,退出臨界區(qū)時,即在“退出區(qū)”修改臨界區(qū)使用標志,并負責喚醒阻塞隊列中的一個進程,讓其進入臨界區(qū)?;コ馐褂门R界資源由于同一個臨界資源在多個共享它的進程中將對應(yīng)多個臨界區(qū),那么怎樣才能保證諸進程間互斥地執(zhí)行臨界區(qū)呢?這就必須保證“臨界區(qū)使用標志”是可被系統(tǒng)中所有進程共享的全局變量,而且諸進程對該標志的修改操作必須互斥進行。臨界區(qū)使用原則

(也稱為互斥條件)

每次只允許一個進程處于臨界區(qū)(忙則等待);進程只能在臨界區(qū)內(nèi)逗留有限時間,不得使其它進程在臨界外無限期等待(有限等待)如果臨界區(qū)空閑,則只要有進程申請就立即讓其進入(空閑讓進);進入臨界區(qū)的進程,不能在臨界區(qū)內(nèi)長時間阻塞等待某事件,必須在一定期限內(nèi)退出臨界區(qū)(讓權(quán)等待)不能限制進程的執(zhí)行進度及處理機的數(shù)量競爭資源可能引起死鎖例如,兩個進程P1、P2,競爭資源R1、R2。假設(shè),現(xiàn)在P1已經(jīng)占用了R1,且P2占用了R2,如果此時P1申請R2,且P2申請R1。會怎么樣呢?結(jié)果是P1、P2雙方都占用對方申請的資源而阻塞,誰也不讓步地永久等待,這就是死鎖,如圖2.25。

R1P1占用P2R2占用申請申請

進程因競爭資源而死鎖死鎖競爭資源

-饑餓假設(shè)有3個進程P1、P2、P3,每個進程都需要周期性的使用資源R。如果當前P1正在使用臨界資源R,P2和P3因為等待R而阻塞。當P1退出臨界區(qū)時,P2立即進入臨界區(qū)執(zhí)行,若P2還未退出臨界區(qū)時,P1又申請使用臨界資源R。假設(shè)P2退出臨界區(qū)后,系統(tǒng)將R分給了P1,然后,當R空閑時,又將其分給P2,如此反復。競爭資源

-饑餓使P1、P2都能正常執(zhí)行,而P3被長時間饑餓。這種情況不是死鎖,但是對P3不公平,也是系統(tǒng)應(yīng)該避免的。

并發(fā)控制

-共同協(xié)作多個進程常常需要共同修改某些共享變量、表格、文件數(shù)據(jù)庫等,協(xié)作完成一些功能。必須確保它們對共享變量的修改是正確的,保證數(shù)據(jù)的完整性。共享協(xié)作同樣涉及到互斥、死鎖和饑餓問題,但更強調(diào)對數(shù)據(jù)的寫操作必須互斥地進行。

必須保證數(shù)據(jù)的一致性。前面列舉了銀行聯(lián)網(wǎng)儲蓄的例子,除了必須保證儲戶余額的正確性以外,還必須使銀行儲蓄總余額、當日發(fā)生額、流水帳等數(shù)據(jù)得到一致的修改。一般通過事務(wù)處理來保證數(shù)據(jù)的一致性,可以將對儲戶余額、儲蓄總余額、當日發(fā)生額、流水帳等數(shù)據(jù)的修改放到一個臨界區(qū)中,進入臨界區(qū)的進程必須一次性完成對這一系列數(shù)據(jù)的修改操作。只有該進程退出臨界區(qū)以后,才允許別的進程進入臨界區(qū)進行數(shù)據(jù)修改,以保證數(shù)據(jù)的一致性。并發(fā)控制

-通信協(xié)作當進程進行通信合作時,各個進程之間需要建立連接,進程通信需要同步和協(xié)調(diào)。進程通信的方式很多,包括消息傳遞、管道、共享存儲區(qū)等。通過消息傳遞實現(xiàn)進程通信時,由于沒有共享資源,故無須互斥,但仍可能出現(xiàn)死鎖和饑餓。并發(fā)控制

-通信協(xié)作例如,兩個進程相互等待對方發(fā)來的數(shù)據(jù)而永久阻塞,即死鎖。又如,3個進程P1、P2、P3,其中P1不斷嘗試與P2或P3通信,P2和P3又不斷嘗試與P1通信,如果P1與P2總能成功建立連接進行通信,而P3一直阻塞等待P1,這樣P3被長時間饑餓?;コ馀c同步的解決策略軟件方法硬件方法信號量方法管程方法消息傳遞方法軟件方法軟件方法是指由進程自己,通過執(zhí)行相應(yīng)的程序指令,實現(xiàn)與別的進程的同步與互斥,無須專門的程序設(shè)計語言或操作系統(tǒng)的支持。實踐證明,該方法很難正確控制進程間的同步與互斥,而且可能會大大地增加系統(tǒng)的額外開銷。

硬件方法為了解決軟件方法存在的不足,有人提出了硬件解決方法,通過屏蔽中斷或采用專門的機器指令控制同步與互斥。與軟件解決方法比較,這種方法減少了系統(tǒng)額外開銷,但由于需要太強的硬件約束條件,以及可能導致進程饑餓與死鎖現(xiàn)象,一直沒有成為通用的解決方法。另一類解決方法是由操作系統(tǒng),或?qū)iT的程序設(shè)計語言提供的特別支持,包括信號量方法、管程方法和消息傳遞方法。其中,信號量方法已經(jīng)成為控制進程同步與互斥的通用方法

互斥與同步解決方法之一:

軟件方法

軟件解決方法有很多種,比較有代表性的軟件方法有荷蘭數(shù)學家Dekker提出的Dekker算法和科學家G.L.Peterson提出的Peterson算法。為了說明設(shè)計并發(fā)程序時可能出現(xiàn)的典型錯誤,下面以Dekker算法為例,分析如何設(shè)計并改進一個互斥算法的過程?;コ馀c同步解決方法之一:

軟件方法-初步設(shè)想

為了控制兩個進程互斥進入臨界區(qū),可以讓兩個進程輪流進入臨界區(qū)。當一個進程正在臨界區(qū)執(zhí)行時,另一個進程就不能進入臨界區(qū),而在臨界區(qū)外等待。程序?qū)崿F(xiàn)的偽代碼如圖2.26所示。

varturn:0..1;/*共享的全局變量*/P0P1……whileturn≠0do{nothing};whileturn≠1do{nothing};<臨界區(qū)>;<臨界區(qū)>turn:=1;turn:=0;……

圖2.26互斥算法:初步設(shè)想分析:初步設(shè)想保證了互斥問題1:“忙等”現(xiàn)象問題2:進程嚴格交替進入臨界區(qū)。如果進程需要多次使用臨界區(qū),那么,使用臨界區(qū)頻率低的進程嚴重制約著使用臨界區(qū)頻率高的進程的執(zhí)行進度。分析:初步設(shè)想例如,P0需要每10分鐘使用一次臨界區(qū),P1需要每1分鐘使用一次臨界區(qū)。假設(shè)turn的初值為0,進程P0正好先請求進入臨界區(qū),并成功進入臨界區(qū)執(zhí)行,這時,如果P1申請進入臨界區(qū),循環(huán)檢測turn=0,不可以進入,只能“空”循環(huán),等待。當P0退出臨界區(qū)時,修改turn的值為1。P1循環(huán)檢測到turn=1時,就可以進入臨界區(qū)執(zhí)行,退出臨界區(qū)時,修改turn=0。分析:初步設(shè)想例如(續(xù))根據(jù)假設(shè),P1很快又需要進入臨界區(qū),但是P0卻只能在10分鐘之后,按照turn規(guī)定的順序,進入臨界區(qū)執(zhí)行,退出時修改turn=1。即,P1必須在臨界區(qū)空閑的情況下,等待10分鐘,才能使用臨界區(qū)。這不符和互斥原則,降低了系統(tǒng)性能。分析:初步設(shè)想問題3:任何進程在臨界區(qū)內(nèi)或外失敗,其他進程將可能因為等待使用臨界區(qū),而無法向前推進。因為兩個進程相互依賴對方將臨界區(qū)的使用權(quán)(順序)進行修改,一旦這種修改不能進行,對方都將因為等待臨界區(qū)而無法推進?;コ馀c同步解決方法之一:

軟件方法-第一次改進可以為臨界區(qū)設(shè)置一個狀態(tài)標志,標明臨界區(qū)是否可用。當臨界區(qū)空閑時,任何一個進程都能進入,但此時必須修改臨界區(qū)標志為“被占用”,別的進程就不能進入臨界區(qū)。當臨界區(qū)使用完畢,必需修改該標志為“空閑”。這樣就不再使諸進程嚴格交替使用臨界區(qū),而且,如果某進程在臨界區(qū)外失敗,也不會影響其它進程。其算法描述如圖2.27所示。varflag:array[0..1]ofboolean:false;/*共享的全局變量*/P0P1……whileflag[1]do{nothing};whileflag[0]do{nothing};flag[0]:=true;flag[1]:=true;<臨界區(qū)>;<臨界區(qū)>flag[0]:=false;flag[1]:=false;……

圖2.27互斥算法:第一次改進分析:第一次改進如果進程在臨界區(qū)外失敗,其他進程不會阻塞。問題1:“忙等”問題2:若進程在臨界區(qū)內(nèi)失敗且相應(yīng)的flag為true,則其他進程永久阻塞。問題3:不能保證進程互斥進入臨界區(qū)。請試著按以下順序執(zhí)行:

P0Ifflag[1]=falsewhileflag[1]中斷P1Ifflag[0]=falsewhileflag[0]flag[0]=true中斷中斷flag[1]=true臨界區(qū)互斥與同步解決方法之一:

軟件方法-第二次改進互斥算法的第一次改進不能實現(xiàn)“互斥”。因為,進程首先檢測臨界區(qū)狀態(tài),若“被占用”,則“忙等”,否則就直接進入臨界區(qū)。從而,可能出現(xiàn)同時進入臨界區(qū)的現(xiàn)象。能否讓進程預(yù)先表明“希望進入臨界區(qū)的態(tài)度”,然后,再檢測臨界區(qū)狀態(tài)。第二次改進,如圖2.28。varflag:array[0..1]ofboolean:false;/*共享的全局變量*/ P0P1 ……flag[0]:=true;flag[1]:=true;whileflag[1]do{nothing};whileflag[0]do{nothing};<臨界區(qū)>;<臨界區(qū)>flag[0]:=false;flag[1]:=false; ……

圖2.28互斥算法:第二次改進分析:第二次改進假設(shè)P0需要進入臨界區(qū),首先執(zhí)行flag[0]:=true,再執(zhí)行whileflag[1],若P1正在占用臨界區(qū),則P0忙等;否則,P0進入臨界區(qū)。但是,如果此時P1未占用臨界區(qū),而與P0幾乎同時需要使用臨界區(qū),

P0flag[0]=true中斷P1flag[1]=true中斷whileflag[1]whileflag[0]忙等忙等死鎖互斥與同步解決方法之一:

軟件方法-第三次改進互斥算法的第二次改進可能導致死鎖,因為P0、P1都“堅持自己的權(quán)利,執(zhí)意進入臨界區(qū),且互不謙讓”??梢钥紤],允許進程既表明需要進入臨界區(qū)的“態(tài)度”,又能相互“謙讓”。即首先表示自己需要使用臨界區(qū),再檢測臨界區(qū)的狀態(tài),若臨界區(qū)“被占用”,可以等一小段時間再申請。算法如圖2.29所示varflag:array[0..1]ofboolean:false;/*共享的全局變量*/ P0P1 ……flag[0]:=true;flag[1]:=true;whileflag[1]dowhileflag[0]dobeginbeginflag[0]:=false;flag[1]:=false;<延遲一小段時間>;<延遲一小段時間>;flag[0]:=true;flag[1]:=true;end;end;<臨界區(qū)>;<臨界區(qū)>flag[0]:=false;flag[1]:=false; ……

圖2.29互斥算法:第三次改進分析:第三次改進P0、P1的“謙讓”可能使它們都不能進入臨界區(qū)。這種現(xiàn)象不是死鎖,因為這種僵局不會是永久行為,某一時刻可能會自動解除。但是,這種現(xiàn)象也是不希望出現(xiàn)的。P0flag[0]=true中斷P1flag[1]=true中斷whileflag[1]中斷whileflag[0]中斷flag[0]:=false延遲一段時間中斷flag[1]:=false延遲一段時間中斷flag[0]=trueflag[1]=true中斷中斷{}{}互斥與同步解決方法之一:

軟件方法-Dekker互斥算法

該算法既允許進程“謙讓地”申請進入臨界區(qū),又通過給定序號避免“過分謙讓”。偽代碼描述如圖2.30所示。varflag:array[0..1]ofboolean:false;/*共享的全局變量,表示臨界區(qū)狀態(tài)*/turn:0..1;/*共享的全局變量,表示進入臨界區(qū)的順序*/procedureP0; procedureP1begin beginrepeat repeatflag[0]:=true; flag[1]:=true;whileflag[1]doifturn=1then whileflag[0]doifturn=0thenbegin beginflag[0]:=false; flag[1]:=false;whileturn=1do{nothing}; whileturn=0do{nothing};flag[0]:=true; flag[1]:=true;end; end;<臨界區(qū)>; <臨界區(qū)>turn:=1; turn:=0;flag[0]:=false; flag[1]:=false;<其余部分> <其余部分>forever foreverend; end; begin/*主程序*/ flag[0]:=false;flag[1]:=false;turn:=1; parbegin P0;P1; parend end.flag[0]:=trueflag[0]:=falseturn01turn01flag[0]:=trueflag[1]falseP0進入臨界區(qū)退出臨界區(qū)turn:=1flag[0]:=false其余部分true圖2.31P0的執(zhí)行流程圖procedureP0;begin repeatflag[0]:=true; whileflag[1]doifturn=1thenbegin flag[0]:=false;whileturn=1do{nothing};flag[0]:=true;end;<臨界區(qū)>turn:=1;flag[0]:=false;<其余部分>foreverend;互斥與同步解決方法之一:

軟件方法-Peterson互斥算法Peterson互斥算法與Dekker互斥算法的設(shè)計思想類似,但代碼更簡潔,如圖2.32所示。算法中同樣用到兩個全局共享的狀態(tài)變量flag[0]和flag[1],表示臨界區(qū)狀態(tài)及哪個進程正在占用臨界區(qū)。全局共享變量turn(值為1或0)表示能進入臨界區(qū)的進程序號?;コ馀c同步解決方法之一:

軟件方法-Peterson互斥算法分析P0的執(zhí)行:置flag[0]:=true;{阻止P1進入臨界區(qū)}執(zhí)行whileflag[1]false,P0進入臨界區(qū),執(zhí)行完成,置flag[0]:=false;true,P0循環(huán)等待,只要P1退出,即可進入互斥與同步解決方法之二:

硬件方法

采用軟件方法實現(xiàn)進程互斥使用臨界資源是很困難的,它們通常能實現(xiàn)兩個進程的互斥,很難控制多個進程的互斥。算法設(shè)計需要非常小心,否則可能出現(xiàn)死鎖,或互斥失敗等嚴重問題。軟件方法始終不能解決“忙等”現(xiàn)象,降低系統(tǒng)效率。硬件方法包括屏蔽中斷和專用機器指令。互斥與同步解決方法之二:

硬件方法-屏蔽中斷由于進程切換需要依賴中斷來實現(xiàn),如果屏蔽中斷,則不會出現(xiàn)進程切換。因此,為了實現(xiàn)對臨界資源的互斥使用,可以在進程進入臨界區(qū)之前,屏蔽中斷,當進程退出臨界區(qū)時,打開系統(tǒng)中斷。中斷被屏蔽以后,系統(tǒng)時鐘中斷也被屏蔽。處理機將不會被切換到其他進程。于是,一旦屏蔽中斷,進程就可以檢查和修改共享內(nèi)存區(qū)中的數(shù)據(jù),而不必擔心其他進程介入。其偽代碼如下:互斥與同步解決方法之二:

硬件方法-屏蔽中斷

while(true){ <屏蔽中斷>; <臨界區(qū)>; <啟用中斷>; <其余部分>;}

互斥與同步解決方法之二:

硬件方法-屏蔽中斷這種方法約束條件太強,付出的代價太大因為中斷被屏蔽以后,系統(tǒng)將無法響應(yīng)任何外部請求,也不會響應(yīng)當前執(zhí)行進程的任何異常及系統(tǒng)故障,嚴重地降低了處理機性能。這種方法僅對單處理機系統(tǒng)有效,如果系統(tǒng)有兩個或多個共享內(nèi)存的處理機,屏蔽中斷僅僅對執(zhí)行本指令的處理機有效,其它處理機仍將繼續(xù)運行,并可以訪問共享內(nèi)存空間?;コ馀c同步解決方法之二:

硬件方法-專用機器指令利用一些專用機器指令也能實現(xiàn)互斥,機器指令在一個指令周期內(nèi)執(zhí)行,不會受到其它指令的干擾,也不會被中斷。TestandSet指令就是較常用的一種機器指令,其定義如下:互斥與同步解決方法之二:

硬件方法-testset指令functiontestset(vari:integer):boolean;beginifi=0thenbegini:=1;testset:=true;endelsetestset:=false;grammutualexclusion;constn=…;/*進程數(shù)*/varbolt:integer;procedureP(i:integer);beginrepeatrepeat{nothing}untiltestset(bolt);<臨界區(qū)>;bolt:=0;<其余部分>foreverend;begin/*主程序*/bolt:=0;parbeginP(1);P(2);…P(n)parendend.互斥與同步解決方法之二:

硬件方法-exchange指令voidexchange(intregister,intmemory){inttemp;temp=memory;memory=register;register=temp;}ExchangeInstruction互斥與同步解決方法之二:

硬件方法-機器指令優(yōu)點非常簡單,易于證明;同時適合于單處理機系統(tǒng)和共享內(nèi)存的多處理機系統(tǒng)中多個進程的互斥;可以分別為臨界區(qū)設(shè)置屬于它自己的變量,以實現(xiàn)對多個臨界區(qū)的互斥訪問。

互斥與同步解決方法之二:

硬件方法-機器指令缺點

“忙等”現(xiàn)象仍然存在。進程都需要循環(huán)檢測,等待時機進入臨界區(qū)。但是,由于采用了機器指令,這種“忙等”消耗的機器時間比軟件方法小,屬于“可接受的忙等”??赡艹霈F(xiàn)饑餓現(xiàn)象。當臨界區(qū)空閑時,執(zhí)行循環(huán)檢測的若干等待進程能進入臨界區(qū)的機率是相等的,有的進程可能“運氣”非常不好,很難有機會進入臨界區(qū),而饑餓?;コ馀c同步解決方法之二:

硬件方法-機器指令缺點還有可能導致死鎖。例如,進程P1的優(yōu)先級低于P2的優(yōu)先級,若P1通過執(zhí)行專用機器指令,進入臨界區(qū),且在臨界區(qū)內(nèi)被中斷,P2被調(diào)度執(zhí)行。若P2也需要進入該臨界區(qū),由于臨界區(qū)被P1占用,P2“忙等”。由于P1的優(yōu)先級低于P2,調(diào)度程序不可能強行剝奪P2的執(zhí)行而調(diào)度P1。這樣,P1將一直占用臨界區(qū)被中斷,P2一直“忙等”,如果沒有外力的作用,這種“僵持”狀態(tài)將一直保持下去,即系統(tǒng)出現(xiàn)死鎖。

互斥與同步解決方法之三:

信號量(semaphores)方法軟件方法和硬件方法都存在“忙等”問題,浪費了處理機時間。信號量方法能實現(xiàn)進程互斥與同步,而不必“忙等”實例交通信號燈:紅燈停,綠燈行信號量實現(xiàn)互斥的基本原理兩個或多個進程可以通過傳遞信號進行合作,可以迫使進程在某個位置暫時停止執(zhí)行(阻塞等待),直到它收到一個可以“向前推進”的信號(被喚醒)。相應(yīng)地,將實現(xiàn)信號燈作用的變量稱為信號量,常定義為記錄型變量s,其中一個域為整型,另一個域為隊列,其元素為等待該信號量的阻塞進程(FIFO)。信號量定義typesemaphore=recordcount:integer;queue:listofproce

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論