第5章 并行性:互斥及同步_第1頁(yè)
第5章 并行性:互斥及同步_第2頁(yè)
第5章 并行性:互斥及同步_第3頁(yè)
第5章 并行性:互斥及同步_第4頁(yè)
第5章 并行性:互斥及同步_第5頁(yè)
已閱讀5頁(yè),還剩176頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、目錄目錄n第一部分 概論n 第1章 引論n 第2章 操作系統(tǒng)的運(yùn)行環(huán)境n第二部分 進(jìn)程、多線(xiàn)程和并行性n 第3章 進(jìn)程管理n 第4章 多線(xiàn)程n 第5章 并行性:互斥和同步n第三部分 處理器管理、死鎖n 第6章 多處理器管理系統(tǒng)和處理器管理n 第7章 死鎖目錄目錄n第四部分 主存儲(chǔ)器管理n 第8章 實(shí)存儲(chǔ)器管理技術(shù)n 第9章 虛擬存儲(chǔ)管理n第五部分 設(shè)備和文件管理n 第10章 設(shè)備管理n 第11章 文件系統(tǒng)n第六部分 分布式計(jì)算機(jī)系統(tǒng)、操作系統(tǒng)結(jié)構(gòu)和范例n 第12章 分布式計(jì)算機(jī)系統(tǒng)n 第13章 微內(nèi)核、操作系統(tǒng)的結(jié)構(gòu)和設(shè)計(jì)n 第14章 Windows NT 操作系統(tǒng)第 5 章 并行性:互斥和同

2、步5.1 概論5.2 臨界段5.2.1 臨界段的提出5.2.2 臨界段的互斥要求5.3 互斥 5.3.1互斥的軟件方法 5.3.2互斥的硬件方法5.4 信號(hào)量5.4.1 信號(hào)量5.4.2 信號(hào)量及同步原語(yǔ)5.4.3 同步原語(yǔ)的不可分割性5.4.4 用信號(hào)量實(shí)現(xiàn)進(jìn)程間互斥5.4.5 生產(chǎn)者和消費(fèi)者問(wèn)題5.4.6 閱讀者和寫(xiě)入者問(wèn)題第 5 章 并行性:互斥和同步5.5 管程5.5.1 管程的定義5.5.2 用管程實(shí)現(xiàn)同步5.6 進(jìn)程間的通信5.6.1 進(jìn)程通信的實(shí)現(xiàn)5.6.2 間接通信模式5.6.3 其他通信模式5.7 UNIX的進(jìn)程同步和通信5.7.1 管道(pipes)5.7.2 消息5.7.

3、3 共享主存段5.7.4 信號(hào)量5.7.5 信號(hào)或軟中斷5.8 Solaris線(xiàn)程同步原語(yǔ)5.1 5.1 概概 論論提高效率、性能并行多道程序設(shè)計(jì)多處理器系統(tǒng)分布式處理系統(tǒng)帶來(lái)問(wèn)題:可能導(dǎo)致數(shù)據(jù)的不一致性,結(jié)果的不可再現(xiàn)。解決: 保證并發(fā)進(jìn)程的正確執(zhí)行順序的機(jī)制 例如:不可再現(xiàn)性程序A 程序BN=N+1; print(N); N=0;設(shè)某時(shí)刻N(yùn)=n;程序A執(zhí)行結(jié)果:程序A 程序Bn+1 n+1 0 例如:不可再現(xiàn)性程序A 程序BN=N+1; print(N); N=0;設(shè)某時(shí)刻N(yùn)=n;程序A執(zhí)行結(jié)果:程序A 程序Bn+1 n 0 例如:不可再現(xiàn)性程序A 程序BN=N+1; print(N);

4、N=0;設(shè)某時(shí)刻N(yùn)=n;程序A執(zhí)行結(jié)果:程序A 程序B1 n 0 進(jìn)程間的關(guān)系n直接感知(雙方直接交互,如通信) n間接感知(雙方都與第三方交互,如共享文件等軟資源) n相互不感知(完全不了解其它進(jìn)程的存在) 相互感知程度相互感知程度 交互關(guān)系交互關(guān)系 一個(gè)進(jìn)程對(duì)其他進(jìn)一個(gè)進(jìn)程對(duì)其他進(jìn)程程的影響的影響 直接感知(雙方直接交互,如通信) 通過(guò)通信進(jìn)行協(xié)作 一個(gè)進(jìn)程的結(jié)果,依賴(lài)于從其他進(jìn)程獲得的信息 間接感知(雙方都與第三方交互,如共享資源) 通過(guò)共享進(jìn)行協(xié)作 一個(gè)進(jìn)程的結(jié)果,依賴(lài)于從其他進(jìn)程獲得的信息 相互不感知(完全不了解其它進(jìn)程的存在) 競(jìng)爭(zhēng) 一個(gè)進(jìn)程的操作,對(duì)其他進(jìn)程的結(jié)果無(wú)影響 進(jìn)程的同

5、步SynchronismSynchronism 多個(gè)進(jìn)程中發(fā)生的事件,存在某種時(shí)序關(guān)系,需要相互合作,共同完成一項(xiàng)任務(wù)。 一個(gè)進(jìn)程,運(yùn)行到某一點(diǎn)時(shí),要求另一伙伴進(jìn)程為它提供消息,n在未獲得消息之前,該進(jìn)程處于等待狀態(tài),n獲得消息后,被喚醒進(jìn)入就緒狀態(tài)例子 到站停車(chē)到站停車(chē) 開(kāi)開(kāi) 車(chē)車(chē) 開(kāi)開(kāi) 車(chē)車(chē) 門(mén)門(mén) 關(guān)關(guān) 車(chē)車(chē) 門(mén)門(mén) 售售 票票 正常行車(chē)正常行車(chē)。售票員售票員司機(jī)司機(jī)進(jìn)程的互斥Mutual ExclusionMutual Exclusion各進(jìn)程要求共享資源,有些資源需要排他地使用,A進(jìn)程使用時(shí),B進(jìn)程就不能用,各進(jìn)程間競(jìng)爭(zhēng)地使用這些資源。進(jìn)程同步和互斥間的關(guān)系n相似相似: 互斥,是同步的一

6、種特殊情況; 互斥和同步,統(tǒng)稱(chēng)為進(jìn)程同步。n差別差別:進(jìn)程同步和互斥間的關(guān)系n相似相似n差別差別: 進(jìn)程互斥是進(jìn)程間競(jìng)爭(zhēng)共享資源的使用權(quán) ,這種競(jìng)爭(zhēng)沒(méi)有固定的必然聯(lián)系,哪個(gè)進(jìn)程競(jìng)爭(zhēng)到使用權(quán)就歸那個(gè)進(jìn)程使用,直到不需要使用時(shí)再歸還; 進(jìn)程同步,涉及共享資源的并發(fā)進(jìn)程間,有一種必然的聯(lián)系,即使無(wú)進(jìn)程在使用共享資源時(shí),那么尚未得到同步消息的進(jìn)程,也不能去使用這個(gè)資源。5.2 5.2 臨界段臨界段5.2.1 5.2.1 臨界段的提出臨界段的提出 我們考察這樣兩個(gè)例子。 例例1 1 下面再考察一個(gè)更貼近機(jī)器指令級(jí)的一個(gè)并行性中進(jìn)程間關(guān)系的例子。例例2 2 考慮有兩個(gè)進(jìn)程P1和P2,二者異步地增加代表某資

7、源數(shù)量的一個(gè)公共變量x。 P1:; x:=x+1; P2:; x:=x+1;設(shè)C1和C2是共享主存的雙機(jī)系統(tǒng)中的兩個(gè)處理器,它們分別有內(nèi)部通用寄存器R1和R2。假定P1正在C1上執(zhí)行,而P2正在C2上執(zhí)行,那么下面兩個(gè)執(zhí)行順序均有可能發(fā)生:(1) P1:,R1:=x;Rl:=Rl+1;x:=Rl; P2:, R2:=x;R2:=R2+1;x:=R2; t0 t(2) P1:,R1:=x;R1:=Rl+1;x:=R1; P2:=, R2:=x;R2:=R2+1;x:=R2;這兩個(gè)例子為什么都出了問(wèn)題? 問(wèn)題在于這兩個(gè)例子中的in和x都是互斥性使用的共享變量,就是說(shuō)進(jìn)程必須互斥地對(duì)共享變量進(jìn)行訪(fǎng)問(wèn)

8、。5.2.2 5.2.2 臨界段的互斥要求臨界段的互斥要求臨界資源(Critical Resource): 系統(tǒng)中某些資源,一次只允許一個(gè)進(jìn)程使用,稱(chēng)這樣的資源為臨界資源,或互斥資源。臨界段(Critical Sections): 進(jìn)程中訪(fǎng)問(wèn)共享變量的代碼段”稱(chēng)為臨界段(critical sections)。因此例1中的進(jìn)程A和進(jìn)程B關(guān)于in臨界段是: (in)nextfreeitem /in的內(nèi)容送入nextfreeitem。 將要打印的文件名nextfreeitem所指出的目錄中 (nextfreeitem)+l in將in增1。臨界資源是:in例2中進(jìn)程P1和P2關(guān)于x的臨界段是: “R

9、:=x;R:=R+l;x:=R”臨界資源是:x 需要指出的是,并行進(jìn)程間關(guān)于同一個(gè)共享變量的操作可能是不同的(例如例2中進(jìn)程P1和P2是買(mǎi)票,而又有一個(gè)進(jìn)程P3可能是退票)。因而不同進(jìn)程關(guān)于同一變量的臨界段代碼可能是完全不同的(本節(jié)例1、例2中臨界段代碼剛好相同)。 為了使系統(tǒng)中并行進(jìn)程正確而有效地訪(fǎng)問(wèn)共享變量(又稱(chēng)臨界資源),對(duì)進(jìn)程互斥地使用臨界段有以下原則:原則:(1)(1)在共享同一個(gè)臨界資源的所有進(jìn)程中,每次只允許有一個(gè)進(jìn)程處于它的臨在共享同一個(gè)臨界資源的所有進(jìn)程中,每次只允許有一個(gè)進(jìn)程處于它的臨界段之中。界段之中。(2)(2)若有多個(gè)進(jìn)程同時(shí)要求進(jìn)入它們的臨界段時(shí),應(yīng)在有限的時(shí)間內(nèi)讓

10、其中之若有多個(gè)進(jìn)程同時(shí)要求進(jìn)入它們的臨界段時(shí),應(yīng)在有限的時(shí)間內(nèi)讓其中之一進(jìn)入臨界段。一進(jìn)入臨界段。(3)(3)進(jìn)程只應(yīng)在臨界段內(nèi)逗留有限時(shí)間。進(jìn)程只應(yīng)在臨界段內(nèi)逗留有限時(shí)間。(4)不應(yīng)使要進(jìn)入臨界段的進(jìn)程無(wú)限期地等待在臨界段之外。不應(yīng)使要進(jìn)入臨界段的進(jìn)程無(wú)限期地等待在臨界段之外。(5)在臨界段之外運(yùn)行的進(jìn)程不可以阻止其他的進(jìn)程進(jìn)入臨界段。在臨界段之外運(yùn)行的進(jìn)程不可以阻止其他的進(jìn)程進(jìn)入臨界段。(6)在解決臨界段問(wèn)題時(shí),不要預(yù)期和假定進(jìn)程進(jìn)展的相對(duì)速度以及可用的處在解決臨界段問(wèn)題時(shí),不要預(yù)期和假定進(jìn)程進(jìn)展的相對(duì)速度以及可用的處理器數(shù)目。理器數(shù)目。5.3 5.3 互斥互斥5.3.1 5.3.1 互斥

11、的軟件方法互斥的軟件方法通過(guò)平等協(xié)商方式,實(shí)現(xiàn)進(jìn)程互斥的最初方法是軟件方法 其基本思路:在進(jìn)入?yún)^(qū),檢查和設(shè)置一些標(biāo)志,如果已有進(jìn)程在臨界區(qū),則在進(jìn)入?yún)^(qū)通過(guò)循環(huán)檢查進(jìn)行等待;在退出區(qū)修改標(biāo)志 主要問(wèn)題:設(shè)置什么標(biāo)志如何檢查標(biāo)志n下面通過(guò)一個(gè)例子來(lái)研究臨界段互斥執(zhí)行的軟件解決辦法。例例3 有兩個(gè)并行進(jìn)程P0和P1,互斥地共享單個(gè)資源(如磁帶機(jī)或某共享數(shù)據(jù))。P0和P1是一個(gè)循環(huán)進(jìn)程(指進(jìn)程執(zhí)行一個(gè)無(wú)限循環(huán)程序),每次只使用資源為一個(gè)有限的時(shí)間間隔。n注意:以下介紹的方法不完全正確,這些方法之所以值得介紹,是它們顯示出了在開(kāi)發(fā)并行程序時(shí)存在的通病,同時(shí)也表示了軟件方法解決互斥和同步問(wèn)題的困難和邏輯上

12、的復(fù)雜性。 類(lèi)PASCAL描述語(yǔ)句與C對(duì)比nbegin endbegin endnrepeat . Foreverrepeat . Forevernrepeat . until P repeat . until P nwhile P do while P do begin endbegin endnfunction name1(.):typefunction name1(.):typenprocedure name2(.)procedure name2(.)nvar i,j:integer;var i,j:integer;nvar x:array0.9 of var x:array0.9 of

13、 integer;integer;ni:=1;i:=1;n,=,and,or,not,=,and,or,notnnfor (;)for (;)或或while 1 do .while 1 do .ndo.while !Pdo.while !Pnwhile P do.while P do.ntype name1(.)type name1(.)nvoid name2(.)void name2(.)nint i,j;int i,j;nint x10;int x10;ni=1;i=1;n!=,!=,&,|,!,&,|,!方法一:進(jìn)程標(biāo)志位nvar flag:array0.1 of boo

14、lean;Pi:begin repeatwhile flagj do skip;flagi:=true; ; flagi:=false; foreverend問(wèn)題:當(dāng)兩個(gè)進(jìn)程的標(biāo)志位,初值均為false時(shí),而切換發(fā)生在此處,則都進(jìn)入臨界段!/Pj在臨界段檢測(cè)和設(shè)檢測(cè)和設(shè)置中間發(fā)置中間發(fā)生問(wèn)題!生問(wèn)題!方法二:臨界段進(jìn)程指針nvar turn:0.1; 此句課本有誤Pi:begin repeatwhile turni do skip; turn:=j; forever end若turn=i, 則進(jìn)程Pi進(jìn)入臨界段問(wèn)題: Pi一定要等待Pj進(jìn)入過(guò)后,才可以再次進(jìn)入!(臨界資源利用率不高)方法三:改

15、進(jìn)解法一nPi:begin repeatflagi:=true; while flagj do skip; flagi:=false; foreverend想進(jìn)入 CS有Pj在 CS問(wèn)題:當(dāng)切換發(fā)生在此處,兩個(gè)進(jìn)程各自標(biāo)志位為true,于是互相等待而阻塞了自己設(shè)置和檢設(shè)置和檢測(cè)中間發(fā)測(cè)中間發(fā)生問(wèn)題!生問(wèn)題!方法四:Dekker算法var flag:array0.1 of boolean; turn:0.1;標(biāo)志的含義:標(biāo)志的含義:nflagi=true 進(jìn)程Pi要進(jìn)入臨界段nturn=i 應(yīng)該由進(jìn)程Pi進(jìn)入臨界段.Pi:begin repeat flagi:=true; while flagj

16、 do if turn=j then flagi:=false; while turn=j do skip; flagi:=true; 進(jìn)程Pi的臨界段代碼CSi; turn:= j; flagi:=false; 進(jìn)程Pi的其它代碼; forever endPi想要進(jìn)入CS可能切換到Pj, Pj也想進(jìn)入應(yīng)該由Pj進(jìn)入?撤銷(xiāo)Pi標(biāo)志Pj進(jìn)入期間Pj退出后恢復(fù)標(biāo)志方法五 Dekker算法擴(kuò)充到n個(gè)進(jìn)程共享一個(gè)公用變量的情況.var flag:array0.n-1 of (idle,want_in,in_cs);turn:0.n-1;Pi:begin var j:integer;var j:inte

17、ger;repeat repeat repeat flagi:=want_in;flagi:=want_in;while turni do if flagturn=idlewhile turni do if flagturn=idle then turn:=i; then turn:=i; flagi:=in_cs;flagi:=in_cs;j:=0;j:=0;while (jn)and (j=i or flagjin_cs)while (jn)and (j=i or flagjin_cs) do j:=j+1; do j:=j+1; until j=n; until j=n; 進(jìn)入進(jìn)入Pi的

18、CSiCSi; flagi:= idle;flagi:= idle;進(jìn)入進(jìn)入Pi的其他代碼;ForeverForeverEndEnd軟件解法的缺點(diǎn) 1. 忙等待 2. 實(shí)現(xiàn)過(guò)于復(fù)雜 3. 需要高的編程技巧5.3.2 互斥的硬件方法n1、中斷屏蔽方法n2、硬件指令方法用一條指令完成讀和寫(xiě),保證讀與寫(xiě)不被打斷。中斷屏蔽方法屏蔽中斷;進(jìn)程P的臨界段;開(kāi)中斷;n簡(jiǎn)單,有效n較高的代價(jià),限制CPU并發(fā)能力n不適應(yīng)多處理器硬件指令方法提供專(zhuān)門(mén)的硬件指令,允許對(duì)一個(gè)字的內(nèi)容進(jìn)行檢測(cè)和修正,或交換兩個(gè)字的內(nèi)容優(yōu)點(diǎn):簡(jiǎn)單、有效,特別適用于多處理機(jī)缺點(diǎn):忙等待硬件解法 (1) “測(cè)試并設(shè)置”指令function

19、Test_and_Set(varflag:boolean):boolean BeginTest_and_Set:=flag;flag:= true;End“測(cè)試并設(shè)置”指令 實(shí)現(xiàn)互斥為每個(gè)臨界段設(shè)置一個(gè)布爾變量,如lock:false 臨界段未被用 true 正有進(jìn)程在臨界段中運(yùn)行repeat while TS(lock) do Skip; 進(jìn)程Pi的臨界段代碼CS; lock:=false; 進(jìn)程Pi的其它代碼;forever對(duì)比83頁(yè) 解法一硬件解法 (2) “交換”指令procedure SWAP(var a,b:boolean)var temp: boolean begintemp:=

20、 a;a:= b;b:= temp; end“交換”指令 實(shí)現(xiàn)互斥repeat key:=true; repeat Swap(lock,key);until key=false; 進(jìn)程Pi的臨界段代碼CS;lock:=false;進(jìn)程Pi的其它代碼;forever為每個(gè)臨界段設(shè)置一個(gè)布爾變量,lock:false 表示臨界段未被用 lock: true表示正有進(jìn)程在臨界段中運(yùn)行目錄n1、概論n2、臨界段n3、互斥n4、信號(hào)量、信號(hào)量semaphoren5、管程n6、進(jìn)程間的通信4、信號(hào)量、信號(hào)量semaphore信號(hào)量機(jī)制:一種解決進(jìn)程的同步與互斥的工具同步機(jī)制應(yīng)滿(mǎn)足的基本要求:* 描述能力*

21、 可以實(shí)現(xiàn)* 效率高* 使用方便進(jìn)程的同步機(jī)制1965年,由荷蘭學(xué)者Dijkstra提出(1972年獲得ACM圖靈獎(jiǎng),2002年8月去世)。n“信號(hào)量”:n是一個(gè)具有非負(fù)初值的整型變量,并且有一個(gè)隊(duì)列與它關(guān)聯(lián)。n不是普通的變量,只能進(jìn)行Wait、Signal操作1)信號(hào)量2)信號(hào)量上的同步原語(yǔ)原語(yǔ)nWait(S):將S減1,若信號(hào)量S0,則進(jìn)程等待。nSignal(S):將信號(hào)量S加1, 若S=0時(shí),表示該類(lèi)資源的可用資源數(shù)nS0時(shí),每執(zhí)行一次Wait操作,意味著請(qǐng)求分配一個(gè)單位的該類(lèi)資源,即 S:=S-1;nS0時(shí),執(zhí)行Wait操作,此時(shí)已無(wú)資源可分配,故進(jìn)程被阻塞;nS0時(shí),執(zhí)行Wait操

22、作,說(shuō)明前面已經(jīng)有進(jìn)程在等待著分配資源了。S的絕對(duì)值 = 該信號(hào)量上等待的進(jìn)程數(shù)。Signal操作的物理意義n每執(zhí)行一次Signal操作,意味著進(jìn)程釋放一個(gè)單位的該類(lèi)可用資源,即S:=S+1。nS若干個(gè)可并行執(zhí)行的進(jìn)程協(xié)同完成一個(gè)工作(同步)在進(jìn)程之間的信息交換(進(jìn)程通信)。進(jìn)程的同步是一種通信方式,進(jìn)程之間建立必要的聯(lián)系,協(xié)調(diào)它們的運(yùn)行。1)進(jìn)程通信方式n低級(jí)通信:進(jìn)程之間控制信息的交換,達(dá)到控制進(jìn)程執(zhí)行速度的作用。信息量較少。 信號(hào)量機(jī)制作為同步工具是卓有成效的,但作為通訊工具則不夠理想:效率低, 通訊對(duì)用戶(hù)不透明。高級(jí)通信:交換信息量較多。2)高級(jí)通訊機(jī)制類(lèi)型n1 消息傳遞系統(tǒng)(Mess

23、age passing System)n2管道(pipe)通信系統(tǒng)n3共享存儲(chǔ)器系統(tǒng)(Shared-Memory System)2.1)消息傳遞系統(tǒng)消息緩沖通訊技術(shù)由Hansen 首先提出的,基本思想是:根據(jù)“生產(chǎn)者消費(fèi)者關(guān)系”原理,利用公用消息緩沖區(qū),實(shí)現(xiàn)進(jìn)程間的信息交換。2.1)消息傳遞系統(tǒng)進(jìn)程間的數(shù)據(jù)交換,是以消息(message)為單位。直接利用系統(tǒng)提供的一組通訊命令(原語(yǔ))來(lái)實(shí)現(xiàn)通訊。據(jù)實(shí)現(xiàn)方法,可分為 直接通信方式(消息緩沖機(jī)制)間接通信方式(信箱通信方式)直接通信直接通信(消息緩沖機(jī)制)發(fā)送進(jìn)程發(fā)送進(jìn)程:直接將消息發(fā)送給接收進(jìn)程,并將它掛在接收進(jìn)程的消息緩沖隊(duì)列上。接收進(jìn)程接收進(jìn)

24、程:從消息緩沖隊(duì)列中取得消息。數(shù)據(jù)結(jié)構(gòu)和信號(hào)量:消息、消息緩沖區(qū)、消息隊(duì)列通信原語(yǔ):Send;Receive;消息的一般形式n 接收消息的進(jìn)程名n 發(fā)送消息的進(jìn)程名n 消息長(zhǎng)度n 消息正文消息緩沖區(qū)消息緩沖區(qū)是一個(gè)數(shù)據(jù)結(jié)構(gòu) sender: 消息發(fā)送者名 size: 消息長(zhǎng)度 Text: 消息正文 Next: 下一個(gè)消息的鏈指針發(fā)送原語(yǔ)接收原語(yǔ)間接通信(信箱通訊方式)發(fā)送進(jìn)程發(fā)送進(jìn)程:不是把消息直接發(fā)送給接收者進(jìn)程,而是將消息發(fā)送到一個(gè)共享的數(shù)據(jù)結(jié)構(gòu)(一般稱(chēng)為信箱)中。接收進(jìn)程接收進(jìn)程:從信箱中取得消息。間接通信(信箱通訊方式)發(fā)送進(jìn)程和接收進(jìn)程四種關(guān)系:發(fā)送進(jìn)程和接收進(jìn)程四種關(guān)系:n一對(duì)一關(guān)系

25、一對(duì)一關(guān)系:可以為發(fā)送進(jìn)程和接收進(jìn)程建立一條專(zhuān)用的通信鏈路;n多對(duì)一關(guān)系:多對(duì)一關(guān)系:允許提供服務(wù)的進(jìn)程與多個(gè)用戶(hù)進(jìn)程進(jìn)行交互,(客戶(hù)/服務(wù)器);n一對(duì)多關(guān)系:一對(duì)多關(guān)系:允許一個(gè)發(fā)送進(jìn)程與多個(gè)接收進(jìn)程交互,使發(fā)送進(jìn)程用廣播的形式,發(fā)送消息;n多對(duì)多關(guān)系:多對(duì)多關(guān)系:允許建立一個(gè)公用信箱,讓多個(gè)進(jìn)程都能向信箱投遞消息,也可取走屬于自己的消息。2.2)管道(pipe)n由UNIX首創(chuàng),一種借助文件和文件系統(tǒng)形成的一種通信方式。 n 管道是以文件系統(tǒng)為基礎(chǔ)。消息緩沖通信機(jī)構(gòu),是以?xún)?nèi)存緩沖區(qū)為基礎(chǔ)。n字符流方式寫(xiě)入讀出n先進(jìn)先出順序管道 是指用于連接一個(gè)讀進(jìn)程,和一個(gè)寫(xiě)進(jìn)程,以實(shí)現(xiàn)它們之間通信的共享

26、方式,又稱(chēng)pipe文件。發(fā)送進(jìn)程(即寫(xiě)進(jìn)程):向管道(共享文件)提供輸入的,以字符流形式將大量的數(shù)據(jù)送入管道;接收進(jìn)程(即讀進(jìn)程):可從管道接收數(shù)據(jù)。為了協(xié)調(diào)雙方通信,管道通信必須提供三方面的協(xié)調(diào)能力:互斥、同步、對(duì)方是否存在。2.3)共享存儲(chǔ)器系統(tǒng)n共享存儲(chǔ)器系統(tǒng):相互通訊的進(jìn)程通過(guò)共享數(shù)據(jù)結(jié)構(gòu)和存儲(chǔ)區(qū)進(jìn)行通訊。n為了傳送大量數(shù)據(jù),在存儲(chǔ)區(qū)中劃出一塊共享存儲(chǔ)區(qū),諸進(jìn)程可通過(guò)對(duì)共享存儲(chǔ)區(qū),進(jìn)行讀或?qū)憯?shù)據(jù),實(shí)現(xiàn)通訊。 向系統(tǒng)申請(qǐng)共享存儲(chǔ)區(qū)中的一個(gè)分區(qū)指定該分區(qū)的關(guān)鍵字如果已經(jīng)給其他進(jìn)程分配了這樣的存儲(chǔ)區(qū),將使用分區(qū)的描述符返回給申請(qǐng)者申請(qǐng)者將申請(qǐng)到的共享分區(qū),掛到本進(jìn)程上5.6 5.6 進(jìn)程間的

27、通信進(jìn)程間的通信 為提高計(jì)算機(jī)系統(tǒng)的資源利用率和作業(yè)的處理速度,一個(gè)作業(yè)通常被分為若干個(gè)可并行執(zhí)行的進(jìn)程。這些進(jìn)程是異步的、相對(duì)獨(dú)立地向前推進(jìn)。但由于它們是協(xié)同地完成一個(gè)由于它們是協(xié)同地完成一個(gè)共同的作業(yè),所以它們應(yīng)保持一定的聯(lián)系,以便協(xié)調(diào)地完成共同的作業(yè),所以它們應(yīng)保持一定的聯(lián)系,以便協(xié)調(diào)地完成任務(wù)。這種聯(lián)系就是指在進(jìn)程間交換一定數(shù)量的信息任務(wù)。這種聯(lián)系就是指在進(jìn)程間交換一定數(shù)量的信息稱(chēng)稱(chēng)為進(jìn)程通信。進(jìn)程通信不但存在于一個(gè)作業(yè)的諸進(jìn)程間,而為進(jìn)程通信。進(jìn)程通信不但存在于一個(gè)作業(yè)的諸進(jìn)程間,而且也存在于共享有關(guān)資源的進(jìn)程之間,以及客戶(hù)與服務(wù)器進(jìn)且也存在于共享有關(guān)資源的進(jìn)程之間,以及客戶(hù)與服務(wù)器

28、進(jìn)程之間。程之間。 進(jìn)程間通信時(shí)所交換的信息量可多可少。少者僅是一些狀態(tài)和數(shù)據(jù)的變換,多者可以是一個(gè)相當(dāng)大的文件。隨著信息技術(shù)的迅猛發(fā)展和多機(jī)系統(tǒng)、分布式系統(tǒng)以及網(wǎng)絡(luò)技術(shù)的普遍應(yīng)用,進(jìn)程間的通信正變得越來(lái)越重要越普遍。目前各系統(tǒng)中使用的進(jìn)程間通信的實(shí)現(xiàn)模式有很多種,下面先具體剖析一種常用的通信模式的實(shí)現(xiàn)方法。5.6.1 5.6.1 進(jìn)程直接通信的實(shí)現(xiàn)進(jìn)程直接通信的實(shí)現(xiàn) 這是用得比較廣泛的進(jìn)程間直接通信模式的一種,采用多個(gè)發(fā)送者,一個(gè)接收者,接收者使用阻塞等待(即沒(méi)有等待的消息則把自己阻塞在消息隊(duì)列的信號(hào)量上),發(fā)送者不阻塞(即發(fā)送者發(fā)消息后不等待回答,繼續(xù)向前執(zhí)行)的模式。1.1.同步機(jī)制與數(shù)

29、據(jù)結(jié)構(gòu)同步機(jī)制與數(shù)據(jù)結(jié)構(gòu) 在直接通信模式下,接收者進(jìn)程常使用消息隊(duì)列來(lái)管理各發(fā)送者進(jìn)程發(fā)送來(lái)的消息。通常發(fā)送者在自己的工作區(qū)中按消息的數(shù)據(jù)格式形成一個(gè)消息,然后在公用存儲(chǔ)區(qū)申請(qǐng)一個(gè)消息緩沖區(qū),把消息放入消息緩沖區(qū)中,并鏈入接收者進(jìn)程的消息隊(duì)列中去。由于消息隊(duì)列將被接收者和發(fā)送者異步地訪(fǎng)問(wèn),這是一個(gè)相當(dāng)于生產(chǎn)者和消費(fèi)者的同步問(wèn)題,所以要有一個(gè)互斥信號(hào)量以保證對(duì)消息隊(duì)列的互斥訪(fǎng)問(wèn),同時(shí)還要有當(dāng)消息隊(duì)列為空時(shí),使接收者進(jìn)程阻塞等待的信號(hào)量或條件變量。 所以要有以下數(shù)據(jù)結(jié)構(gòu)和信號(hào)量:(1)(1)消息和消息緩沖區(qū)消息和消息緩沖區(qū) 消息 消息中至少要包含以下信息:目標(biāo)(接收者)進(jìn)程id,發(fā)送者進(jìn)程id,消

30、息大小,消息正文。消息是由發(fā)送者進(jìn)程所形成的。 消息緩沖區(qū) 發(fā)送者進(jìn)程id,消息大小,消息正文和用于形成消息隊(duì)列的鏈指針。(2)(2)消息隊(duì)列消息隊(duì)列 由于消息隊(duì)列要被多個(gè)進(jìn)程訪(fǎng)問(wèn),所以消息隊(duì)列是由在公用存儲(chǔ)區(qū)中的消息緩沖區(qū)鏈結(jié)而成的。消息隊(duì)列的頭指針通常在接收者進(jìn)程的進(jìn)程控制塊PCB內(nèi)。隊(duì)列可按先進(jìn)先出和優(yōu)先級(jí)原則來(lái)組織。(3)(3)同步機(jī)制同步機(jī)制 需要一個(gè)互斥信號(hào)量如mutex和等待信號(hào)量(或條件變量)如Swait。通常這兩個(gè)信號(hào)量也放在接收者進(jìn)程的PCB中。2.2.通信原語(yǔ)通信原語(yǔ) 實(shí)現(xiàn)進(jìn)程間通信,至少需要以下兩個(gè)通信原語(yǔ): Send(目標(biāo)進(jìn)程Id,消息); .發(fā)送原語(yǔ) Receive

31、(源進(jìn)程Id,消息); .接收原語(yǔ)(1)Send的工作流程 申請(qǐng)消息緩沖區(qū)將消息正文傳送到消息緩沖區(qū)正文部分向消息緩沖區(qū)填寫(xiě)消息頭部查尋目標(biāo)進(jìn)程PCB并對(duì)互斥信號(hào)量mutex執(zhí)行Wait操作將消息緩沖區(qū)鏈入消息隊(duì)列對(duì)等待信號(hào)量Swait做Signal操作對(duì)互斥信號(hào)量mutex作Signal操作。(2)Receive(2)Receive的工作流程的工作流程 對(duì)自己PCB中的Swait信號(hào)量做Wait操作對(duì)互斥信號(hào)量mutex執(zhí)行Wait操作將消息隊(duì)列中的第一個(gè)消息(頭指針?biāo)赶虻?移入進(jìn)程工作區(qū)將消息隊(duì)列頭指針指向下一個(gè)消息釋放原第一個(gè)消息的消息緩沖區(qū)對(duì)mutex執(zhí)行Signal操作。 如果消息

32、隊(duì)列為空,那么第一個(gè)Waitx操作,將使接收者進(jìn)程阻塞在Swait信號(hào)量上,直到發(fā)送者進(jìn)程執(zhí)行Send原語(yǔ)中,在Swait信號(hào)量上的Signal操作才使接收者進(jìn)程恢復(fù)為就緒或運(yùn)行狀態(tài)。5.6.2 5.6.2 間接通信模式間接通信模式 間接通信是指發(fā)送者進(jìn)程不是把消息直接發(fā)送給接收者進(jìn)程,而是把消息發(fā)送到一個(gè)共享的數(shù)據(jù)結(jié)構(gòu)信箱中去。接收者進(jìn)程也到信箱中去取消息。所謂信箱實(shí)際上也是一個(gè)包含有多個(gè)消息的隊(duì)列。 直接通信常用于進(jìn)程間相互關(guān)系比較緊密的情況下。間接通信用于聯(lián)系不十分緊密的進(jìn)程間。同時(shí)間接通信的優(yōu)勢(shì)在于它的靈活性。靈活性表現(xiàn)在發(fā)送者進(jìn)程和接收者進(jìn)程之間的關(guān)系可以有一對(duì)一、一對(duì)多、多對(duì)一以及

33、多對(duì)多的多種關(guān)系。其次信箱可以是靜態(tài)、固定不變的,也可以是動(dòng)態(tài)、可變的。圖5.4表示間接通信關(guān)系。 “一對(duì)一”關(guān)系主要用于兩個(gè)進(jìn)程間建立私用的通信連接,可以不受其他進(jìn)程的干擾和影響?!耙粚?duì)多”關(guān)系是指一個(gè)發(fā)送者和多個(gè)接收者的通信關(guān)系,這種關(guān)系用于一個(gè)發(fā)送者進(jìn)程向一組中的多個(gè)進(jìn)程以廣播的方式發(fā)送一個(gè)或多個(gè)消息的應(yīng)用場(chǎng)合。而“多對(duì)一”關(guān)系主要用于現(xiàn)代操作系統(tǒng)中的客戶(hù)/服務(wù)器模式下客戶(hù)進(jìn)程與服務(wù)器進(jìn)程之間的關(guān)系。許多客戶(hù)進(jìn)程可能都向一個(gè)打印服務(wù)進(jìn)程發(fā)消息請(qǐng)求提供打印服務(wù)。在這種情況下,我們把信箱稱(chēng)為“端口”(port),如圖5.4所示。 進(jìn)程與信箱的關(guān)系可以有靜態(tài)的和動(dòng)態(tài)的。端口通常是靜態(tài)的,固定不

34、變的,長(zhǎng)期的安排給某個(gè)特定進(jìn)程,直到進(jìn)程撤消,端口才撤消?!耙粚?duì)一”通信關(guān)系中的信箱通常也是靜態(tài)的、固定不變的。而對(duì)于有多個(gè)發(fā)送者時(shí),發(fā)送者進(jìn)程與信箱的關(guān)系可以是動(dòng)態(tài)的。為了實(shí)現(xiàn)信箱動(dòng)態(tài)連接的目的,系統(tǒng)提供鏈接(connect)和解除鏈接(disconnect)原語(yǔ)。在進(jìn)行通信之前,發(fā)送進(jìn)程調(diào)用鏈接原語(yǔ),把信箱鏈接到發(fā)送進(jìn)程。如果要撤消鏈接可以用解除鏈接原語(yǔ)。 信箱和端口通常歸創(chuàng)建者所擁有,端口由接收者進(jìn)程信箱和端口通常歸創(chuàng)建者所擁有,端口由接收者進(jìn)程所創(chuàng)建。所創(chuàng)建。5.6.3 5.6.3 其他通信模式其他通信模式 對(duì)于一個(gè)發(fā)送者進(jìn)程來(lái)說(shuō),它在執(zhí)行Send命令后,即發(fā)送完消息后怎么辦? 這不外

35、有兩種選擇:(1)阻塞自己,等待接收者的回答信息后才繼續(xù)向前執(zhí)行,我們稱(chēng)為阻塞發(fā)送。(2)發(fā)送完消息后不等回答就繼續(xù)向前執(zhí)行稱(chēng)為不阻塞發(fā)送。 同樣對(duì)于一個(gè)接收者來(lái)說(shuō),在執(zhí)行Receive命令后怎么辦? 也不外有兩種選擇:(1)已經(jīng)有消息在等待接收者進(jìn)程接收,于是在接收這個(gè)消息后繼續(xù)前進(jìn)。(2)還沒(méi)有任何消息到來(lái);于是它或者阻塞自己等待消息到來(lái),或者干脆放棄接收的意圖,繼續(xù)前進(jìn)。那么前者稱(chēng)阻塞接收,后者稱(chēng)非阻塞接收。 在操作系統(tǒng)中常用的進(jìn)程間通信模式有以下三種:1.1.非阻塞發(fā)送、阻塞接收非阻塞發(fā)送、阻塞接收 這是我們?cè)?.6.1節(jié)中討論的最常用、最自然的模式。這種非阻塞發(fā)送的方式便于發(fā)送者進(jìn)程

36、盡快地向多個(gè)進(jìn)程發(fā)送一個(gè)或多個(gè)消息的需要,同時(shí)這種不阻塞發(fā)送也適合客戶(hù)進(jìn)程在提出輸出請(qǐng)求后,繼續(xù)向前執(zhí)行,不需阻塞等待打印請(qǐng)求,尤其在SPOOL系統(tǒng)中。這種阻塞接收的方式也特別適用于那些不等待消息到來(lái)就無(wú)法進(jìn)行后續(xù)工作的進(jìn)程,如等待有服務(wù)請(qǐng)求到來(lái)的服務(wù)器進(jìn)程的工作情況和等待資源(硬資源和軟資源)的進(jìn)程。但不阻塞發(fā)送的方式也有隱患存在。它可能導(dǎo)致有意的或由于錯(cuò)誤而造成發(fā)送者進(jìn)程反復(fù)不斷的發(fā)送消息,造成大量資源(CPU時(shí)間和緩沖區(qū)空間)浪費(fèi)。 2.2.非阻塞發(fā)送、非阻塞接收非阻塞發(fā)送、非阻塞接收 這在分布式系統(tǒng)常見(jiàn)的通信方式,因?yàn)椴捎米枞邮辗椒〞r(shí),如果發(fā)送來(lái)的消息丟失(這在分布式系統(tǒng)中常發(fā)生),

37、或者被接收者進(jìn)程所期待的消息在該消息未發(fā)出之前發(fā)送者進(jìn)程即發(fā)生問(wèn)題失敗了,那么這將導(dǎo)致接收者進(jìn)程無(wú)限期被阻塞。而改進(jìn)的辦法就是使用非阻塞接收方式,即接收者進(jìn)程在接收消息時(shí),若有消息就處理消息,沒(méi)有消息就繼續(xù)前進(jìn)。 3.3.阻塞發(fā)送,阻塞接收阻塞發(fā)送,阻塞接收 發(fā)送者進(jìn)程在發(fā)送完消息后,阻塞自己等待接收者進(jìn)程發(fā)送回答消息后才能繼續(xù)前進(jìn)。接收者進(jìn)程在接收到消息前,也阻塞等待,直到接到消息后再向發(fā)送者進(jìn)程發(fā)送一個(gè)回答信息,如圖5.5所示,稱(chēng)之為雙向通信。5.7 UNIX5.7 UNIX的進(jìn)程同步和通信的進(jìn)程同步和通信UNIX中有以下五種用以進(jìn)程同步和通信的機(jī)制:(1)pipes管道。(2)消息。(3

38、)共享主存段。(4)信號(hào)量。(5)信號(hào)或稱(chēng)軟中斷。5.7.1 5.7.1 管道管道(pipes)(pipes) 管道是UNIX對(duì)操作系統(tǒng)最有意義的貢獻(xiàn),通常稱(chēng)為“兩個(gè)進(jìn)程間打開(kāi)的文件”,允許兩個(gè)進(jìn)程間按先進(jìn)先出方式傳輸數(shù)據(jù),一個(gè)進(jìn)程寫(xiě)入,一個(gè)進(jìn)程讀出,系統(tǒng)負(fù)責(zé)彼此間的同步執(zhí)行。管道也可看作是按生產(chǎn)者/消費(fèi)者方式工作的環(huán)形緩沖區(qū)。 管道分兩種:無(wú)名管道和有名管道。無(wú)名管道用于密切相關(guān)的父子進(jìn)程或兄弟進(jìn)程之間的通信,而有名管道用于一般的無(wú)家族關(guān)系的進(jìn)程間通信的。 管道有以下系統(tǒng)調(diào)用:(1)(1)管道創(chuàng)建管道創(chuàng)建 創(chuàng)建無(wú)名管道的系統(tǒng)調(diào)用是: pipe(fdp) 其中fdp是一個(gè)整型數(shù)組指針,其中包含

39、有對(duì)管道進(jìn)行讀寫(xiě)的兩個(gè)文件描述符。 進(jìn)程創(chuàng)建pipe文件后,通常就創(chuàng)建一個(gè)或幾個(gè)子進(jìn)程,于是子進(jìn)程復(fù)制父進(jìn)程的文件表。這樣pipe文件就為父子進(jìn)程共享。進(jìn)程在使用無(wú)名管道通信時(shí),調(diào)用Read()和Write()命令與讀寫(xiě)普通文件一樣地進(jìn)行讀寫(xiě)。使用完后調(diào)用Close()命令關(guān)閉管道文件。無(wú)名管道只是一個(gè)臨時(shí)文件,關(guān)閉后文件不復(fù)存在。 而有名管道的創(chuàng)建命令是: mknod(pathname,mode,dev) 由于有名管道這種文件有對(duì)應(yīng)的文件目錄項(xiàng),這種文件不顯式刪除就永久存在。所以創(chuàng)建有名管道文件同創(chuàng)建一個(gè)目錄文件、特別文件一樣。命令中pathname是路徑名,mode是文件的類(lèi)型和存取方式,

40、dev是文件所在設(shè)備。對(duì)于有名管道文件,dev這個(gè)參數(shù)為0。(2)(2)打開(kāi)有名管道打開(kāi)有名管道 使用有名管道前要顯式地打開(kāi),它與打開(kāi)普通文件沒(méi)有區(qū)別。只是發(fā)送者以寫(xiě)方式,接收方以只讀方式打開(kāi)。命令格式是: open(pathname,oflg)其中oflg是文件打開(kāi)時(shí)的存取方式。 進(jìn)程使用有名管道實(shí)現(xiàn)通信時(shí)需要有三次同步: 第一次是打開(kāi)同步。當(dāng)進(jìn)程以讀方式打開(kāi)有名管道時(shí),若已有寫(xiě)者打開(kāi)過(guò),則喚醒寫(xiě)者后繼續(xù)前進(jìn),否則等待寫(xiě)者。當(dāng)進(jìn)程以寫(xiě)方式打開(kāi)有名管道時(shí),若已有讀者打開(kāi)過(guò),則喚醒讀者后繼續(xù)前進(jìn),否則等待讀者。 第二次是讀寫(xiě)同步。其同步方式與無(wú)名管道pipe相同,允許寫(xiě)者超前讀者1024個(gè)字符,

41、當(dāng)有更多字符要寫(xiě)入時(shí),則寫(xiě)者必須等待。若讀者從有名管道讀時(shí),若無(wú)數(shù)據(jù)可讀則等待。若有數(shù)據(jù)可讀,讀完后要檢查有無(wú)寫(xiě)者等待,若有則喚醒寫(xiě)者。而且要求讀寫(xiě)雙方隨時(shí)檢查通信的另一方是否存在,一旦有一方不存在,應(yīng)立即終止通信。 第三次是關(guān)閉同步。當(dāng)寫(xiě)者關(guān)閉有名管道時(shí),發(fā)現(xiàn)有讀者睡眠等待,則喚醒它。被喚醒者立即從讀調(diào)用返回。當(dāng)讀者關(guān)閉有名管道時(shí),發(fā)現(xiàn)有寫(xiě)者睡眠等待,則喚醒它,并向它發(fā)一個(gè)指示錯(cuò)誤條件的信號(hào)后返回。最后一個(gè)關(guān)閉有名管道的進(jìn)程釋放該管道占用的全部盤(pán)塊及相應(yīng)的在主存中的i節(jié)點(diǎn)。 5.7.2 5.7.2 消息消息 UNIX系統(tǒng)V的消息機(jī)制類(lèi)似于信箱機(jī)制。進(jìn)程間通信通過(guò)消息隊(duì)列,它的消息隊(duì)列可以是單

42、隊(duì)列、多隊(duì)列(按消息類(lèi)型),單向和雙向通信通道。1.1.所用的數(shù)據(jù)結(jié)構(gòu)所用的數(shù)據(jù)結(jié)構(gòu)(1)(1)消息緩沖區(qū)消息緩沖區(qū) 其結(jié)構(gòu)定義如下:Struct msgbuf long mtype; .消息類(lèi)型,可以是正、負(fù)整數(shù)或0 char mtextN; .消息正文;(2)(2)消息頭結(jié)構(gòu)和消息頭表消息頭結(jié)構(gòu)和消息頭表 消息頭結(jié)構(gòu)對(duì)應(yīng)每一個(gè)消息緩沖區(qū)都有一個(gè)消息頭結(jié)構(gòu),其結(jié)構(gòu)如下:Struct msgmsg-next .消息隊(duì)列中指向下一個(gè)消息的指針long msg-type .消息類(lèi)型(與消息緩沖區(qū)的相同)Short msg-ts .消息正文長(zhǎng)度Short msg-spot .消息正文地址 消息頭結(jié)構(gòu)

43、表 由若干個(gè)消息頭結(jié)構(gòu)構(gòu)成的數(shù)組。系統(tǒng)初始化時(shí)已設(shè)置好,其表目數(shù)為100個(gè)(結(jié)構(gòu)定義從略)。(3)(3)消息隊(duì)列頭結(jié)構(gòu)和消息隊(duì)列頭表消息隊(duì)列頭結(jié)構(gòu)和消息隊(duì)列頭表 由于可以有多個(gè)消息隊(duì)列(按消息類(lèi)型),于是對(duì)應(yīng)每個(gè)消息隊(duì)列都有一個(gè)消息隊(duì)列頭結(jié)構(gòu),其中包括隊(duì)列的頭、尾指針;隊(duì)列訪(fǎng)問(wèn)的控制結(jié)構(gòu);隊(duì)列中消息個(gè)數(shù);正文總字節(jié)數(shù);最近一次發(fā)送、接收消息和修改時(shí)間和這些進(jìn)程Id等有關(guān)信息。消息隊(duì)列頭表則是由消息隊(duì)列頭構(gòu)成的數(shù)組。(4)消息緩沖池 系統(tǒng)對(duì)消息正文的管理是將所有消息正文存放在消息緩沖池中。消息緩沖池的結(jié)構(gòu)中包括緩沖池的大小和首地址兩項(xiàng)信息。 2.2.消息的系統(tǒng)調(diào)用:消息的系統(tǒng)調(diào)用:(1)建立一個(gè)

44、消息隊(duì)列。(2)向消息隊(duì)列發(fā)送消息。(3)從消息隊(duì)列接收消息。(4)取或送消息隊(duì)列的控制信息。5.7.35.7.3共享主存段共享主存段 UNIX的共享主存段機(jī)制為進(jìn)程提供了最快捷最有效的直接通信手段,是由通信進(jìn)程直接訪(fǎng)問(wèn)某些共享的虛擬存儲(chǔ)空間而實(shí)現(xiàn)通信。在系統(tǒng)V中,系統(tǒng)管理一組共享主存控制塊。通信進(jìn)程在使用共享主存段以前先提出申請(qǐng),系統(tǒng)分配給它并返回一個(gè)共享主存段標(biāo)識(shí)號(hào)。一個(gè)共享主存建立后被附加到進(jìn)程的虛擬地址空間,進(jìn)程可以附加多個(gè)共享主存段。1.1.使用的數(shù)據(jù)結(jié)構(gòu)使用的數(shù)據(jù)結(jié)構(gòu)(1)(1)共享主存段控制塊共享主存段控制塊( (又稱(chēng)共享主存段頭結(jié)構(gòu)又稱(chēng)共享主存段頭結(jié)構(gòu)):): 每個(gè)共享主存段都

45、有一個(gè)控制塊,包括如下信息: 共享主存段訪(fǎng)問(wèn)控制結(jié)構(gòu) 共享段長(zhǎng)度 共享段頁(yè)表始址 最后執(zhí)行該共享段操作的進(jìn)程id 創(chuàng)建該共享段的進(jìn)程id 當(dāng)前附加段號(hào)和主存中附加段號(hào) 最近一次附加操作、拆卸操作和修改時(shí)間 系統(tǒng)為便于管理,將共享主存段組成一個(gè)表,該表共有100個(gè)表目。(2)(2)共享主存段的數(shù)據(jù)結(jié)構(gòu)共享主存段的數(shù)據(jù)結(jié)構(gòu) 每個(gè)共享主存段都對(duì)應(yīng)一個(gè)頁(yè)表和允許的存取權(quán)限主存段,每個(gè)進(jìn)程最多允許有6個(gè)共享主存段,每個(gè)共享主存段有自己的頁(yè)表。2.2.共享主存段的系統(tǒng)調(diào)用共享主存段的系統(tǒng)調(diào)用(1)(1)申請(qǐng)一個(gè)共享主存段申請(qǐng)一個(gè)共享主存段 參數(shù)包括共享主存段大小。返回參數(shù)是共享主存段標(biāo)識(shí)號(hào)。(2)(2)將

46、共享段附加到申請(qǐng)通信的進(jìn)程地址空間將共享段附加到申請(qǐng)通信的進(jìn)程地址空間。(3)(3)將共享段與進(jìn)程之間解除連接。將共享段與進(jìn)程之間解除連接。 5.7.4 5.7.4 信號(hào)量信號(hào)量 UNIX系統(tǒng)V使用了本章中所討論的信號(hào)量的技術(shù),并且還作了很大擴(kuò)充。它允許對(duì)一組信號(hào)量進(jìn)行相同或不同的操作,而且每個(gè)Wait和Signal操作不限于增1和減1,而可以是增減任何整數(shù),使信號(hào)量機(jī)制更具有靈活性。1.1.使用的數(shù)據(jù)結(jié)構(gòu)使用的數(shù)據(jù)結(jié)構(gòu)(1)(1)信號(hào)量的數(shù)據(jù)結(jié)構(gòu)定義如下:信號(hào)量的數(shù)據(jù)結(jié)構(gòu)定義如下:Struct semushort semval; .信號(hào)量的值short sempid; .最近一次對(duì)信號(hào)量操作

47、的進(jìn)程idUshort semncnt; .等待信號(hào)量增加的進(jìn)程數(shù)Ushort semzcnt; .等待信號(hào)量值為0的進(jìn)程數(shù) (2)(2)信號(hào)量標(biāo)識(shí)的數(shù)據(jù)結(jié)構(gòu)和信號(hào)量標(biāo)識(shí)表信號(hào)量標(biāo)識(shí)的數(shù)據(jù)結(jié)構(gòu)和信號(hào)量標(biāo)識(shí)表 系統(tǒng)中每組信號(hào)量又稱(chēng)信號(hào)量集合,包含有一個(gè)或多個(gè)信號(hào)量。每個(gè)信號(hào)量集合都有一個(gè)信號(hào)量標(biāo)識(shí)的數(shù)據(jù)結(jié)構(gòu),定義如下:Structsemid_ds struct ipc_perm sem_perm.對(duì)信號(hào)量訪(fǎng)問(wèn)權(quán)限的結(jié)構(gòu) struct sem*sem_base;.指向一組中第一個(gè)信號(hào)量的指針 ushort sem_nsems; .一組中信號(hào)量個(gè)數(shù) time_t sero_otime; .最近一次對(duì)

48、信號(hào)量操作的時(shí)間 time_t sen_ctime; .最近一次信號(hào)量狀態(tài)的修改時(shí)間 信號(hào)量標(biāo)識(shí)表是每個(gè)信號(hào)量標(biāo)識(shí)所組成的數(shù)組,每個(gè)表目對(duì)應(yīng)一個(gè)信號(hào)量組。2.2.信號(hào)量機(jī)制的系統(tǒng)調(diào)用信號(hào)量機(jī)制的系統(tǒng)調(diào)用(1)(1)信號(hào)量集合的建立信號(hào)量集合的建立 任何進(jìn)程在使用信號(hào)量之前,通過(guò)以下命令申請(qǐng)建立一個(gè)信號(hào)量集合。 semget(key,nsems,semflg)。其中,key為用戶(hù)進(jìn)程指定的信號(hào)量集合的關(guān)鍵字,nsems為信號(hào)量集合中的信號(hào)量數(shù),semflg為訪(fǎng)問(wèn)標(biāo)志。 調(diào)用的返回值是信號(hào)量集合的標(biāo)識(shí)號(hào)。(2)(2)對(duì)信號(hào)量的操作對(duì)信號(hào)量的操作 進(jìn)程通過(guò)調(diào)用semop()對(duì)一組信號(hào)量中的一個(gè)或多個(gè)

49、信號(hào)量執(zhí)行Wait/Signal操作。其操作命令由用戶(hù)提供的信號(hào)量操作數(shù)組sembuf定義,該數(shù)組的每個(gè)元素的結(jié)構(gòu)如下:Struct sembuf Ushort sero_num;.信號(hào)量的序號(hào)。 short sem-op; .具體執(zhí)行的操作(即WaitSignal)。 short sero-flg; .訪(fǎng)問(wèn)標(biāo)志。 調(diào)用語(yǔ)法是: semop(semid,sops,nsops) 其中,semid為調(diào)用返回的信號(hào)量集合標(biāo)識(shí),sops為用戶(hù)提供的信號(hào)量操作數(shù)組sembuf的指針,nsops為數(shù)組sembuf中的元素?cái)?shù)。 在每一個(gè)操作中,實(shí)際的功能由sem_op的值所說(shuō)明,大致如下: 若sem_op的

50、值為正,則執(zhí)行Signal操作,將sem_op的值加到信號(hào)量值變量semval上,并喚醒等待該信號(hào)量值增加的所有進(jìn)程。 若sem_op為0。內(nèi)核檢查信號(hào)量值,若為0,則繼續(xù)表上其他操作。否則,增加等待信號(hào)量值為0的進(jìn)程數(shù),并把進(jìn)程掛起阻塞在等待信號(hào)量值為0的事件上。 若sem_op為負(fù),且它的絕對(duì)值小于或等于信號(hào)量值,則內(nèi)核把sem_op(是負(fù)數(shù))加到信號(hào)量值上。若結(jié)果為0,內(nèi)核喚醒等待信號(hào)量值為0的所有進(jìn)程。 若sem_op為負(fù),且它的絕對(duì)值大于信號(hào)量,則內(nèi)核把該進(jìn)程掛起在等待信號(hào)量增加的事件上。(3)(3)創(chuàng)建或修改恢復(fù)表創(chuàng)建或修改恢復(fù)表 恢復(fù)表是用在進(jìn)程終止時(shí)消除所有被它改變過(guò)的信號(hào)量的

51、值,以保證信號(hào)量的完整性。當(dāng)進(jìn)程創(chuàng)建信號(hào)量時(shí),內(nèi)核為其在恢復(fù)表中增加一個(gè)活動(dòng)項(xiàng)。進(jìn)程終止時(shí),系統(tǒng)將其創(chuàng)建的表從系統(tǒng)恢復(fù)表中刪除。(4)(4)對(duì)信號(hào)量執(zhí)行控制操作對(duì)信號(hào)量執(zhí)行控制操作 當(dāng)要讀取和修改信號(hào)量集合的有關(guān)狀態(tài)信息,或撤消信號(hào)量集合時(shí),調(diào)用semetl()命令。5.7.5 5.7.5 信號(hào)或軟中斷信號(hào)或軟中斷 UNIX系統(tǒng)V提供了信號(hào)處理機(jī)制,又叫做軟中斷。它是UNIX向進(jìn)程提供的又一種通信機(jī)制。利用它,進(jìn)程之間可以發(fā)送少量信息并進(jìn)行適當(dāng)處理。同組進(jìn)程之間可以互相發(fā)送信號(hào),而內(nèi)核也可以從內(nèi)部發(fā)信號(hào)給進(jìn)程。所謂軟中斷信號(hào)就是向某進(jìn)程proc中的p_sig變量送入一個(gè)019之間的整數(shù)。系統(tǒng)V

52、提供了19個(gè)軟中斷信號(hào)。軟中斷可分為以下五類(lèi): (1)(1)與終端操作有關(guān)的軟中斷,如掛斷、退出等。與終端操作有關(guān)的軟中斷,如掛斷、退出等。(2)(2)為進(jìn)程跟蹤而引入的軟中斷。為進(jìn)程跟蹤而引入的軟中斷。 (3)(3)錯(cuò)誤使用了系統(tǒng)調(diào)用或系統(tǒng)調(diào)用期間發(fā)生不可恢復(fù)的情況錯(cuò)誤使用了系統(tǒng)調(diào)用或系統(tǒng)調(diào)用期間發(fā)生不可恢復(fù)的情況( (如某些資源用完如某些資源用完) )。(4)(4)與進(jìn)程終止有關(guān)的軟中斷。與進(jìn)程終止有關(guān)的軟中斷。(5)(5)用戶(hù)態(tài)下進(jìn)程之間發(fā)的一些軟中斷。用戶(hù)態(tài)下進(jìn)程之間發(fā)的一些軟中斷。 系統(tǒng)規(guī)定0是沒(méi)有軟中斷發(fā)生,超過(guò)19的軟中斷號(hào),系統(tǒng)不予理睬。接收進(jìn)程收到軟中斷信號(hào)后,并不能立即響應(yīng)

53、(有可能進(jìn)程不在主存),而是等到接收進(jìn)程運(yùn)行時(shí)或從系統(tǒng)調(diào)用返回時(shí)才能響應(yīng)。 proc結(jié)構(gòu)中的p_sig是一個(gè)32位長(zhǎng),專(zhuān)門(mén)用來(lái)保存軟中斷信號(hào),它的第0位對(duì)應(yīng)1號(hào)軟中斷,第18位對(duì)應(yīng)19號(hào)軟中斷。某位是1,表示收到了相應(yīng)軟中斷信號(hào)。一個(gè)進(jìn)程有可能收到多個(gè)不同類(lèi)型軟中斷。內(nèi)核允許每次只處理一個(gè)軟中斷信號(hào)。較小的軟中斷信號(hào)被優(yōu)先處理,其他的軟中斷只有在進(jìn)程下次被調(diào)度運(yùn)行時(shí)才可能被處理。 5.8 Solaris5.8 Solaris線(xiàn)程同步原語(yǔ)線(xiàn)程同步原語(yǔ) Solaris提供四種線(xiàn)程同步原語(yǔ):(1)互斥鎖;(2)信號(hào)量;(3)讀寫(xiě)鎖;(4)條件變量。 Solaris在內(nèi)核為內(nèi)核線(xiàn)程和在線(xiàn)程庫(kù)為用戶(hù)線(xiàn)程

54、提供這四種同步機(jī)制的支持。這些機(jī)制基本上是基于硬件TS指令的。 1.1.互斥鎖互斥鎖 互斥鎖是為了線(xiàn)程的互斥訪(fǎng)問(wèn)的。與互斥有關(guān)的原語(yǔ)有: mutex_enter() .上鎖操作 mutex_exit() .開(kāi)鎖操作 mutex_tryenter() .忙等待的上鎖操作 上鎖操作原語(yǔ)執(zhí)行時(shí),如果已被其他線(xiàn)程先行上了鎖,那么后者有可能會(huì)被阻塞,但是否執(zhí)行阻塞取決于存放在互斥對(duì)象中的信息的類(lèi)型說(shuō)明,也有可能用忙等待形式。 開(kāi)鎖操作原語(yǔ)隱含有喚醒被阻塞的等待線(xiàn)程。 而忙等待的上鎖操作是提供一個(gè)非阻塞的互斥執(zhí)行的方法,使程序員可以為線(xiàn)程庫(kù)的用戶(hù)線(xiàn)程提供忙等待的上鎖方式,以免阻塞整個(gè)進(jìn)程。 2.2.信號(hào)量信號(hào)量 有以下同步原語(yǔ) Sema_p() .信號(hào)量值減1,隱含線(xiàn)程有可能被阻塞。 Sema_V() .信號(hào)量值增1,隱含喚醒等待線(xiàn)程。 Sema_tryp() .信號(hào)量值減1,但不使用阻塞,允許忙等待。3.3.讀寫(xiě)鎖讀寫(xiě)鎖 允許多個(gè)線(xiàn)程可以同時(shí)讀一個(gè)被鎖保護(hù)的對(duì)象,也允許一次只能一個(gè)線(xiàn)程對(duì)保護(hù)對(duì)象進(jìn)行寫(xiě)訪(fǎng)問(wèn)。當(dāng)保護(hù)對(duì)象處于寫(xiě)狀況時(shí)為“寫(xiě)鎖”狀態(tài),對(duì)象處于讀狀況時(shí)為“讀鎖”狀態(tài)。有以下同步原語(yǔ): rw_enter(); .讀者或?qū)懻咂髨D上

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論