版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
2.5進(jìn)程互斥與同步?采用多道程序設(shè)計(jì)技術(shù)的操作系統(tǒng),允許多個(gè)進(jìn)程同時(shí)駐留內(nèi)存并發(fā)執(zhí)行。?如何協(xié)調(diào)多個(gè)進(jìn)程對系統(tǒng)資源,如內(nèi)存空間、外部設(shè)備等的競爭和共享??如何解決多個(gè)進(jìn)程因?yàn)楦偁庂Y源而出現(xiàn)執(zhí)行結(jié)果異常,甚至導(dǎo)致系統(tǒng)不穩(wěn)定、失效等問題??例如,多個(gè)進(jìn)程同時(shí)申請文件打印,如何有效分配打印機(jī)?例如銀行的聯(lián)網(wǎng)儲蓄業(yè)務(wù)允許儲戶同時(shí)用儲蓄卡和存折對同一帳戶進(jìn)行存取款操作,如果某儲戶同時(shí)(在ATM機(jī)和營業(yè)柜臺)辦理兩筆存款業(yè)務(wù)(假設(shè)分別為1000和2000元)從系統(tǒng)的角度看,有兩個(gè)進(jìn)程將同時(shí)對儲戶余額等數(shù)據(jù)進(jìn)行修改。如果兩個(gè)進(jìn)程同時(shí)讀出原余額(假設(shè)為5000元),兩個(gè)進(jìn)程分別將最新余額修改為6000(5000+1000)和7000(5000+2000)。分析及措施最后,儲戶余額可能是6000,或者7000,顯然都不正確。原因:兩個(gè)進(jìn)程同時(shí)修改同一數(shù)據(jù),而沒有進(jìn)行有效控制。正確的方法:如果有多個(gè)進(jìn)程需要同時(shí)修改某一數(shù)據(jù),系統(tǒng)必須控制,一次僅允許一個(gè)進(jìn)程完成讀數(shù)據(jù),并修改數(shù)據(jù)兩件事以后,才允許別的進(jìn)程對同一數(shù)據(jù)的讀和修改操作。例假設(shè)系統(tǒng)中有3個(gè)進(jìn)程P1、P2、P3,其中P1和P2是計(jì)算進(jìn)程,P3是打印進(jìn)程,每當(dāng)P1或P2計(jì)算出一個(gè)結(jié)果以后,將計(jì)算結(jié)果送到緩存區(qū)中,以便P3進(jìn)程從中取出數(shù)據(jù)打印。假設(shè)緩沖區(qū)被劃分為0、1、2...n-1共n個(gè)單元。有兩個(gè)指針:in指針用于計(jì)算進(jìn)程存放數(shù)據(jù),指向緩沖區(qū)中下一個(gè)空閑的單元,out指針用于打印進(jìn)程取數(shù)據(jù),指向緩沖區(qū)中下一個(gè)將取走數(shù)據(jù)的單元。例假設(shè)某時(shí)刻,0到3號單元空閑,4到6號單元被占用,這時(shí)候P1、P2進(jìn)程都準(zhǔn)備將數(shù)據(jù)送入緩沖區(qū),如圖2.23所示。
012345678n-1:被占用單元:空閑單元inout圖2.23多個(gè)進(jìn)程同時(shí)訪問共享區(qū)可能發(fā)生的情況進(jìn)程P1需要向緩沖區(qū)存儲數(shù)據(jù),并知道in指針當(dāng)前指向7號空閑緩沖單元。若這時(shí)進(jìn)程P1的時(shí)間片用完,被中斷,調(diào)度程序調(diào)度進(jìn)程P2執(zhí)行。P2正好也需要向緩沖區(qū)存放數(shù)據(jù),首先獲取in指針位置,同樣也是7,于是,P2將數(shù)據(jù)送入7號單元,并將in指針移動(dòng)一格,指向8號單元,然后繼續(xù)執(zhí)行其他操作。
可能發(fā)生的情況當(dāng)進(jìn)程P1再次被調(diào)度執(zhí)行時(shí),將從上次的斷點(diǎn)繼續(xù)執(zhí)行,即將數(shù)據(jù)送入7號單元(覆蓋進(jìn)程P2的數(shù)據(jù)),并移動(dòng)in指針指向8號單元,然后繼續(xù)執(zhí)行其他操作。進(jìn)程P3不會發(fā)現(xiàn)上述錯(cuò)誤,繼續(xù)從緩沖區(qū)取數(shù)據(jù),進(jìn)行打印。顯然,進(jìn)程P2的相應(yīng)計(jì)算結(jié)果不會被打印輸出。
分析該例中,由于進(jìn)程P1和P2共享緩沖區(qū)和位置指針,而未對這種共享進(jìn)行有效控制,導(dǎo)致打印數(shù)據(jù)的丟失。如果控制進(jìn)程P1、P2互斥地訪問緩沖區(qū)和修改位置指針,將避免這種因?yàn)椴l(fā)執(zhí)行而導(dǎo)致的程序執(zhí)行結(jié)果的不確定性。結(jié)論
通過上述兩個(gè)例子可見,采用多道程序并發(fā)設(shè)計(jì)技術(shù)的操作系統(tǒng)對諸進(jìn)程的并發(fā)控制是非常重要和必需的。并發(fā)控制
-競爭資源
當(dāng)并發(fā)進(jìn)程競爭使用同一資源時(shí),它們之間就會發(fā)生沖突。如果操作系統(tǒng)將資源分配給其中的某一個(gè)進(jìn)程使用,另一個(gè)進(jìn)程就必須等待,直到申請的資源可用時(shí),由操作系統(tǒng)分配給它。如果競爭某資源的進(jìn)程太多,這些進(jìn)程還必須等待在一個(gè)隊(duì)列中,如就緒隊(duì)列,阻塞隊(duì)列等。一種極端的情況是,被阻塞進(jìn)程永久得不到申請的資源,而死鎖。并發(fā)控制
-競爭資源進(jìn)程競爭資源首先必須解決“互斥”問題。某些資源必須互斥使用,如打印機(jī)、共享變量、表格、文件等。這類資源又稱為臨界資源,訪問臨界資源的那段代碼稱為臨界區(qū)。任何時(shí)刻,只允許一個(gè)進(jìn)程進(jìn)入臨界區(qū),以此實(shí)現(xiàn)進(jìn)程對臨界資源的互斥訪問。臨界區(qū)進(jìn)入?yún)^(qū)退出區(qū)進(jìn)程喚醒阻塞隊(duì)列
進(jìn)程互斥進(jìn)入臨界區(qū)互斥使用臨界資源當(dāng)進(jìn)程需要使用臨界資源時(shí),通過獲得臨界區(qū)的使用權(quán)實(shí)現(xiàn)的。首先,在“進(jìn)入?yún)^(qū)”判斷是否可以進(jìn)入臨界區(qū),如果可以進(jìn)入,則必須設(shè)置臨界區(qū)使用標(biāo)志,阻止其它后來的進(jìn)程進(jìn)入臨界區(qū)。后來的進(jìn)程通過查看臨界區(qū)使用標(biāo)志,知道自己不能進(jìn)入臨界區(qū),就進(jìn)入阻塞隊(duì)列,將自己阻塞。當(dāng)臨界區(qū)內(nèi)的進(jìn)程使用完畢,退出臨界區(qū)時(shí),即在“退出區(qū)”修改臨界區(qū)使用標(biāo)志,并負(fù)責(zé)喚醒阻塞隊(duì)列中的一個(gè)進(jìn)程,讓其進(jìn)入臨界區(qū)?;コ馐褂门R界資源由于同一個(gè)臨界資源在多個(gè)共享它的進(jìn)程中將對應(yīng)多個(gè)臨界區(qū),那么怎樣才能保證諸進(jìn)程間互斥地執(zhí)行臨界區(qū)呢?這就必須保證“臨界區(qū)使用標(biāo)志”是可被系統(tǒng)中所有進(jìn)程共享的全局變量,而且諸進(jìn)程對該標(biāo)志的修改操作必須互斥進(jìn)行。臨界區(qū)使用原則
(也稱為互斥條件)
每次只允許一個(gè)進(jìn)程處于臨界區(qū)(忙則等待);進(jìn)程只能在臨界區(qū)內(nèi)逗留有限時(shí)間,不得使其它進(jìn)程在臨界外無限期等待(有限等待)如果臨界區(qū)空閑,則只要有進(jìn)程申請就立即讓其進(jìn)入(空閑讓進(jìn));進(jìn)入臨界區(qū)的進(jìn)程,不能在臨界區(qū)內(nèi)長時(shí)間阻塞等待某事件,必須在一定期限內(nèi)退出臨界區(qū)(讓權(quán)等待)不能限制進(jìn)程的執(zhí)行進(jìn)度及處理機(jī)的數(shù)量競爭資源可能引起死鎖例如,兩個(gè)進(jìn)程P1、P2,競爭資源R1、R2。假設(shè),現(xiàn)在P1已經(jīng)占用了R1,且P2占用了R2,如果此時(shí)P1申請R2,且P2申請R1。會怎么樣呢?結(jié)果是P1、P2雙方都占用對方申請的資源而阻塞,誰也不讓步地永久等待,這就是死鎖,如圖2.25。
R1P1占用P2R2占用申請申請
進(jìn)程因競爭資源而死鎖死鎖競爭資源
-饑餓假設(shè)有3個(gè)進(jìn)程P1、P2、P3,每個(gè)進(jìn)程都需要周期性的使用資源R。如果當(dāng)前P1正在使用臨界資源R,P2和P3因?yàn)榈却齊而阻塞。當(dāng)P1退出臨界區(qū)時(shí),P2立即進(jìn)入臨界區(qū)執(zhí)行,若P2還未退出臨界區(qū)時(shí),P1又申請使用臨界資源R。假設(shè)P2退出臨界區(qū)后,系統(tǒng)將R分給了P1,然后,當(dāng)R空閑時(shí),又將其分給P2,如此反復(fù)。競爭資源
-饑餓使P1、P2都能正常執(zhí)行,而P3被長時(shí)間饑餓。這種情況不是死鎖,但是對P3不公平,也是系統(tǒng)應(yīng)該避免的。
并發(fā)控制
-共同協(xié)作多個(gè)進(jìn)程常常需要共同修改某些共享變量、表格、文件數(shù)據(jù)庫等,協(xié)作完成一些功能。必須確保它們對共享變量的修改是正確的,保證數(shù)據(jù)的完整性。共享協(xié)作同樣涉及到互斥、死鎖和饑餓問題,但更強(qiáng)調(diào)對數(shù)據(jù)的寫操作必須互斥地進(jìn)行。
必須保證數(shù)據(jù)的一致性。前面列舉了銀行聯(lián)網(wǎng)儲蓄的例子,除了必須保證儲戶余額的正確性以外,還必須使銀行儲蓄總余額、當(dāng)日發(fā)生額、流水帳等數(shù)據(jù)得到一致的修改。一般通過事務(wù)處理來保證數(shù)據(jù)的一致性,可以將對儲戶余額、儲蓄總余額、當(dāng)日發(fā)生額、流水帳等數(shù)據(jù)的修改放到一個(gè)臨界區(qū)中,進(jìn)入臨界區(qū)的進(jìn)程必須一次性完成對這一系列數(shù)據(jù)的修改操作。只有該進(jìn)程退出臨界區(qū)以后,才允許別的進(jìn)程進(jìn)入臨界區(qū)進(jìn)行數(shù)據(jù)修改,以保證數(shù)據(jù)的一致性。并發(fā)控制
-通信協(xié)作當(dāng)進(jìn)程進(jìn)行通信合作時(shí),各個(gè)進(jìn)程之間需要建立連接,進(jìn)程通信需要同步和協(xié)調(diào)。進(jìn)程通信的方式很多,包括消息傳遞、管道、共享存儲區(qū)等。通過消息傳遞實(shí)現(xiàn)進(jìn)程通信時(shí),由于沒有共享資源,故無須互斥,但仍可能出現(xiàn)死鎖和饑餓。并發(fā)控制
-通信協(xié)作例如,兩個(gè)進(jìn)程相互等待對方發(fā)來的數(shù)據(jù)而永久阻塞,即死鎖。又如,3個(gè)進(jìn)程P1、P2、P3,其中P1不斷嘗試與P2或P3通信,P2和P3又不斷嘗試與P1通信,如果P1與P2總能成功建立連接進(jìn)行通信,而P3一直阻塞等待P1,這樣P3被長時(shí)間饑餓?;コ馀c同步的解決策略軟件方法硬件方法信號量方法管程方法消息傳遞方法軟件方法軟件方法是指由進(jìn)程自己,通過執(zhí)行相應(yīng)的程序指令,實(shí)現(xiàn)與別的進(jìn)程的同步與互斥,無須專門的程序設(shè)計(jì)語言或操作系統(tǒng)的支持。實(shí)踐證明,該方法很難正確控制進(jìn)程間的同步與互斥,而且可能會大大地增加系統(tǒng)的額外開銷。
硬件方法為了解決軟件方法存在的不足,有人提出了硬件解決方法,通過屏蔽中斷或采用專門的機(jī)器指令控制同步與互斥。與軟件解決方法比較,這種方法減少了系統(tǒng)額外開銷,但由于需要太強(qiáng)的硬件約束條件,以及可能導(dǎo)致進(jìn)程饑餓與死鎖現(xiàn)象,一直沒有成為通用的解決方法。另一類解決方法是由操作系統(tǒng),或?qū)iT的程序設(shè)計(jì)語言提供的特別支持,包括信號量方法、管程方法和消息傳遞方法。其中,信號量方法已經(jīng)成為控制進(jìn)程同步與互斥的通用方法
互斥與同步解決方法之一:
軟件方法
軟件解決方法有很多種,比較有代表性的軟件方法有荷蘭數(shù)學(xué)家Dekker提出的Dekker算法和科學(xué)家G.L.Peterson提出的Peterson算法。為了說明設(shè)計(jì)并發(fā)程序時(shí)可能出現(xiàn)的典型錯(cuò)誤,下面以Dekker算法為例,分析如何設(shè)計(jì)并改進(jìn)一個(gè)互斥算法的過程?;コ馀c同步解決方法之一:
軟件方法-初步設(shè)想
為了控制兩個(gè)進(jìn)程互斥進(jìn)入臨界區(qū),可以讓兩個(gè)進(jìn)程輪流進(jìn)入臨界區(qū)。當(dāng)一個(gè)進(jìn)程正在臨界區(qū)執(zhí)行時(shí),另一個(gè)進(jìn)程就不能進(jìn)入臨界區(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:進(jìn)程嚴(yán)格交替進(jìn)入臨界區(qū)。如果進(jìn)程需要多次使用臨界區(qū),那么,使用臨界區(qū)頻率低的進(jìn)程嚴(yán)重制約著使用臨界區(qū)頻率高的進(jìn)程的執(zhí)行進(jìn)度。分析:初步設(shè)想例如,P0需要每10分鐘使用一次臨界區(qū),P1需要每1分鐘使用一次臨界區(qū)。假設(shè)turn的初值為0,進(jìn)程P0正好先請求進(jìn)入臨界區(qū),并成功進(jìn)入臨界區(qū)執(zhí)行,這時(shí),如果P1申請進(jìn)入臨界區(qū),循環(huán)檢測turn=0,不可以進(jìn)入,只能“空”循環(huán),等待。當(dāng)P0退出臨界區(qū)時(shí),修改turn的值為1。P1循環(huán)檢測到turn=1時(shí),就可以進(jìn)入臨界區(qū)執(zhí)行,退出臨界區(qū)時(shí),修改turn=0。分析:初步設(shè)想例如(續(xù))根據(jù)假設(shè),P1很快又需要進(jìn)入臨界區(qū),但是P0卻只能在10分鐘之后,按照turn規(guī)定的順序,進(jìn)入臨界區(qū)執(zhí)行,退出時(shí)修改turn=1。即,P1必須在臨界區(qū)空閑的情況下,等待10分鐘,才能使用臨界區(qū)。這不符和互斥原則,降低了系統(tǒng)性能。分析:初步設(shè)想問題3:任何進(jìn)程在臨界區(qū)內(nèi)或外失敗,其他進(jìn)程將可能因?yàn)榈却褂门R界區(qū),而無法向前推進(jìn)。因?yàn)閮蓚€(gè)進(jìn)程相互依賴對方將臨界區(qū)的使用權(quán)(順序)進(jìn)行修改,一旦這種修改不能進(jìn)行,對方都將因?yàn)榈却R界區(qū)而無法推進(jìn)。互斥與同步解決方法之一:
軟件方法-第一次改進(jìn)可以為臨界區(qū)設(shè)置一個(gè)狀態(tài)標(biāo)志,標(biāo)明臨界區(qū)是否可用。當(dāng)臨界區(qū)空閑時(shí),任何一個(gè)進(jìn)程都能進(jìn)入,但此時(shí)必須修改臨界區(qū)標(biāo)志為“被占用”,別的進(jìn)程就不能進(jìn)入臨界區(qū)。當(dāng)臨界區(qū)使用完畢,必需修改該標(biāo)志為“空閑”。這樣就不再使諸進(jìn)程嚴(yán)格交替使用臨界區(qū),而且,如果某進(jìn)程在臨界區(qū)外失敗,也不會影響其它進(jìn)程。其算法描述如圖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互斥算法:第一次改進(jìn)分析:第一次改進(jìn)如果進(jìn)程在臨界區(qū)外失敗,其他進(jìn)程不會阻塞。問題1:“忙等”問題2:若進(jìn)程在臨界區(qū)內(nèi)失敗且相應(yīng)的flag為true,則其他進(jìn)程永久阻塞。問題3:不能保證進(jìn)程互斥進(jìn)入臨界區(qū)。請?jiān)囍匆韵马樞驁?zhí)行:
P0Ifflag[1]=falsewhileflag[1]中斷P1Ifflag[0]=falsewhileflag[0]flag[0]=true中斷中斷flag[1]=true臨界區(qū)互斥與同步解決方法之一:
軟件方法-第二次改進(jìn)互斥算法的第一次改進(jìn)不能實(shí)現(xiàn)“互斥”。因?yàn)?,進(jìn)程首先檢測臨界區(qū)狀態(tài),若“被占用”,則“忙等”,否則就直接進(jìn)入臨界區(qū)。從而,可能出現(xiàn)同時(shí)進(jìn)入臨界區(qū)的現(xiàn)象。能否讓進(jìn)程預(yù)先表明“希望進(jìn)入臨界區(qū)的態(tài)度”,然后,再檢測臨界區(qū)狀態(tài)。第二次改進(jìn),如圖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互斥算法:第二次改進(jìn)分析:第二次改進(jìn)假設(shè)P0需要進(jìn)入臨界區(qū),首先執(zhí)行flag[0]:=true,再執(zhí)行whileflag[1],若P1正在占用臨界區(qū),則P0忙等;否則,P0進(jìn)入臨界區(qū)。但是,如果此時(shí)P1未占用臨界區(qū),而與P0幾乎同時(shí)需要使用臨界區(qū),
P0flag[0]=true中斷P1flag[1]=true中斷whileflag[1]whileflag[0]忙等忙等死鎖互斥與同步解決方法之一:
軟件方法-第三次改進(jìn)互斥算法的第二次改進(jìn)可能導(dǎo)致死鎖,因?yàn)镻0、P1都“堅(jiān)持自己的權(quán)利,執(zhí)意進(jìn)入臨界區(qū),且互不謙讓”??梢钥紤],允許進(jìn)程既表明需要進(jìn)入臨界區(qū)的“態(tài)度”,又能相互“謙讓”。即首先表示自己需要使用臨界區(qū),再檢測臨界區(qū)的狀態(tài),若臨界區(qū)“被占用”,可以等一小段時(shí)間再申請。算法如圖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;<延遲一小段時(shí)間>;<延遲一小段時(shí)間>;flag[0]:=true;flag[1]:=true;end;end;<臨界區(qū)>;<臨界區(qū)>flag[0]:=false;flag[1]:=false; ……
圖2.29互斥算法:第三次改進(jìn)分析:第三次改進(jìn)P0、P1的“謙讓”可能使它們都不能進(jìn)入臨界區(qū)。這種現(xiàn)象不是死鎖,因?yàn)檫@種僵局不會是永久行為,某一時(shí)刻可能會自動(dòng)解除。但是,這種現(xiàn)象也是不希望出現(xiàn)的。P0flag[0]=true中斷P1flag[1]=true中斷whileflag[1]中斷whileflag[0]中斷flag[0]:=false延遲一段時(shí)間中斷flag[1]:=false延遲一段時(shí)間中斷flag[0]=trueflag[1]=true中斷中斷{}{}互斥與同步解決方法之一:
軟件方法-Dekker互斥算法
該算法既允許進(jìn)程“謙讓地”申請進(jìn)入臨界區(qū),又通過給定序號避免“過分謙讓”。偽代碼描述如圖2.30所示。varflag:array[0..1]ofboolean:false;/*共享的全局變量,表示臨界區(qū)狀態(tài)*/turn:0..1;/*共享的全局變量,表示進(jìn)入臨界區(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進(jìn)入臨界區(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è)計(jì)思想類似,但代碼更簡潔,如圖2.32所示。算法中同樣用到兩個(gè)全局共享的狀態(tài)變量flag[0]和flag[1],表示臨界區(qū)狀態(tài)及哪個(gè)進(jìn)程正在占用臨界區(qū)。全局共享變量turn(值為1或0)表示能進(jìn)入臨界區(qū)的進(jìn)程序號?;コ馀c同步解決方法之一:
軟件方法-Peterson互斥算法分析P0的執(zhí)行:置flag[0]:=true;{阻止P1進(jìn)入臨界區(qū)}執(zhí)行whileflag[1]false,P0進(jìn)入臨界區(qū),執(zhí)行完成,置flag[0]:=false;true,P0循環(huán)等待,只要P1退出,即可進(jìn)入互斥與同步解決方法之二:
硬件方法
采用軟件方法實(shí)現(xiàn)進(jìn)程互斥使用臨界資源是很困難的,它們通常能實(shí)現(xiàn)兩個(gè)進(jìn)程的互斥,很難控制多個(gè)進(jìn)程的互斥。算法設(shè)計(jì)需要非常小心,否則可能出現(xiàn)死鎖,或互斥失敗等嚴(yán)重問題。軟件方法始終不能解決“忙等”現(xiàn)象,降低系統(tǒng)效率。硬件方法包括屏蔽中斷和專用機(jī)器指令?;コ馀c同步解決方法之二:
硬件方法-屏蔽中斷由于進(jìn)程切換需要依賴中斷來實(shí)現(xiàn),如果屏蔽中斷,則不會出現(xiàn)進(jìn)程切換。因此,為了實(shí)現(xiàn)對臨界資源的互斥使用,可以在進(jìn)程進(jìn)入臨界區(qū)之前,屏蔽中斷,當(dāng)進(jìn)程退出臨界區(qū)時(shí),打開系統(tǒng)中斷。中斷被屏蔽以后,系統(tǒng)時(shí)鐘中斷也被屏蔽。處理機(jī)將不會被切換到其他進(jìn)程。于是,一旦屏蔽中斷,進(jìn)程就可以檢查和修改共享內(nèi)存區(qū)中的數(shù)據(jù),而不必?fù)?dān)心其他進(jìn)程介入。其偽代碼如下:互斥與同步解決方法之二:
硬件方法-屏蔽中斷
while(true){ <屏蔽中斷>; <臨界區(qū)>; <啟用中斷>; <其余部分>;}
互斥與同步解決方法之二:
硬件方法-屏蔽中斷這種方法約束條件太強(qiáng),付出的代價(jià)太大因?yàn)橹袛啾黄帘我院螅到y(tǒng)將無法響應(yīng)任何外部請求,也不會響應(yīng)當(dāng)前執(zhí)行進(jìn)程的任何異常及系統(tǒng)故障,嚴(yán)重地降低了處理機(jī)性能。這種方法僅對單處理機(jī)系統(tǒng)有效,如果系統(tǒng)有兩個(gè)或多個(gè)共享內(nèi)存的處理機(jī),屏蔽中斷僅僅對執(zhí)行本指令的處理機(jī)有效,其它處理機(jī)仍將繼續(xù)運(yùn)行,并可以訪問共享內(nèi)存空間?;コ馀c同步解決方法之二:
硬件方法-專用機(jī)器指令利用一些專用機(jī)器指令也能實(shí)現(xiàn)互斥,機(jī)器指令在一個(gè)指令周期內(nèi)執(zhí)行,不會受到其它指令的干擾,也不會被中斷。TestandSet指令就是較常用的一種機(jī)器指令,其定義如下:互斥與同步解決方法之二:
硬件方法-testset指令functiontestset(vari:integer):boolean;beginifi=0thenbegini:=1;testset:=true;endelsetestset:=false;grammutualexclusion;constn=…;/*進(jìn)程數(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互斥與同步解決方法之二:
硬件方法-機(jī)器指令優(yōu)點(diǎn)非常簡單,易于證明;同時(shí)適合于單處理機(jī)系統(tǒng)和共享內(nèi)存的多處理機(jī)系統(tǒng)中多個(gè)進(jìn)程的互斥;可以分別為臨界區(qū)設(shè)置屬于它自己的變量,以實(shí)現(xiàn)對多個(gè)臨界區(qū)的互斥訪問。
互斥與同步解決方法之二:
硬件方法-機(jī)器指令缺點(diǎn)
“忙等”現(xiàn)象仍然存在。進(jìn)程都需要循環(huán)檢測,等待時(shí)機(jī)進(jìn)入臨界區(qū)。但是,由于采用了機(jī)器指令,這種“忙等”消耗的機(jī)器時(shí)間比軟件方法小,屬于“可接受的忙等”??赡艹霈F(xiàn)饑餓現(xiàn)象。當(dāng)臨界區(qū)空閑時(shí),執(zhí)行循環(huán)檢測的若干等待進(jìn)程能進(jìn)入臨界區(qū)的機(jī)率是相等的,有的進(jìn)程可能“運(yùn)氣”非常不好,很難有機(jī)會進(jìn)入臨界區(qū),而饑餓?;コ馀c同步解決方法之二:
硬件方法-機(jī)器指令缺點(diǎn)還有可能導(dǎo)致死鎖。例如,進(jìn)程P1的優(yōu)先級低于P2的優(yōu)先級,若P1通過執(zhí)行專用機(jī)器指令,進(jìn)入臨界區(qū),且在臨界區(qū)內(nèi)被中斷,P2被調(diào)度執(zhí)行。若P2也需要進(jìn)入該臨界區(qū),由于臨界區(qū)被P1占用,P2“忙等”。由于P1的優(yōu)先級低于P2,調(diào)度程序不可能強(qiáng)行剝奪P2的執(zhí)行而調(diào)度P1。這樣,P1將一直占用臨界區(qū)被中斷,P2一直“忙等”,如果沒有外力的作用,這種“僵持”狀態(tài)將一直保持下去,即系統(tǒng)出現(xiàn)死鎖。
互斥與同步解決方法之三:
信號量(semaphores)方法軟件方法和硬件方法都存在“忙等”問題,浪費(fèi)了處理機(jī)時(shí)間。信號量方法能實(shí)現(xiàn)進(jìn)程互斥與同步,而不必“忙等”實(shí)例交通信號燈:紅燈停,綠燈行信號量實(shí)現(xiàn)互斥的基本原理兩個(gè)或多個(gè)進(jìn)程可以通過傳遞信號進(jìn)行合作,可以迫使進(jìn)程在某個(gè)位置暫時(shí)停止執(zhí)行(阻塞等待),直到它收到一個(gè)可以“向前推進(jìn)”的信號(被喚醒)。相應(yīng)地,將實(shí)現(xiàn)信號燈作用的變量稱為信號量,常定義為記錄型變量s,其中一個(gè)域?yàn)檎停硪粋€(gè)域?yàn)殛?duì)列,其元素為等待該信號量的阻塞進(jìn)程(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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 供水公司維修工聘用合同樣本
- 印刷包裝企業(yè)聘用合同模板
- 質(zhì)量保證協(xié)議書珠寶制造商
- 酒店行業(yè)人事經(jīng)理招聘協(xié)議
- 兒童玩具店裝修施工合同
- 體育場館活力文化墻施工合同
- 應(yīng)聘誠信宣言
- 咖啡連鎖總經(jīng)理招聘合同
- 辦公樓鋁合金裝修合作協(xié)議
- 租地合同模板
- 文件管理系統(tǒng)畢業(yè)設(shè)計(jì)論文
- 2019年重慶普通高中會考通用技術(shù)真題及答案
- 天秤座小奏鳴曲,Libra Sonatine;迪安斯,Roland Dyens(古典吉他譜)
- 鋼筋混凝土工程施工及驗(yàn)收規(guī)范最新(完整版)
- 求數(shù)列的通項(xiàng)公式常見類型與方法PPT課件
- 光纜施工規(guī)范及要求
- 關(guān)于加強(qiáng)內(nèi)蒙古科協(xié)信息宣傳工作的意見內(nèi)蒙古公眾科技網(wǎng)
- 三國志11全人物信息(五維、特技、生卒年等)
- 第六章 氣體射流
- 華南農(nóng)業(yè)大學(xué)本科生畢業(yè)論文范例Word版
- [語言類考試復(fù)習(xí)資料大全]申論模擬1164
評論
0/150
提交評論