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

下載本文檔

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

文檔簡介

進程同步與互斥一、進程的并發(fā)性二、進程的互斥三、進程的同步四、同步與互斥的混合問題一、進程的并發(fā)性

程序并行性的表示:CobeginS1;S2;…;SnCoend

在多道系統(tǒng)中,假如有兩個進程A和B,它們要求順序執(zhí)行的操作如下:進程A:a1,a2,a3,a4,…,an進程B:b1,b2,b3,b4,…,bm這兩個進程是在處理器上交替執(zhí)行的,可能出現(xiàn)的執(zhí)行序列有:a1,b1,a2,b2,…和a1,a2,b1,b2,…,等等,它們的執(zhí)行在時間上是重疊的,這被稱為“可同時執(zhí)行的”。在多道程序環(huán)境下,進程之間存在以下關(guān)系資源共享關(guān)系相互合作關(guān)系觀察者beginL:observealorry;count:=count+1;gotoLend;報告者beginprintcount;count:=0;end;樣例1:假定某一時刻,觀察者已記錄了N輛車,又在記錄下一輛車,此時,報告者也開始工作。與時間有關(guān)的錯誤執(zhí)行順序1:(觀察者)count:=count+1;(報告者)report;(報告者)count:=0;這是正確的結(jié)果。執(zhí)行順序2:(報告者)reportcount;(觀察者)count:=count+1;(報告者)count:=0;觀察者剛剛記錄的一輛車的信息丟失了

造成不正確的因素是與進程占用處理器的時間、執(zhí)行的速度以及外界的影響有關(guān)。這些因素都與時間有關(guān),所以,稱它們?yōu)椤芭c時間有關(guān)的錯誤”樣例2:飛機航班有N個售票處,每個售票處通過終端訪問系統(tǒng)的公共數(shù)據(jù)區(qū)。

售票處1begin從數(shù)據(jù)單元中取出現(xiàn)有余票;做減1操作;把結(jié)果送回到數(shù)據(jù)單元end;售票處2begin從數(shù)據(jù)單元中取出現(xiàn)有余票;做減1操作;把結(jié)果送回到數(shù)據(jù)單元end;假定現(xiàn)有余票為1執(zhí)行順序:(售票處1)從數(shù)據(jù)單元中取出現(xiàn)有余票;(售票處2)從數(shù)據(jù)單元中取出現(xiàn)有余票;(售票處1)做減1操作;(售票處1)把結(jié)果送回到數(shù)據(jù)單元;(售票處2)做減1操作;(售票處2)把結(jié)果送回到數(shù)據(jù)單元;結(jié)果是把一張票賣給了兩個顧客。

與時間有關(guān)的錯誤產(chǎn)生的原因:多個進程不受限制的對同一數(shù)據(jù)對象進行存取操作。二、進程的互斥

有共享資源的進程執(zhí)行時出現(xiàn)與時間有關(guān)的錯誤,其根本原因是對共享資源的使用不受限制。進程交叉使用了共享資源從而造成了錯誤。幾個基本概念

1、臨界資源一次僅允許一個進程訪問的資源被稱為臨界資源

2、臨界區(qū)臨界區(qū)的定義:把在進程中那段訪問臨界區(qū)的代碼稱為臨界區(qū)。對臨界區(qū)管理的要求:一次最多讓一個進程進入臨界區(qū)任何一個進入臨界區(qū)的進程必須在一個有限的時間內(nèi)退出臨界區(qū)。若有多個進程同時要求進入它們的臨界區(qū),則應在有限的時間內(nèi)讓其中之一進入。處理臨界區(qū)的原則:1、當無進程處于臨界區(qū)時,允許一進程立即進入臨界區(qū)2、當某一進程已進入臨界區(qū)時,其它試圖進入臨界區(qū)進程必須等待3、當某已進程離開臨界區(qū)時,若有進程等待,則允許其中之一進入臨界區(qū)4、當進程不能進入臨界區(qū)時,應立即釋放處理機,避免忙等。對臨界資源同時提出訪問請求的諸進程的執(zhí)行要加以限制,以防止上述“與時間有關(guān)的錯誤”。這種對臨界資源的排它訪問稱為互斥。

早期的研究結(jié)果表明,互斥問題的解決并不是一件很簡單的事情。解決互斥問題的軟件方法假設(shè)有兩個進程Pi和Pj,共享一個臨界資源R。方法一:設(shè)置一公用整型變量turn,用于指示被允許進入臨界區(qū)的進程的編號。repeatwhiletern<>idonoop;進入臨界區(qū)turn=j;untilfalse;repeatwhiletern<>jdonoop;進入臨界區(qū)turn=i;untilfalse;該方法可以確保每次只允許一個進程進入臨界區(qū),但不符合處理臨界區(qū)的原則1,易造成資源利用不充分。方法二:基本思想:在每一個進程訪問臨界資源之前,先查看一下臨界資源是否正被訪問。若正被訪問,則進程等待;否則進入自己的臨界區(qū)。為此,設(shè)置一個數(shù)組flag,每個元素的初值為false,表示進程未進入臨界區(qū),進程進入臨界區(qū)后,相應標志位置為true。repeatwhileflag[j]donoop;flag[i]=true;進入臨界區(qū)flag[i]=false;untilfalse;repeatwhileflag[i]donoop;flag[j]=true;進入臨界區(qū)flag[j]=false;untilfalse;方法二可以滿足原則1,但又出現(xiàn)了新的問題。比如,當Pi和Pj幾乎在同時都要求進入臨界區(qū),因而都發(fā)現(xiàn)對方的訪問標志為false,于是兩進程都先后進入臨界區(qū),顯然,這不符合臨界區(qū)處理的原則2。為了解決這個問題,把標志位的含義改變?yōu)椋簍rue表示進程希望進入臨界區(qū),即當進程要進入臨界區(qū)前,先將標志位flag置為true,表示進程已要求進入臨界區(qū),然后再去查看另一進程的標志,若另一進程的flag標志也為true,則本進程等待,否則,本進程進入臨界區(qū)。換句話說,進程要進入臨界區(qū),首先設(shè)置其要求進入的標志,然后,再去查看其他進程的標志。方法三:repeatflag[i]=true;whileflag[j]donoop;進入臨界區(qū)flag[i]=false;untilfalse;repeatflag[j]=true;whileflag[i]donoop;進入臨界區(qū)flag[j]=false;untilfalse;該方法可以有效地防止兩個進程同時進入臨界區(qū),但仔細分析又可看出,該方法可能會造成兩個進程都不能進入臨界區(qū)的后果。例如,當兩個進程同時要求進入臨界區(qū),分別將自己的標志位置為true,再去查看另一進程的標志,發(fā)現(xiàn)也為true,于是都等待,誰也無法進入臨界區(qū)。方法四:repeatflag[i]=true;turn=j;while[flag[j]andturn=jdonoop;進入臨界區(qū)flag[i]=false;untilfalse;假如進程Pi和Pj幾乎同時要求進入臨界區(qū),它們分別將flag[i}]和flag[j]置為true。Pi先將turn置為j,當它執(zhí)行while語句時,條件成立,故等待。但Pj會立即將turn置為i,這樣Pi就可以進入臨界區(qū)。Pi退出臨界區(qū)時會將flag[i]置為false,從而可以使Pj進入臨界區(qū)。利用軟件方法解決互斥問題有一定難度,在使用同一資源的進程數(shù)量較大時,有很大的局限性。另外一種解決互斥問題的方法是鎖機制。為臨界資源設(shè)置一個鎖w,當進程在進入臨界區(qū)之前,首先測試w的狀態(tài)。w等于1表示上鎖,該資源已被占用;w等于0表示開鎖,該資源已空閑,未被占用。Lockw:L:ifw=1thengotoLelsew:=1Unlockw:w:=0;軟件的解決方法四和鎖機制雖然可以在一定程度上解決互斥問題,但進程在等待時都需要不停地進行測試。這不滿足處理臨界區(qū)的原則4,降低了系統(tǒng)工作效率。信號量同步機制

一個信號量可以看成由兩個部分組成:一個是整型變量,另一個是隊列。整型變量隊列ProcedureP(VarS:Semaphore)beginS:=S–1;ifS<0thenW(S)end;ProcedureV(VarS:Semaphore)beginS:=S+1;ifS<=0thenR(S)end;P、V操作是原語操作,即它們的執(zhí)行是不可中斷的。

相應地,信號量的P、V操作可以被描述如下:W(S):將當前進程掛起在信號量等待隊列上R(S):從信號量等待隊列上喚醒一個等待進程臨界區(qū)的管理一般形式:

進程Abegin…P(S);臨界區(qū);V(S)…end;進程Bbegin…P(S);臨界區(qū);V(S)…end;P、V操作必須合理使用,否則可能造成由于交叉使用資源而引發(fā)的錯誤。用P、V操作實現(xiàn)進程的互斥①用P、V操作實現(xiàn)車輛觀察系統(tǒng)的互斥將S定義為一個信號量,初值為1ProcessObserverbeginL:observealorry;P(S);count:=count+1;V(S);gotoLend;ProcessReportbeginP(S);printcount;count:=0;V(S)end;錯誤方式1:ProcessObserverbeginL:P(S);

observealorry;count:=count+1;V(S);gotoLend;降低了進程的并發(fā)程度錯誤方式2:ProcessObserverbeginL:observealorry;P(S);count:=count+1;

gotoL;V(S)end;將造成系統(tǒng)癱瘓。②用P、V操作實現(xiàn)售票系統(tǒng)的互斥

將S定義為信號量,初值為1,余票的數(shù)量值放在整型變量A中。PROCESSPir:integer;beginP(S);r:=A;ifr>=1thenbeginr:=r–1;A:=r;V(S);{售出一張票};endelse{售出票已售完};end;PROCESSPir:integer;beginP(S);r:=A;ifr>=1thenbeginr:=r–1;A:=r;V(S);{售出一張票};endelsebeginV(S);{售出票已售完}endend;無法退出臨界區(qū)③讀者寫者問題:規(guī)定:允許多個進程同時讀;只允許一個進程寫;當有進程讀時不允許其它進程寫。第一種方案:定義信號量:S:semaphore;初值1;定義一個整數(shù):rs,初值0;

讀者:PROCESSReaderibeginrs:=rs+1;ifrs=1thenP(S);readfileF;rs:=rs–1;ifrs=0thenV(S);end;寫者:PROCESSWriterjbeginP(S);writefileF;V(S);end;問題:對共享變量rs訪問的程序段也是臨界區(qū)。

改進的方案:定義信號量:S,Sr:semaphore;分別為互斥訪問文件和計數(shù)變量的信號量,初值均為1;定義一個整數(shù):rs,初值0;讀者:PROCESSReaderbeginP(Sr);rs:=rs+1;ifrs=1thenP(S);V(Sr);readfileF;P(Sr);rs:=rs–1;ifrs=0thenV(S);V(Sr);end;寫者:PROCESSWriterbeginP(S);writefileF;V(S);end;例題:試用P、V操作寫出讀者優(yōu)先的同步算法。解答:定義兩個變量RC和WC,分別用于對進入臨界區(qū)的讀者和寫者進程計數(shù)。為了互斥的操作這兩個變量,需設(shè)置兩個相應的信號量RCS和WCS。為了使讀者-寫者之間和寫者-寫者之間互斥的訪問緩沖區(qū),設(shè)置信號量S。為了阻止讀者進程和鏈接等待的寫者進程,設(shè)置信號量W。為了鏈接等待的讀者進程,設(shè)置信號量R。這樣,當有第一個寫者進程進入臨界區(qū)后,所有的試圖進入臨界區(qū)的讀者進程將被阻塞在信號量R上,而寫者進程將優(yōu)先進入臨界區(qū)。讀者:PROCESSReaderbeginP(R);P(W);P(RCS);ifRC=0thenP(S);RC:=RC+1;V(RCS);V(W);V(R);readfileF;P(RCS);RC:=RC–1;ifRC=0thenV(S);V(RCS);end;寫者:PROCESSWriterbeginP(WCS);ifWC:=0thenP(W);WC:=WC+1;V(WCS);P(S);writefileF;V(S);P(WCS);WC:=WC–1;ifWC=0thenV(W);V(WCS);end;R:=W:=RCS:=WCS:=S:=1;RC:=WC:=0;例題:舉例說明P、V操作為什么要被設(shè)計成原語(即對同一信號量上的操作必須互斥)。解答:對于P操作,過程為:ProcedureP(VarS:Semaphore)beginS:=S–1;ifS<0thenW(S)end;假如有兩個進程P1、P2幾乎在同時作P操作,信號量S的初值為1。如果進程P1先作P操作,則S的值為0,P1進程不應被阻塞(或掛起)。但是,如果P操作不是原語操作,則可能有如下執(zhí)行順序:P1:S:=S-1P2:S:=S-1P1:ifS<0thenW(S)由于此時S為–1,P1將被阻塞,這樣,P操作就不符合原來的語義了。同樣,對于V操作,過程為:ProcedureV(VarS:Semaphore)beginS:=S+1;ifS<=0thenR(S)end;假如有兩個進程P1、P2幾乎在同時作V操作,信號量S的初值為-1。如果進程P1先作V操作,則S的值為0,該V操作應該喚醒一個被P操作阻塞的進程。但是,如果V操作不是原語操作,則可能有如下執(zhí)行順序:P1:S:=S+1P2:S:=S+1P1:ifS<=0thenR(S)由于此時S為1,P1所作的V操作將不再去喚醒被阻塞的進程,這樣,V操作就不符合原來的語義了。

另外,如果在P操作過程中插入了V操作,也會出現(xiàn)不符合語義的情況。例如,假定S的值為0,按照P操作的語義,作P操作的進程應該被阻塞,但是,如果有如下執(zhí)行順序:A進程的P操作語句:S:=S-1B進程的V操作語句:S:=S+1A進程的P操作語句:ifS<0thenW(S)

則作P操作的進程將不會被阻塞,這不符合語義。三、進程的同步

協(xié)作

buffer1buffer2輸入設(shè)備打印設(shè)備輸入進程計算進程打印進程P1P2P3這里,計算進程C和打印進程P的工作必須相互協(xié)作:計算進程只有在緩沖區(qū)中無數(shù)據(jù)時才能向其寫入數(shù)據(jù);打印進程只有在緩沖區(qū)中已有數(shù)據(jù)時才能將從中取出并打印。兩個進程應做如下協(xié)作1、進程C把一個記錄存入緩沖區(qū)后,應向進程P發(fā)送“緩沖區(qū)中有等待處理的記錄”的消息;2、進程P從緩沖區(qū)取出記錄后,應向進程C發(fā)送“緩沖區(qū)中的記錄已取走”的消息;3、進程C只有在得到進程P發(fā)送來的“緩沖區(qū)中的記錄已取走”的消息后,才能把下一個記錄存入緩沖區(qū),否則,進程C等待,直到消息到達;4、進程P只有在得到進程C發(fā)送來的“緩沖區(qū)中有等待處理的記錄”的消息后,才能從緩沖區(qū)取出記錄,否則,進程P等待,直到消息到達。buffer1buffer2輸入設(shè)備打印設(shè)備輸入進程計算進程打印進程P1P2P3PROCESScalculatorbeginL1:P(SB);計算下一個數(shù)據(jù)并送入緩沖區(qū);V(SA);gotoL1;end;PROCESSprinterbeginL2:P(SA);從緩沖區(qū)中取出數(shù)據(jù)并打印;V(SB);gotoL2;end;同步機制調(diào)用P操作測試消息是否到達調(diào)用V操作發(fā)送消息生產(chǎn)者-消費者問題簡單的生產(chǎn)者、消費者問題(單緩沖區(qū))定義:整型變量:Buffer,信號量:SP=1,SG=0

PROCESSProducerbeginL1:produceaproduct;P(SP);Buffer:=product;V(SG);gotoL1endPROCESSConsumerbeginL2:P(SG);TakeaproductformBuffer;V(SP);gotoL2end多緩沖區(qū)生產(chǎn)者、消費者問題PROCESSProducerbeginL1:produceaproduct;P(SP);B[k]:=product;k:=(k+1)modn;V(SG);gotoL1endPROCESSConsumerbeginL2:P(SG);TakeaproductformB[t];t:=(t+1)modnV(SP);consumer;gotoL2end定義:整型變量:k=0,t=0整型數(shù)組:B[0…n-1]信號量:SP=n,SG=0例子:三個進程R、W1、W2,共享一個緩沖區(qū)B,B中最多只能存放一個數(shù)。進程R負責不斷地向B中存入整數(shù),進程W1、W2分別負責取出B中的奇數(shù)和偶數(shù)并進行打印。PROCESSRx:integer;beginL1:{從輸入設(shè)備中讀入一個數(shù)};x:=讀入的數(shù);P(S);B:=x;ifB=奇數(shù)thenV(SO)elseV(SE)gotoL1;endPROCESSW1y:integer;beginL2:P(SO);y:=B;V(S);{打印y中數(shù)};gotoL2;endPROCESSW2z:integer;beginL3:P(SE);z:=B;V(S);{打印z中數(shù)};gotoL3;end定義信號量:S初值為1表示初始時緩沖區(qū)可用SO初值為0用于向打印奇數(shù)的進程發(fā)消息SE初值為0用于向打印偶數(shù)的進程發(fā)消息四、同步與互斥的混合問題

例子:有m個生產(chǎn)者和r個消費者共享容量為n的緩沖器(m、r、n均大于1)。每個生產(chǎn)者把自己生產(chǎn)的物品存入緩沖區(qū),每個消費者從緩沖區(qū)中取出物品去消費。要求用P、V操作對這些生產(chǎn)者和消費者進行正確管理。定義:整型數(shù)組:B[0…n-1]整型變量:k,t初值均為0信號量:S1:初值1用于生產(chǎn)者放入物品S2:初值1用于消費者取出物品SP:初值n緩沖區(qū)是否可用SG:初值0緩沖區(qū)里是否有物品PROCESSPibeginL1:produceaproduct;P(SP);P(S1);B[k]:=product;k:=(k+1)modn;V(S1);V(SG);gotoL1endPROCESSCjbeginL2:P(SG);P(S2);takeaproductfromB[t];t:=(t+1)modn;V(S2);V(SP);consume;gotoL1end生產(chǎn)者分別向緩沖區(qū)送產(chǎn)品,由S1控制互斥訪問。消費者分別從緩沖區(qū)中取出產(chǎn)品,由S2控制互斥訪問。例子:現(xiàn)有四個進程R1、R2、W1、W2,它們共享一個可以存放一個數(shù)的緩沖器B,R1、R2從鍵盤和磁盤上讀入數(shù)據(jù),放到緩沖器B中,W1、W2從緩沖器中分別讀取R1,R2寫入的數(shù)據(jù)并輸出打印。怎樣用P、V操作來協(xié)調(diào)四個進程的并發(fā)執(zhí)行?定義:信號量S初值為1用于寫入進程的互斥S1初值為0R1向W1發(fā)送消息S2初值為0R2向W2發(fā)送消息整型變量BPROCESSR1x:integerbeginL1:{接受來自鍵盤的數(shù)};x:=接受的數(shù);P(S);B:=x;V(S1);gotoL1endPROCESSR2y:integerbeginL2:{從磁盤上讀一個數(shù)};y:=讀入的數(shù);P(S);B:=y;V(S2);gotoL2endPROCESSW1k:integerbeginL4:P(S1);k:=B;V(S);{打印k中的數(shù)};gotoL3endPROCESSW2j:integerbeginL4:P(S2);j:=B;V(S);{打印k中的數(shù)};gotoL3end例題:假定一個閱覽室最多可以同時容納100個人閱讀,,讀者進入和離開閱覽室時,都必須在閱覽室門口的一個登記表上登記或去掉登記。試用P、V操作編寫讀者進程的同步算法。分析:設(shè)讀者有任意多個,但能同時閱覽的只能100人,所以,設(shè)一個信號量S代表空座位數(shù)目,初值為100,用它來控制進入閱覽室的讀者進程不超過100。另設(shè)信號量m,用于控制對登記表這一共享資源的互斥使用,其初值為1。Process第i個讀者進程beginP(S);P(m);填寫登記表;V(m);坐下閱覽;P(m);在登記表上去掉登記;V(m);V(S);gotoL1;end例題:有一個倉庫存放兩種零件A和B,最大庫容量各為M個。有一車間不斷的取A和B進行裝配,每次各取一個。有兩組供應商分別不斷的供應A和B(每次供應一個)。為保證配套和合理庫存,當某種零件的數(shù)量比另一種的數(shù)量超過n(n<M)個時,暫停對數(shù)量大的零件的進貨,只補充數(shù)量少的零件。試用P、V操作正確地實現(xiàn)之。分析:這里除了生產(chǎn)者-消費者這一對控制關(guān)系外,還增加了生產(chǎn)者之間的相互制約關(guān)系。這種相互制約關(guān)系需要另外設(shè)置信號量來實現(xiàn)。解答:信號量初值S1實現(xiàn)存取零件的互斥aval_am零件A的庫存容量aval_bm零件B的庫存容量full_a0零件A的可用數(shù)量full_b0零件B的可用數(shù)量san控制零件B是否超過零件An個sbn控制零件A是否超過零件Bn個A零件供應商的進程B零件供應商的進程生產(chǎn)車間的進程beginL1:P(aval_a);P(sa);P(S);storeA;V(full_a);V(sb);V(S);gotoL1:endbeginL2:P(aval_b);P(sb);P(S);storeB;V(full_b);V(sa);V(S);gotoL2:endbeginL3:P(full_a);P(full_b);P(S);takeAandB;V(aval_a);V(aval_b);V(S);gotoL3:end例題:當進程X和進程Y共享某個資源r,進程并發(fā)執(zhí)行時的程序如下(信號量S的初值為1):請回答:1、兩個進程并發(fā)執(zhí)行時,能否保證互斥使用資源,為什么?2、如果要使兩個進程交替使用資源,若仍使用P、V操作來進行管理,寫出應定義的信號量及其初值;3、修改上述程序,使兩個進程能交替使用資源;ProcessXbeginL1:P(S);使用資源r;V(S);gotoL1;endProcessYbeginL2:P(S);使用資源r;V(S);gotoL2;end1、能保證互斥使用資源。因為在兩個進程中“使用資源r”都作為臨界區(qū),由P(S)和V(S)操作保證了互斥執(zhí)行,S的初值定義為1,符合要求;2、要使兩個進程交替使用資源,僅僅保證互斥使用資源是不夠的,必須使兩個進程互相等待、互相通知。為此,必須定義新的信號量來實現(xiàn)進程的同步通信。這里定義信號量S1和S2,假定進程X先使用資源,那么S1的初值定義為1,S2的初值定義為0。S1和S2的使用可以保證互斥,所以原來的信號量S可以不要;3、兩個進程可以改寫為:ProcessXbeginL1:P(S1);使用資源r;V(S2);gotoL1;endProcessYbeginL2:P(S2);使用資源r;V(S1);gotoL2;endS1:semaphore:=1;S2:semaphore:=0;例題:假定三個進程間的同步算法如下,其中S1、S2、S3的初值都是1。問:算法在什么情況下會發(fā)生死鎖。ProcessAbeginP(S1);P(S2);......V(S2);V(S1);endProcessBbeginP(S2);P(S3);......V(S3);V(S2);endProcessCbeginP(S3);P(S1);......V(S1);V(S3);end假定出現(xiàn)了如下的進程執(zhí)行順序:進程A執(zhí)行P(S1),進程B執(zhí)行P(S2),進程C執(zhí)行P(S3),進程A執(zhí)行P(S2),進程B執(zhí)行P(S3),進程C執(zhí)行P(S1),即A、B、C都在試圖執(zhí)行各自第二個P操作。此時,A阻塞在S2,B阻塞在S3,C阻塞在S1,它們都等待其它進程釋放相應的信號量,處于相互等待和循環(huán)等待的狀態(tài),此時就是死鎖。其它控制同步與互斥的機制1、信號量集在某些應用場合,一個進程可能要訪問多個臨界資源,比如同時申請輸入和打印設(shè)備。相應的描述如下:ProcessAbeginP(Si);P(So);......V(Si);V(So);endProcessBbeginP(So);P(Si);......V(So);V(Si);end仔細分析一下可以看出,這樣互斥使用臨界資源可能造成死鎖。另外,在前述的信號量機制中,P、V操作僅能對信號量施以加1或減1操作,即每次只能獲得或釋放一個單位的臨界資源。當一次需要N個某類資源時,便需要進行N次操作。顯然這是低效的。信號量集機制的基本思想是:將進程在整個運行過程中所需要的所有臨界資源一次性地全部分配給進程,待該進程使用完后一次性的釋放。亦即,對若干個臨界資源的分配,采取原子操作方式。所謂“and信號量集”的思想是:將進程所需要的所有臨界共享資源一次全部分配給它,待其使用完后再一起釋放。只要有一個資源不能獲得,其他資源也都不分配給它。這種同步機制稱為“同時P操作”(SP)同時P操作定義如下:ProcedureSP(S1,…,Sn)Beginif(S1>=1and...andSn>=1)fori:=1tondoSi:=Si–1;else將當前執(zhí)行進程插入到Si的等待隊列,Si是第一個滿足Si<1的信號量,程序計數(shù)器設(shè)為P操作的開始;end;同時V操作定義如下:ProcedureV(S1,...,Sn)beginfori:=1tondoSi:=Si+1;喚醒Si等待隊列上的所有等待進程,將它們插入到就緒隊列中。end;采用同步信號量集描述同時申請輸入和打印設(shè)備的進程如下:ProcessAbeginSP(Si,So);......SV(Si,So);endProcessBbeginSP(So,Si);......SV(So,Si);end

此外,在有些情況下,當資源數(shù)量低于某一下限值時,便不予分配。因而在每次分配前都必須測試資源的數(shù)量是否滿足要求?;谏鲜鰞牲c,可以對信號量機制作進一步擴充,形成一般的信號量集機制。滿足最低要求的資源數(shù)量為ti,請求分配的資源數(shù)量為di。ProcedureP(S1,t1,d1,...,Sn,tn,dn)beginif(S1>=t1and...andSn>=tn)fori:=1tondoSi:=Si–di;else將當前執(zhí)行進程插入到Si的等待隊列,Si是第一個滿足Si<ti的信號量,程序計數(shù)器設(shè)為P操作的開始;end;ProcedureV(S1,d1,...,Sn,dn)beginfori:=1tondoSi:=Si+di;喚醒Si等待隊列上的所有等待進程,將它們插入到就緒隊列中。end;信號量集幾種特殊情況的討論:(1)P(S,d,d),此時在信號量集中只有一個信號量,但它允許每次申請d個資源,當現(xiàn)有資源數(shù)少于d時,不予分配;(2)P(S,1,1),此時的信號量集已蛻化為一般的信號量(S>1)或互斥信號量(S=1);(3)P(S,1,0),這是一種很特殊且很有用的信號量。當S>=1時,允許多個進程進入某特定區(qū),當S變?yōu)?后,將阻止任何進程進入特定區(qū)。換言之,它相當于一個可控開關(guān)。2、管程信號量機制的一個特點是:在每個并發(fā)進程中都要設(shè)置大量的同步操作原語,同步控制部分分散在各個進程中。這不僅給編程帶來了麻煩,而且如果P、V操作不當還可能會導致數(shù)據(jù)的不確定性和系統(tǒng)的死鎖。Dijkstra認為應把各進程中與同一共享數(shù)據(jù)有關(guān)的同步控制和同步處理集中起來,構(gòu)成獨立于進程的實體。系統(tǒng)中的各種硬件資源和軟件資源均可用數(shù)據(jù)結(jié)構(gòu)抽象地描述,既用少量信息和對該資源所執(zhí)行的操作來表征該資源,而忽略它們的內(nèi)部結(jié)構(gòu)和實現(xiàn)細節(jié)。當共享資源用共享數(shù)據(jù)來表示時,資源管理程序可以用對該數(shù)據(jù)結(jié)構(gòu)進行操作的一組過程來表示。我們把這樣一組相關(guān)的數(shù)據(jù)結(jié)構(gòu)和過程稱為管程。Hansen為管程下的定義是:一個管程定義了一個數(shù)據(jù)結(jié)構(gòu)和能為并發(fā)進程所執(zhí)行的(在該數(shù)據(jù)結(jié)構(gòu)上的)一組操作,這種操作能同步進程和改變管程中的數(shù)據(jù)。管程的組成:局部于管程的共享數(shù)據(jù)說明對該數(shù)據(jù)結(jié)構(gòu)進行操作的一組過程對局部于管程的數(shù)據(jù)的初始化語句在管程的實現(xiàn)中必須考慮:互斥:當幾個進程調(diào)用管程時,僅允許一個進程進入管程,其它調(diào)用者必須等待。同步:在管程中必須設(shè)置兩個同步操作原語wait和signal。當進程通過管程請求訪問某共享數(shù)據(jù)而未能滿足時,管程便調(diào)用wait原語使該進程等待,并將它排在等待隊列上。僅當另一進程訪

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 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

提交評論