計算機(jī)操作系統(tǒng)-進(jìn)程同步與通信.ppt_第1頁
計算機(jī)操作系統(tǒng)-進(jìn)程同步與通信.ppt_第2頁
計算機(jī)操作系統(tǒng)-進(jìn)程同步與通信.ppt_第3頁
計算機(jī)操作系統(tǒng)-進(jìn)程同步與通信.ppt_第4頁
計算機(jī)操作系統(tǒng)-進(jìn)程同步與通信.ppt_第5頁
已閱讀5頁,還剩74頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、計算機(jī)操作系統(tǒng)第三章 進(jìn)程同步與通信,計算機(jī)信息工程學(xué)院,主講教師 王帥強(qiáng) ,3.1 進(jìn)程互斥和同步,3.1.1 互斥算法 3.1.2 信號量(semaphore) 3.1.3 經(jīng)典進(jìn)程同步問題 3.1.4 管程(monitor),返回,在多道程序系統(tǒng)中,由于資源共享和進(jìn)程合作,使各進(jìn)程之間存在兩種類型的制約關(guān)系: (1)間接制約關(guān)系(互斥) (2)直接制約關(guān)系(同步) 進(jìn)程同步指多個相關(guān)進(jìn)程在執(zhí)行次序上的協(xié)調(diào),用于保證這種關(guān)系的 相應(yīng)機(jī)制稱為進(jìn)程同步機(jī)制 互斥指進(jìn)程之間競爭使用某種資源,進(jìn)程同步與互斥,3.1.1 互斥算法,3.1.1.1臨界資源 3.1.1.2臨界區(qū)的訪問過程 3.1.1.

2、3同步機(jī)制應(yīng)遵循的準(zhǔn)則 3.1.1.4進(jìn)程互斥的硬件方法,3.1.1.1臨界資源,進(jìn)程間資源訪問沖突 共享變量的修改沖突 操作順序沖突 進(jìn)程間的制約關(guān)系 間接制約:進(jìn)行競爭獨占分配到的部分或全部共享資源,“互斥” 直接制約:進(jìn)行協(xié)作等待來自其他進(jìn)程的信息,“同步”,硬件或軟件(如外設(shè)、共享代碼段、共享數(shù)據(jù)結(jié)構(gòu)),多個進(jìn)程在對其進(jìn)行訪問時(關(guān)鍵是進(jìn)行寫入或修改),必須互斥地進(jìn)行有些共享資源可以同時訪問,如只讀數(shù)據(jù),多道程序環(huán)境進(jìn)程之間存在資源共享,進(jìn)程的運(yùn)行時間受影響,舉例1:共享變量的修改沖突,舉例2:競爭條件Race Condition,count+ could be implemented

3、 as register1 = count register1 = register1 + 1 count = register1 count- could be implemented as register2 = count register2 = register2 - 1 count = register2,假定初始狀態(tài)下count = 5 S0: producer execute register1 = count register1 = 5S1: producer execute register1 = register1 + 1 register1 = 6 S2: consume

4、r execute register2 = count register2 = 5 S3: consumer execute register2 = register2 - 1 register2 = 4 S4: producer execute count = register1 count = 6 S5: consumer execute count = register2 count = 4,count- register2 = count register2 = register2 - 1 count = register2,count+ register1 = count regis

5、ter1 = register1 + 1 count = register1,假設(shè)有兩個進(jìn)程producer:做count+,進(jìn)程consumer做count 且兩個進(jìn)程并發(fā)執(zhí)行。,競爭條件race condition,多個進(jìn)程并發(fā)訪問和操作同一數(shù)據(jù)且執(zhí)行結(jié)果與特定訪問順序有關(guān),稱為競爭條件。 如何防止出現(xiàn)競爭條件? 同步,舉例3 操作順序沖突,有3個進(jìn)程:get, copy和put,它們對4個存儲區(qū)域f、s、t和g進(jìn)行操作。,有6種可能的操作順序,只有一種結(jié)果是正確的。,進(jìn)程的交互關(guān)系:可以按照相互感知的程度來分類,互斥,指多個進(jìn)程不能同時使用同一個資源; 死鎖,指多個進(jìn)程互不相讓,都得不到

6、足夠的資源; 饑餓,指一個進(jìn)程一直得不到資源(其他進(jìn)程可能輪流占用資源),3.1.1.2 臨界區(qū)的訪問過程,臨界區(qū),臨界區(qū)(critical section):進(jìn)程中訪問臨界資源的一段代碼。 進(jìn)入?yún)^(qū)(entry section):在進(jìn)入臨界區(qū)之前,檢查可否進(jìn)入臨界區(qū)的一段代碼。如果可以進(jìn)入臨界區(qū),通常設(shè)置相應(yīng)正在訪問臨界區(qū)標(biāo)志 退出區(qū)(exit section):用于將正在訪問臨界區(qū)標(biāo)志清除。 剩余區(qū)(remainder section):代碼中的其余部分。,臨界區(qū),3.1.1.3 同步機(jī)制應(yīng)遵循的準(zhǔn)則,空閑則入:其他進(jìn)程均不處于臨界區(qū); 忙則等待:已有進(jìn)程處于其臨界區(qū); 有限等待:等待進(jìn)入臨

7、界區(qū)的進(jìn)程不能死等; 讓權(quán)等待:不能進(jìn)入臨界區(qū)的進(jìn)程,應(yīng)釋放CPU(如轉(zhuǎn)換到阻塞狀態(tài)),3.1.1.4 進(jìn)程互斥的硬件方法,在許多機(jī)器中,都提供了專門的硬件指令Test and Set,它可以用做解決臨界區(qū)問題。,Test-and-Set指令,該指令讀出標(biāo)志后設(shè)置為TRUE boolean TS(var lock boolean):boolean begin ts:=lock; lock = TRUE; end lock表示資源的兩種狀態(tài):TRUE表示正被占用,F(xiàn)ALSE表示空閑,利用TS實現(xiàn)進(jìn)程互斥,利用TS實現(xiàn)進(jìn)程互斥:每個臨界資源設(shè)置一個公共布爾變量lock,初值為FALSE 在進(jìn)入?yún)^(qū)利

8、用TS進(jìn)行檢查:有進(jìn)程在臨界區(qū)時,重復(fù)檢查;直到其它進(jìn)程退出時,檢查通過;,While TS(Lock) Do skip;,Critical section;,Lock:=false;,Remainder section;,Until false,repeat,硬件方法的優(yōu)點 適用于任意數(shù)目的進(jìn)程,在單處理器或多處理器上 簡單,容易驗證其正確性 可以支持進(jìn)程內(nèi)存在多個臨界區(qū),只需為每個臨界區(qū)設(shè)立一個布爾變量 硬件方法的缺點 等待要耗費CPU時間,不能實現(xiàn)讓權(quán)等待 可能饑餓:從等待進(jìn)程中隨機(jī)選擇一個進(jìn)入臨界區(qū),有的進(jìn)程可能一直選不上 可能死鎖,3.1.1.4進(jìn)程互斥的硬件方法,3.1.2 信號量

9、(semaphore),3.1.2.1 信號量和P、V原語 3.1.2.2 信號量集,前面的互斥算法是平等進(jìn)程間的一種協(xié)商機(jī)制,OS可從進(jìn)程管理者的角度來處理互斥的問題,信號量就是OS提供的管理公有資源的有效手段。 信號量代表可用資源實體的數(shù)量。,3.1.2.1 信號量和P、V原語,1965年,由荷蘭學(xué)者Dijkstra提出是一種卓有成效的進(jìn)程同步機(jī)制。 每個信號量 s 除一個整數(shù)值s.value(計數(shù))外,還有一個進(jìn)程等待隊列 s.queue,其中是阻塞在該信號量的各個進(jìn)程的標(biāo)識 信號量只能通過初始化和兩個標(biāo)準(zhǔn)的原語來訪問作為OS核心代碼執(zhí)行,不受進(jìn)程調(diào)度的打斷 初始化指定一個非負(fù)整數(shù)值,表

10、示空閑資源總數(shù)(又稱為資源信號量)若為非負(fù)值表示當(dāng)前的空閑資源數(shù),若為負(fù)值其絕對值表示當(dāng)前等待臨界區(qū)的進(jìn)程數(shù),信號量數(shù)據(jù)結(jié)構(gòu)的定義,Type semaphore=record value:integer; L:list of process; end (類pascal語言) 或 typedef struct int value; struct process *; semaphore; (語言),1. P原語wait(s),Procedure wait(s) var s:semaphore; begin s.value:=s.value -1;/表示申請一個資源; if (s.value 0)

11、then/表示沒有空閑資源; begin 調(diào)用進(jìn)程進(jìn)入等待隊列s.; 阻塞調(diào)用進(jìn)程; end; end,2. V原語signal(s),Procedure signal(s) var s:semaphore; begin s.value:=s.value+1;/表示釋放一個資源; if (s.value = 0)/表示有進(jìn)程處于阻塞狀態(tài); begin 從等待隊列s.中取出一個進(jìn)程P; 進(jìn)程P進(jìn)入就緒隊列; end; end,V原語通常喚醒進(jìn)程等待隊列中的頭一個進(jìn)程。,3. 利用信號量實現(xiàn)互斥,為臨界資源設(shè)置一個互斥信號量mutex(MUTual Exclusion),其初值為1;在每個進(jìn)程中將

12、臨界區(qū)代碼置于P(mutex)和V(mutex)原語之間 必須成對使用P和V原語:遺漏P原語則不能保證互斥訪問,遺漏V原語則不能在使用臨界資源之后將其釋放(給其他等待的進(jìn)程);P、V原語不能次序錯誤、重復(fù)或遺漏,4. 利用信號量來描述前趨關(guān)系,前趨關(guān)系:并發(fā)執(zhí)行的進(jìn)程P1和P2中,分別有代碼C1和C2,要求C1在C2開始前完成; 為每個前趨關(guān)系設(shè)置一個互斥信號量S12,其初值為0,3.1.2.2 信號量集,基本思想:在一個原語中,將一段代碼同時需要的多個臨界資源,要么全部分配給它,要么一個都不分配。稱為Swait(Simultaneous Wait)。在Swait時,各個信號量的次序并不重要,

13、雖然會影響進(jìn)程歸入哪個阻塞隊列,但是由于是對資源全部分配或不分配,所以總有進(jìn)程獲得全部資源并在推進(jìn)之后釋放資源,因此不會死鎖。,1. AND型信號量集,信號量集用于同時需要多個資源時的信號量操作; AND型信號量集用于同時需要多種資源且每種占用一個時的信號量操作;,Swait(S1, S2, , Sn)/P原語; if (S1 =1 and S2 = 1 and and Sn = 1) /滿足資源要求時的處理; for i = 1 to n do Si= Si -1; /注:與wait的處理不同,這里是在確信可滿足 /資源要求時,才進(jìn)行減1操作; endfor; else /某些資源不夠時的處

14、理; 調(diào)用進(jìn)程進(jìn)入第一個小于1信號量的等待隊列Sj.; 阻塞調(diào)用進(jìn)程; endif,Ssignal(S1, S2, , Sn) for i = 1 to n do Si:= Si +1;/釋放占用的資源; for (each process P waiting in Si.) /檢查每種資源的等待隊列的所有進(jìn)程; 從等待隊列Si.中取出進(jìn)程P; if (判斷進(jìn)程P是否通過Swait中的測試) /注:與signal不同,這里要進(jìn)行重新判斷; begin/通過檢查(資源夠用)時的處理; 進(jìn)程P進(jìn)入就緒隊列; end else /未通過檢查(資源不夠用)時的處理; 進(jìn)程P進(jìn)入某等待隊列; endif

15、 endfor endfor,2. 一般“信號量集”,一次需要N個某類臨界資源時,就要進(jìn)行N次wait操作低效又可能死鎖 基本思想:在AND型信號量集的基礎(chǔ)上進(jìn)行擴(kuò)充:進(jìn)程對信號量Si的測試值為ti(用于信號量的判斷,即Si = ti,表示資源數(shù)量低于ti時,便不予分配),占用值為di(用于信號量的增減,即Si = Si - di和Si = Si + di) Swait(S1, t1, d1; .; Sn, tn, dn); Ssignal(S1, d1; .; Sn, dn);,一般信號量集用于同時需要多種資源、每種占用的數(shù)目不同、且可分配的資源還存在一個臨界值時的處理;,Swait(S1,

16、 t1, d1; .; Sn, tn, dn); /P原語; if (S1 =t1 and .Sn=tn) then /滿足資源要求時的處理; for i = 1 to n do Si= Si -di; endfor; else /某些資源不夠時的處理; 調(diào)用進(jìn)程進(jìn)入第一個小于tj信號量的等待隊列Sj.queue; 阻塞調(diào)用進(jìn)程; endif,Ssignal(S1, d1; .; Sn, dn); for i = 1 to n do Si:= Si +di;/釋放占用的資源; for (each process P waiting in Si.queue) /檢查每種資源的等待隊列的所有進(jìn)程;

17、 從等待隊列Si.L中取出進(jìn)程P; if (判斷進(jìn)程P是否通過Swait中的測試) /注:與signal不同,這里要進(jìn)行重新判斷; begin/通過檢查(資源夠用)時的處理; 進(jìn)程P進(jìn)入就緒隊列; end else /未通過檢查(資源不夠用)時的處理; 進(jìn)程P進(jìn)入某等待隊列; endif endfor endfor,3.1.3 經(jīng)典進(jìn)程同步問題,1. 生產(chǎn)者消費者問題(the producer-consumer problem),問題描述:若干進(jìn)程通過有限的共享緩沖區(qū)交換數(shù)據(jù)。其中,生產(chǎn)者進(jìn)程不斷寫入,而消費者進(jìn)程不斷讀出;共享緩沖區(qū)共有N個;任何時刻只能有一個進(jìn)程可對共享緩沖區(qū)進(jìn)行操作。,定

18、義信號量: full是 滿緩沖區(qū)數(shù)目,初值為0,empty是空緩沖區(qū)數(shù)目,初值為N。實際上,full和empty是同一個含義:full + empty = N mutex用于訪問緩沖區(qū)時的互斥,初值是1,生產(chǎn)者消費者問題,采用AND信號量集:Swait(empty, mutex), Ssignal(full, mutex), ,生產(chǎn)者消費者問題,讀者寫者問題,問題描述:對共享資源的讀寫操作,任一時刻“寫者”最多只允許一個,而“讀者”則允許多個 “讀寫”互斥, “寫寫”互斥, 讀讀允許,Wmutex表示允許寫,初值是1。 公共變量Rcount表示“正在讀”的進(jìn)程數(shù),初值是0; Rmutex表示對

19、Rcount的互斥操作,初值是1。,讀者寫者問題,P(Rmutex); +Rcount; if (Rcount = 1) P(Wmutex); V(Rmutex); read; P(Rmutex); -Rcount; if (Rcount = 0) V(Wmutex); V(Rmutex);,Reader:,P(Wmutex); write; V(Wmutex);,Writer:,采用一般信號量集機(jī)制:問題增加一個限制條件:同時讀的讀者最多R個 Wmutex表示允許寫,初值是1 Rcount表示允許讀者數(shù)目,初值為R,讀者寫者問題,3. 哲學(xué)家進(jìn)餐問題,問題描述:(由Dijkstra首先提出并

20、解決)5個哲學(xué)家圍繞一張圓桌而坐,桌子上放著5支筷子,每兩個哲學(xué)家之間放一支;哲學(xué)家的動作包括思考和進(jìn)餐,進(jìn)餐時需要同時拿起他左邊和右邊的兩支筷子,思考時則同時將兩支筷子放回原處。如何保證哲學(xué)家們的動作有序進(jìn)行?如:不出現(xiàn)相鄰者同時要求進(jìn)餐;不出現(xiàn)有人永遠(yuǎn)拿不到筷子;,筷子是臨界資源,可以用信號量表示 var chopstic:array0,1,2,3,4 of semaphore; 初始化為1 repeat wait(chopstici); wait(chopstic (i +1) mod 5 ); . . Eat; signal(chopstici); signal(chopstic (i

21、 +1) mod 5 ); . Think; until false;,3. 哲學(xué)家進(jìn)餐問題,采用一般信號量集機(jī)制:,Repeat think; swait(chopstic( i +1) mod 5,chopstici); eat; signal(chopstic( i +1) mod 5,chopstici); until false;,3.1.4 管程(monitor),用信號量可實現(xiàn)進(jìn)程間的同步,但由于信號量的控制分布在整個程序中,其正確性分析很困難。管程是管理進(jìn)程間同步的機(jī)制,它保證進(jìn)程互斥地訪問共享變量,并方便地阻塞和喚醒進(jìn)程。管程可以函數(shù)庫的形式實現(xiàn)。相比之下,管程比信號量好控制

22、。,1. 信號量同步的缺點,同步操作分散:信號量機(jī)制中,同步操作分散在各個進(jìn)程中,使用不當(dāng)就可能導(dǎo)致各進(jìn)程死鎖(如P、V操作的次序錯誤、重復(fù)或遺漏) 易讀性差:要了解對于一組共享變量及信號量的操作是否正確,必須通讀整個系統(tǒng)或者并發(fā)程序; 不利于修改和維護(hù):各模塊的獨立性差,任一組變量或一段代碼的修改都可能影響全局; 正確性難以保證:操作系統(tǒng)或并發(fā)程序通常很大,很難保證這樣一個復(fù)雜的系統(tǒng)沒有邏輯錯誤;,2. 管程的引入,1973年,Hoare和Hanson所提出;其基本思想是把信號量及其操作原語封裝在一個對象內(nèi)部。即:將共享變量以及對共享變量能夠進(jìn)行的所有操作集中在一個模塊中。 管程的定義:管程

23、是關(guān)于共享資源的數(shù)據(jù)結(jié)構(gòu)及一組針對該資源的操作過程所構(gòu)成的軟件模塊,這些過程能同步進(jìn)程和改變管程中的數(shù)據(jù)。 管程可增強(qiáng)模塊的獨立性:系統(tǒng)按資源管理的觀點分解成若干模塊,用數(shù)據(jù)表示抽象系統(tǒng)資源,同時分析了共享資源和專用資源在管理上的差別,按不同的管理方式定義模塊的類型和結(jié)構(gòu),使同步操作相對集中,從而增加了模塊的相對獨立性 引入管程可提高代碼的可讀性,便于修改和維護(hù),正確性易于保證:采用集中式同步機(jī)制。一個操作系統(tǒng)或并發(fā)程序由若干個這樣的模塊所構(gòu)成,一個模塊通常較短,模塊之間關(guān)系清晰。,管程由三部分組成: (1)局部于管程的共享變量說明 (2)對該數(shù)據(jù)結(jié)構(gòu)進(jìn)行操作的一組過程 (3)對局部于管程的數(shù)

24、據(jù)設(shè)置初始值的語句。,3. 管程的主要特性,模塊化:一個管程是一個基本程序單位,可以單獨編譯; 抽象數(shù)據(jù)類型:管程是一種特殊的數(shù)據(jù)類型,其中不僅有數(shù)據(jù),而且有對數(shù)據(jù)進(jìn)行操作的代碼 信息封裝:管程是半透明的,管程中的外部過程(函數(shù))實現(xiàn)了某些功能,至于這些功能是怎樣實現(xiàn)的,在其外部則是不可見的;,4. 管程的實現(xiàn)要素,管程中的共享變量在管程外部是不可見的,外部只能通過調(diào)用管程中所說明的外部過程(函數(shù))來間接地訪問管程中的共享變量; 為了保證管程共享變量的數(shù)據(jù)完整性,規(guī)定管程互斥進(jìn)入; 管程通常是用來管理資源的,因而在管程中應(yīng)當(dāng)設(shè)有進(jìn)程等待隊列以及相應(yīng)的等待及喚醒操作;,5. 管程中的多個進(jìn)程進(jìn)入

25、,當(dāng)一個進(jìn)入管程的進(jìn)程執(zhí)行等待操作時,它應(yīng)當(dāng)釋放管程的互斥權(quán);當(dāng)一個進(jìn)入管程的進(jìn)程執(zhí)行喚醒操作時(如喚醒),管程中便存在兩個同時處于活動狀態(tài)的進(jìn)程。 管程中的喚醒切換方法: P等待Q繼續(xù),直到Q等待或退出; Q等待P繼續(xù),直到P等待或退出; 規(guī)定喚醒為管程中最后一個可執(zhí)行的操作;,入口等待隊列:因為管程是互斥進(jìn)入的,所以當(dāng)一個進(jìn)程試圖進(jìn)入一個巳被占用的管程時它應(yīng)當(dāng)在管程的入口處等待,因而在管程的入口處應(yīng)當(dāng)有一個進(jìn)程等待隊列,稱作入口等待隊列。 緊急等待隊列:如果進(jìn)程喚醒進(jìn)程,則等待繼續(xù),如果進(jìn)程在執(zhí)行又喚醒進(jìn)程,則等待繼續(xù),.,如此,在管程內(nèi)部,由于執(zhí)行喚醒操作,可能會出現(xiàn)多個等待進(jìn)程(已被喚

26、醒,但由于管程的互斥進(jìn)入而等待),因而還需要有一個進(jìn)程等待隊列,這個等待隊列被稱為緊急等待隊列。它的優(yōu)先級應(yīng)當(dāng)高于入口等待隊列的優(yōu)先級。,5. 管程中的多個進(jìn)程進(jìn)入,6. 條件變量(condition),由于管程通常是用于管理資源的,因而在管程內(nèi)部,應(yīng)當(dāng)存在某種等待機(jī)制。當(dāng)進(jìn)入管程的進(jìn)程因資源被占用等原因不能繼續(xù)運(yùn)行時使其等待。為此在管程內(nèi)部可以說明和使用一種特殊類型的變量-條件變量。每個表示一種等待原因,并不取具體數(shù)值相當(dāng)于每個原因?qū)?yīng)一個隊列。,7. 管程的格式,TYPE monitor_name = MONITOR; 共享變量說明 define 本管程內(nèi)所定義、本管程外可調(diào)用的過程(函數(shù)

27、)名字表 use 本管程外所定義、本管程內(nèi)將調(diào)用的過程(函數(shù))名字表 PROCEDURE 過程名(形參表); 過程局部變量說明; BEGIN 語句序列; END; .,FUNCTION 函數(shù)名(形參表):值類型; 函數(shù)局部變量說明; BEGIN 語句序列; END; . BEGIN 共享變量初始化語句序列; END;,8. 管程的的組成,名稱:為每個共享資源設(shè)立一個管程 數(shù)據(jù)結(jié)構(gòu)說明:一組局部于管程的控制變量 操作原語:對控制變量和臨界資源進(jìn)行操作的一組原語過程(程序代碼),是訪問該管程的唯一途徑。這些原語本身是互斥的,任一時刻只允許一個進(jìn)程去調(diào)用,其余需要訪問的進(jìn)程就等待。 初始化代碼:對控

28、制變量進(jìn)行初始化的代碼,9. 例子:生產(chǎn)者-消費者問題,建立一個管程,命名為PC,其中包括兩個過程 (1)put(item) 生產(chǎn)者利用該過程,將自己生產(chǎn)的消息放到緩沖池中, 并用整型變量count來表示在緩沖池中已有的消息數(shù),當(dāng) count=n時,表示緩沖池已滿,生產(chǎn)者需等待。 (2)get(item) 消費者利用該過程從緩沖池中取出一個消息,當(dāng)count=0 時,表示緩沖池中無可用消息,消費者需等待。,type produce-consumer=monitor var in,out,count:integer; buffer:array0,n-1 of item; notfull, not

29、empty : condition; procedure entry put(item) begin if count=n then notfull.wait; buffer(in):=nextp; in:=(in+1) mod n; count:=count+1; if notempty.queue then notempty.signal; end,PC管程的描述:,Procedure entry get(item) begin if count=0 then notempty.wait; nextc:=buffer(out) out:=(out+1) mod n; count:=coun

30、t -1; if notfull.queue then notfull.signal; end begin in:=out:=0; count:=0; end,其中的生產(chǎn)者和消費者描述為: producer : begin repeat produce an item in nextp; pc.put(item); until false; end consumer : begin repeat pc.get(item); consume the item in nextc; until false; end,10. 管程和進(jìn)程的異同點,設(shè)置進(jìn)程和管程的目的不同 系統(tǒng)管理數(shù)據(jù)結(jié)構(gòu) 進(jìn)程:PCB

31、 管程:等待隊列 管程被進(jìn)程調(diào)用 管程是操作系統(tǒng)的固有成分,無創(chuàng)建和撤消,進(jìn)程間通信示意圖,communication?,inter-process communication,machine,process A,process B,3.2.1 進(jìn)程間通信的類型,低級通信:只能傳遞狀態(tài)和整數(shù)值(控制信息),包括進(jìn)程互斥和同步所采用的信號量和管程機(jī)制。 優(yōu)點:速度快 缺點: 傳送信息量?。盒实?,每次通信傳遞的信息量固定,若傳遞較多信息則需要進(jìn)行多次通信。 編程復(fù)雜:用戶直接實現(xiàn)通信的細(xì)節(jié),編程復(fù)雜,容易出錯。 高級通信:能夠傳送任意數(shù)量的數(shù)據(jù),包括三類:共享存儲區(qū)、管道、消息。,1. 低級通信

32、和高級通信,2. 直接通信和間接通信,直接通信:信息直接傳遞給接收方,如管道。 在發(fā)送時,指定接收方的地址或標(biāo)識,也可以指定多個接收方或廣播式地址; 在接收時,允許接收來自任意發(fā)送方的消息,并在讀出消息的同時獲取發(fā)送方的地址。 間接通信:借助于收發(fā)雙方進(jìn)程之外的共享數(shù)據(jù)結(jié)構(gòu)作為通信中轉(zhuǎn),如消息隊列。通常收方和發(fā)方的數(shù)目可以是任意的。,3. 高級通信機(jī)制,共享存儲器系統(tǒng) 消息傳遞系統(tǒng) 管道通信 基于socket的通信,3.2.2 共享存儲區(qū)系統(tǒng),相互通信的進(jìn)程共享某些數(shù)據(jù)結(jié)構(gòu)或共享存儲區(qū),進(jìn)程之間通過它們進(jìn)行通信。,1. 基于共享數(shù)據(jù)結(jié)構(gòu)的通信方式 如生產(chǎn)者和消費者問題,屬于低級通信 。,2.基

33、于共享存儲區(qū)的通信方式 為傳輸大量數(shù)據(jù),在內(nèi)存中劃出一塊共享存儲區(qū),諸進(jìn)程可通過對共享存儲區(qū)的數(shù)據(jù)進(jìn)行讀和寫進(jìn)行通信。,共享內(nèi)存 Shared Memory,共享內(nèi)存是進(jìn)程間最有效也是最快的通信方式。 共享內(nèi)存是內(nèi)存塊方式的數(shù)據(jù)塊,其數(shù)據(jù)長度可為系統(tǒng)參數(shù)限制內(nèi)的任意長度。 多個進(jìn)程可將同一物理內(nèi)存映射到自己的地址空間。 共享內(nèi)存處理函數(shù): 創(chuàng)建一個共享段: shmget( key, size, flags ) 把共享內(nèi)存鏈接到調(diào)用進(jìn)程的數(shù)據(jù)段中: shmat( shmid, *shmaddr, flags ) 分離一個共享段: shmdt( *shmaddr ) 對共享段的各種控制操作: sh

34、mctl( ),Shared Memory Example,#include #include #include #include #define SHMSZ 27 main() int shmid; key_t key; char c, *shm, *s; key = 5678; /* selected key */ /* Create the segment.*/ if (shmid = shmget(key,SHMSZ,IPC_CREAT | 0666) 0) perror(shmget); exit(1); /* Now we attach the segment to our dat

35、a space.*/ if (shm = shmat(shmid, NULL, 0) = (char *) -1) perror(shmat); exit(1); /* put some things into the memory */ for (s = shm, c = a; c = z; c+) *s+ = c; *s = NULL; /* wait until first character is changed to * */ while (*shm != *) sleep(1); exit(0); ,#include #include #include #include #defi

36、ne SHMSZ 27 main() int shmid; key_t key; char *shm, *s; key = 5678; /* selected key by server */ /* Locate the segment. */ if (shmid = shmget(key,SHMSZ,0666) 0) perror(shmget); exit(1); /* Now we attach the segment to our data space. */ if (shm = shmat(shmid, NULL, 0) = (char *) -1) perror(shmat); e

37、xit(1); /* read what the server put in the memory. */ for (s = shm; *s != NULL; s+) putchar(*s); putchar(n); /* change the first character in segment to * */ *shm = *; exit(0); ,3.2.3 消息傳遞系統(tǒng),進(jìn)程間的數(shù)據(jù)交換以消息(message)為單位,在計算機(jī)網(wǎng)絡(luò)中, message又稱為報文。 系統(tǒng)提供了一組通信原語來實現(xiàn)通信.,發(fā)送原語的定義:send(p,message) 發(fā)送消息到進(jìn)程P,接收原語的定義:rec

38、eive(Q,message)接收來自進(jìn)程Q的消息,(1) 直接通信方式 發(fā)送進(jìn)程直接將消息發(fā)送給接收進(jìn)程,并把它掛在接收進(jìn)程的消息緩沖隊列上, 接收進(jìn)程從它的消息緩沖隊列上取得消息。,消息傳遞系統(tǒng),(2)間接通信方式 消息通過郵箱或端口來發(fā)送和接收。郵箱可以被抽象為一個對象,進(jìn)程可以向其中存放消息也可以從中刪除消息。,每個郵箱要有一個唯一的標(biāo)識符。一個進(jìn)程可以通過不同的郵箱和其它進(jìn)程通信。 信箱通信原語:信箱的創(chuàng)建和撤銷、信息的發(fā)送和接收,例如:若兩個進(jìn)程共享一個郵箱,發(fā)送原語和接收原語分別是: send(A,message) :發(fā)送一個消息到郵箱A Receive(A,message):接

39、收來自信箱A的消息。,舉例1:消息緩沖隊列通信機(jī)制,廣泛應(yīng)用于本地進(jìn)程之間的通信中。 數(shù)據(jù)結(jié)構(gòu) 1. 消息緩沖區(qū) TYPE message buffer = record sender : 發(fā)送者進(jìn)程標(biāo)志符 size : 消息長度 text : 消息正文 next : 指向下一個消息緩沖區(qū)的指針 end,2. PCB 中有關(guān)通信的數(shù)據(jù)項 type processcontrol block =record . . mq : 消息隊列隊首指針 mutex : 消息隊列互斥信號量 sm : 消息隊列資源信號量 . . end,舉例1:消息緩沖隊列通信機(jī)制,procedure send(receiver ,a) a為發(fā)送進(jìn)程在自己的內(nèi)存空間設(shè)置的發(fā)送區(qū)。 begin getbuf(a.size, i ); 申請緩沖區(qū)i i.sender :=a.sender ; i.text:=a.text; i.next:=0; getid(PCB set, receiver , j) wait(j.mutex) insert(j.mq, i );

溫馨提示

  • 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論