![計算機操作系統(tǒng)-進程同步與通信.ppt_第1頁](http://file1.renrendoc.com/fileroot2/2020-1/16/1646d8fc-4cbc-466f-9609-5e247ecf8581/1646d8fc-4cbc-466f-9609-5e247ecf85811.gif)
![計算機操作系統(tǒng)-進程同步與通信.ppt_第2頁](http://file1.renrendoc.com/fileroot2/2020-1/16/1646d8fc-4cbc-466f-9609-5e247ecf8581/1646d8fc-4cbc-466f-9609-5e247ecf85812.gif)
![計算機操作系統(tǒng)-進程同步與通信.ppt_第3頁](http://file1.renrendoc.com/fileroot2/2020-1/16/1646d8fc-4cbc-466f-9609-5e247ecf8581/1646d8fc-4cbc-466f-9609-5e247ecf85813.gif)
![計算機操作系統(tǒng)-進程同步與通信.ppt_第4頁](http://file1.renrendoc.com/fileroot2/2020-1/16/1646d8fc-4cbc-466f-9609-5e247ecf8581/1646d8fc-4cbc-466f-9609-5e247ecf85814.gif)
![計算機操作系統(tǒng)-進程同步與通信.ppt_第5頁](http://file1.renrendoc.com/fileroot2/2020-1/16/1646d8fc-4cbc-466f-9609-5e247ecf8581/1646d8fc-4cbc-466f-9609-5e247ecf85815.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、計算機操作系統(tǒng)第三章 進程同步與通信,計算機信息工程學院,主講教師 王帥強 ,3.1 進程互斥和同步,3.1.1 互斥算法 3.1.2 信號量(semaphore) 3.1.3 經(jīng)典進程同步問題 3.1.4 管程(monitor),返回,在多道程序系統(tǒng)中,由于資源共享和進程合作,使各進程之間存在兩種類型的制約關系: (1)間接制約關系(互斥) (2)直接制約關系(同步) 進程同步指多個相關進程在執(zhí)行次序上的協(xié)調,用于保證這種關系的 相應機制稱為進程同步機制 互斥指進程之間競爭使用某種資源,進程同步與互斥,3.1.1 互斥算法,3.1.1.1臨界資源 3.1.1.2臨界區(qū)的訪問過程 3.1.1.
2、3同步機制應遵循的準則 3.1.1.4進程互斥的硬件方法,3.1.1.1臨界資源,進程間資源訪問沖突 共享變量的修改沖突 操作順序沖突 進程間的制約關系 間接制約:進行競爭獨占分配到的部分或全部共享資源,“互斥” 直接制約:進行協(xié)作等待來自其他進程的信息,“同步”,硬件或軟件(如外設、共享代碼段、共享數(shù)據(jù)結構),多個進程在對其進行訪問時(關鍵是進行寫入或修改),必須互斥地進行有些共享資源可以同時訪問,如只讀數(shù)據(jù),多道程序環(huá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,假設有兩個進程producer:做count+,進程consumer做count 且兩個進程并發(fā)執(zhí)行。,競爭條件race condition,多個進程并發(fā)訪問和操作同一數(shù)據(jù)且執(zhí)行結果與特定訪問順序有關,稱為競爭條件。 如何防止出現(xiàn)競爭條件? 同步,舉例3 操作順序沖突,有3個進程:get, copy和put,它們對4個存儲區(qū)域f、s、t和g進行操作。,有6種可能的操作順序,只有一種結果是正確的。,進程的交互關系:可以按照相互感知的程度來分類,互斥,指多個進程不能同時使用同一個資源; 死鎖,指多個進程互不相讓,都得不到
6、足夠的資源; 饑餓,指一個進程一直得不到資源(其他進程可能輪流占用資源),3.1.1.2 臨界區(qū)的訪問過程,臨界區(qū),臨界區(qū)(critical section):進程中訪問臨界資源的一段代碼。 進入?yún)^(qū)(entry section):在進入臨界區(qū)之前,檢查可否進入臨界區(qū)的一段代碼。如果可以進入臨界區(qū),通常設置相應正在訪問臨界區(qū)標志 退出區(qū)(exit section):用于將正在訪問臨界區(qū)標志清除。 剩余區(qū)(remainder section):代碼中的其余部分。,臨界區(qū),3.1.1.3 同步機制應遵循的準則,空閑則入:其他進程均不處于臨界區(qū); 忙則等待:已有進程處于其臨界區(qū); 有限等待:等待進入臨
7、界區(qū)的進程不能死等; 讓權等待:不能進入臨界區(qū)的進程,應釋放CPU(如轉換到阻塞狀態(tài)),3.1.1.4 進程互斥的硬件方法,在許多機器中,都提供了專門的硬件指令Test and Set,它可以用做解決臨界區(qū)問題。,Test-and-Set指令,該指令讀出標志后設置為TRUE boolean TS(var lock boolean):boolean begin ts:=lock; lock = TRUE; end lock表示資源的兩種狀態(tài):TRUE表示正被占用,F(xiàn)ALSE表示空閑,利用TS實現(xiàn)進程互斥,利用TS實現(xiàn)進程互斥:每個臨界資源設置一個公共布爾變量lock,初值為FALSE 在進入?yún)^(qū)利
8、用TS進行檢查:有進程在臨界區(qū)時,重復檢查;直到其它進程退出時,檢查通過;,While TS(Lock) Do skip;,Critical section;,Lock:=false;,Remainder section;,Until false,repeat,硬件方法的優(yōu)點 適用于任意數(shù)目的進程,在單處理器或多處理器上 簡單,容易驗證其正確性 可以支持進程內(nèi)存在多個臨界區(qū),只需為每個臨界區(qū)設立一個布爾變量 硬件方法的缺點 等待要耗費CPU時間,不能實現(xiàn)讓權等待 可能饑餓:從等待進程中隨機選擇一個進入臨界區(qū),有的進程可能一直選不上 可能死鎖,3.1.1.4進程互斥的硬件方法,3.1.2 信號量
9、(semaphore),3.1.2.1 信號量和P、V原語 3.1.2.2 信號量集,前面的互斥算法是平等進程間的一種協(xié)商機制,OS可從進程管理者的角度來處理互斥的問題,信號量就是OS提供的管理公有資源的有效手段。 信號量代表可用資源實體的數(shù)量。,3.1.2.1 信號量和P、V原語,1965年,由荷蘭學者Dijkstra提出是一種卓有成效的進程同步機制。 每個信號量 s 除一個整數(shù)值s.value(計數(shù))外,還有一個進程等待隊列 s.queue,其中是阻塞在該信號量的各個進程的標識 信號量只能通過初始化和兩個標準的原語來訪問作為OS核心代碼執(zhí)行,不受進程調度的打斷 初始化指定一個非負整數(shù)值,表
10、示空閑資源總數(shù)(又稱為資源信號量)若為非負值表示當前的空閑資源數(shù),若為負值其絕對值表示當前等待臨界區(qū)的進程數(shù),信號量數(shù)據(jù)結構的定義,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 調用進程進入等待隊列s.; 阻塞調用進程; end; end,2. V原語signal(s),Procedure signal(s) var s:semaphore; begin s.value:=s.value+1;/表示釋放一個資源; if (s.value = 0)/表示有進程處于阻塞狀態(tài); begin 從等待隊列s.中取出一個進程P; 進程P進入就緒隊列; end; end,V原語通常喚醒進程等待隊列中的頭一個進程。,3. 利用信號量實現(xiàn)互斥,為臨界資源設置一個互斥信號量mutex(MUTual Exclusion),其初值為1;在每個進程中將
12、臨界區(qū)代碼置于P(mutex)和V(mutex)原語之間 必須成對使用P和V原語:遺漏P原語則不能保證互斥訪問,遺漏V原語則不能在使用臨界資源之后將其釋放(給其他等待的進程);P、V原語不能次序錯誤、重復或遺漏,4. 利用信號量來描述前趨關系,前趨關系:并發(fā)執(zhí)行的進程P1和P2中,分別有代碼C1和C2,要求C1在C2開始前完成; 為每個前趨關系設置一個互斥信號量S12,其初值為0,3.1.2.2 信號量集,基本思想:在一個原語中,將一段代碼同時需要的多個臨界資源,要么全部分配給它,要么一個都不分配。稱為Swait(Simultaneous Wait)。在Swait時,各個信號量的次序并不重要,
13、雖然會影響進程歸入哪個阻塞隊列,但是由于是對資源全部分配或不分配,所以總有進程獲得全部資源并在推進之后釋放資源,因此不會死鎖。,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的處理不同,這里是在確信可滿足 /資源要求時,才進行減1操作; endfor; else /某些資源不夠時的處
14、理; 調用進程進入第一個小于1信號量的等待隊列Sj.; 阻塞調用進程; endif,Ssignal(S1, S2, , Sn) for i = 1 to n do Si:= Si +1;/釋放占用的資源; for (each process P waiting in Si.) /檢查每種資源的等待隊列的所有進程; 從等待隊列Si.中取出進程P; if (判斷進程P是否通過Swait中的測試) /注:與signal不同,這里要進行重新判斷; begin/通過檢查(資源夠用)時的處理; 進程P進入就緒隊列; end else /未通過檢查(資源不夠用)時的處理; 進程P進入某等待隊列; endif
15、 endfor endfor,2. 一般“信號量集”,一次需要N個某類臨界資源時,就要進行N次wait操作低效又可能死鎖 基本思想:在AND型信號量集的基礎上進行擴充:進程對信號量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 /某些資源不夠時的處理; 調用進程進入第一個小于tj信號量的等待隊列Sj.queue; 阻塞調用進程; endif,Ssignal(S1, d1; .; Sn, dn); for i = 1 to n do Si:= Si +di;/釋放占用的資源; for (each process P waiting in Si.queue) /檢查每種資源的等待隊列的所有進程;
17、 從等待隊列Si.L中取出進程P; if (判斷進程P是否通過Swait中的測試) /注:與signal不同,這里要進行重新判斷; begin/通過檢查(資源夠用)時的處理; 進程P進入就緒隊列; end else /未通過檢查(資源不夠用)時的處理; 進程P進入某等待隊列; endif endfor endfor,3.1.3 經(jīng)典進程同步問題,1. 生產(chǎn)者消費者問題(the producer-consumer problem),問題描述:若干進程通過有限的共享緩沖區(qū)交換數(shù)據(jù)。其中,生產(chǎn)者進程不斷寫入,而消費者進程不斷讀出;共享緩沖區(qū)共有N個;任何時刻只能有一個進程可對共享緩沖區(qū)進行操作。,定
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表示“正在讀”的進程數(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:,采用一般信號量集機制:問題增加一個限制條件:同時讀的讀者最多R個 Wmutex表示允許寫,初值是1 Rcount表示允許讀者數(shù)目,初值為R,讀者寫者問題,3. 哲學家進餐問題,問題描述:(由Dijkstra首先提出并
20、解決)5個哲學家圍繞一張圓桌而坐,桌子上放著5支筷子,每兩個哲學家之間放一支;哲學家的動作包括思考和進餐,進餐時需要同時拿起他左邊和右邊的兩支筷子,思考時則同時將兩支筷子放回原處。如何保證哲學家們的動作有序進行?如:不出現(xiàn)相鄰者同時要求進餐;不出現(xià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. 哲學家進餐問題,采用一般信號量集機制:,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)進程間的同步,但由于信號量的控制分布在整個程序中,其正確性分析很困難。管程是管理進程間同步的機制,它保證進程互斥地訪問共享變量,并方便地阻塞和喚醒進程。管程可以函數(shù)庫的形式實現(xiàn)。相比之下,管程比信號量好控制
22、。,1. 信號量同步的缺點,同步操作分散:信號量機制中,同步操作分散在各個進程中,使用不當就可能導致各進程死鎖(如P、V操作的次序錯誤、重復或遺漏) 易讀性差:要了解對于一組共享變量及信號量的操作是否正確,必須通讀整個系統(tǒng)或者并發(fā)程序; 不利于修改和維護:各模塊的獨立性差,任一組變量或一段代碼的修改都可能影響全局; 正確性難以保證:操作系統(tǒng)或并發(fā)程序通常很大,很難保證這樣一個復雜的系統(tǒng)沒有邏輯錯誤;,2. 管程的引入,1973年,Hoare和Hanson所提出;其基本思想是把信號量及其操作原語封裝在一個對象內(nèi)部。即:將共享變量以及對共享變量能夠進行的所有操作集中在一個模塊中。 管程的定義:管程
23、是關于共享資源的數(shù)據(jù)結構及一組針對該資源的操作過程所構成的軟件模塊,這些過程能同步進程和改變管程中的數(shù)據(jù)。 管程可增強模塊的獨立性:系統(tǒng)按資源管理的觀點分解成若干模塊,用數(shù)據(jù)表示抽象系統(tǒng)資源,同時分析了共享資源和專用資源在管理上的差別,按不同的管理方式定義模塊的類型和結構,使同步操作相對集中,從而增加了模塊的相對獨立性 引入管程可提高代碼的可讀性,便于修改和維護,正確性易于保證:采用集中式同步機制。一個操作系統(tǒng)或并發(fā)程序由若干個這樣的模塊所構成,一個模塊通常較短,模塊之間關系清晰。,管程由三部分組成: (1)局部于管程的共享變量說明 (2)對該數(shù)據(jù)結構進行操作的一組過程 (3)對局部于管程的數(shù)
24、據(jù)設置初始值的語句。,3. 管程的主要特性,模塊化:一個管程是一個基本程序單位,可以單獨編譯; 抽象數(shù)據(jù)類型:管程是一種特殊的數(shù)據(jù)類型,其中不僅有數(shù)據(jù),而且有對數(shù)據(jù)進行操作的代碼 信息封裝:管程是半透明的,管程中的外部過程(函數(shù))實現(xiàn)了某些功能,至于這些功能是怎樣實現(xiàn)的,在其外部則是不可見的;,4. 管程的實現(xiàn)要素,管程中的共享變量在管程外部是不可見的,外部只能通過調用管程中所說明的外部過程(函數(shù))來間接地訪問管程中的共享變量; 為了保證管程共享變量的數(shù)據(jù)完整性,規(guī)定管程互斥進入; 管程通常是用來管理資源的,因而在管程中應當設有進程等待隊列以及相應的等待及喚醒操作;,5. 管程中的多個進程進入
25、,當一個進入管程的進程執(zhí)行等待操作時,它應當釋放管程的互斥權;當一個進入管程的進程執(zhí)行喚醒操作時(如喚醒),管程中便存在兩個同時處于活動狀態(tài)的進程。 管程中的喚醒切換方法: P等待Q繼續(xù),直到Q等待或退出; Q等待P繼續(xù),直到P等待或退出; 規(guī)定喚醒為管程中最后一個可執(zhí)行的操作;,入口等待隊列:因為管程是互斥進入的,所以當一個進程試圖進入一個巳被占用的管程時它應當在管程的入口處等待,因而在管程的入口處應當有一個進程等待隊列,稱作入口等待隊列。 緊急等待隊列:如果進程喚醒進程,則等待繼續(xù),如果進程在執(zhí)行又喚醒進程,則等待繼續(xù),.,如此,在管程內(nèi)部,由于執(zhí)行喚醒操作,可能會出現(xiàn)多個等待進程(已被喚
26、醒,但由于管程的互斥進入而等待),因而還需要有一個進程等待隊列,這個等待隊列被稱為緊急等待隊列。它的優(yōu)先級應當高于入口等待隊列的優(yōu)先級。,5. 管程中的多個進程進入,6. 條件變量(condition),由于管程通常是用于管理資源的,因而在管程內(nèi)部,應當存在某種等待機制。當進入管程的進程因資源被占用等原因不能繼續(xù)運行時使其等待。為此在管程內(nèi)部可以說明和使用一種特殊類型的變量-條件變量。每個表示一種等待原因,并不取具體數(shù)值相當于每個原因對應一個隊列。,7. 管程的格式,TYPE monitor_name = MONITOR; 共享變量說明 define 本管程內(nèi)所定義、本管程外可調用的過程(函數(shù)
27、)名字表 use 本管程外所定義、本管程內(nèi)將調用的過程(函數(shù))名字表 PROCEDURE 過程名(形參表); 過程局部變量說明; BEGIN 語句序列; END; .,FUNCTION 函數(shù)名(形參表):值類型; 函數(shù)局部變量說明; BEGIN 語句序列; END; . BEGIN 共享變量初始化語句序列; END;,8. 管程的的組成,名稱:為每個共享資源設立一個管程 數(shù)據(jù)結構說明:一組局部于管程的控制變量 操作原語:對控制變量和臨界資源進行操作的一組原語過程(程序代碼),是訪問該管程的唯一途徑。這些原語本身是互斥的,任一時刻只允許一個進程去調用,其余需要訪問的進程就等待。 初始化代碼:對控
28、制變量進行初始化的代碼,9. 例子:生產(chǎn)者-消費者問題,建立一個管程,命名為PC,其中包括兩個過程 (1)put(item) 生產(chǎn)者利用該過程,將自己生產(chǎn)的消息放到緩沖池中, 并用整型變量count來表示在緩沖池中已有的消息數(shù),當 count=n時,表示緩沖池已滿,生產(chǎn)者需等待。 (2)get(item) 消費者利用該過程從緩沖池中取出一個消息,當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. 管程和進程的異同點,設置進程和管程的目的不同 系統(tǒng)管理數(shù)據(jù)結構 進程:PCB
31、 管程:等待隊列 管程被進程調用 管程是操作系統(tǒng)的固有成分,無創(chuàng)建和撤消,進程間通信示意圖,communication?,inter-process communication,machine,process A,process B,3.2.1 進程間通信的類型,低級通信:只能傳遞狀態(tài)和整數(shù)值(控制信息),包括進程互斥和同步所采用的信號量和管程機制。 優(yōu)點:速度快 缺點: 傳送信息量?。盒实?,每次通信傳遞的信息量固定,若傳遞較多信息則需要進行多次通信。 編程復雜:用戶直接實現(xiàn)通信的細節(jié),編程復雜,容易出錯。 高級通信:能夠傳送任意數(shù)量的數(shù)據(jù),包括三類:共享存儲區(qū)、管道、消息。,1. 低級通信
32、和高級通信,2. 直接通信和間接通信,直接通信:信息直接傳遞給接收方,如管道。 在發(fā)送時,指定接收方的地址或標識,也可以指定多個接收方或廣播式地址; 在接收時,允許接收來自任意發(fā)送方的消息,并在讀出消息的同時獲取發(fā)送方的地址。 間接通信:借助于收發(fā)雙方進程之外的共享數(shù)據(jù)結構作為通信中轉,如消息隊列。通常收方和發(fā)方的數(shù)目可以是任意的。,3. 高級通信機制,共享存儲器系統(tǒng) 消息傳遞系統(tǒng) 管道通信 基于socket的通信,3.2.2 共享存儲區(qū)系統(tǒng),相互通信的進程共享某些數(shù)據(jù)結構或共享存儲區(qū),進程之間通過它們進行通信。,1. 基于共享數(shù)據(jù)結構的通信方式 如生產(chǎn)者和消費者問題,屬于低級通信 。,2.基
33、于共享存儲區(qū)的通信方式 為傳輸大量數(shù)據(jù),在內(nèi)存中劃出一塊共享存儲區(qū),諸進程可通過對共享存儲區(qū)的數(shù)據(jù)進行讀和寫進行通信。,共享內(nèi)存 Shared Memory,共享內(nèi)存是進程間最有效也是最快的通信方式。 共享內(nèi)存是內(nèi)存塊方式的數(shù)據(jù)塊,其數(shù)據(jù)長度可為系統(tǒng)參數(shù)限制內(nèi)的任意長度。 多個進程可將同一物理內(nèi)存映射到自己的地址空間。 共享內(nèi)存處理函數(shù): 創(chuàng)建一個共享段: shmget( key, size, flags ) 把共享內(nèi)存鏈接到調用進程的數(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),進程間的數(shù)據(jù)交換以消息(message)為單位,在計算機網(wǎng)絡中, message又稱為報文。 系統(tǒng)提供了一組通信原語來實現(xiàn)通信.,發(fā)送原語的定義:send(p,message) 發(fā)送消息到進程P,接收原語的定義:rec
38、eive(Q,message)接收來自進程Q的消息,(1) 直接通信方式 發(fā)送進程直接將消息發(fā)送給接收進程,并把它掛在接收進程的消息緩沖隊列上, 接收進程從它的消息緩沖隊列上取得消息。,消息傳遞系統(tǒng),(2)間接通信方式 消息通過郵箱或端口來發(fā)送和接收。郵箱可以被抽象為一個對象,進程可以向其中存放消息也可以從中刪除消息。,每個郵箱要有一個唯一的標識符。一個進程可以通過不同的郵箱和其它進程通信。 信箱通信原語:信箱的創(chuàng)建和撤銷、信息的發(fā)送和接收,例如:若兩個進程共享一個郵箱,發(fā)送原語和接收原語分別是: send(A,message) :發(fā)送一個消息到郵箱A Receive(A,message):接
39、收來自信箱A的消息。,舉例1:消息緩沖隊列通信機制,廣泛應用于本地進程之間的通信中。 數(shù)據(jù)結構 1. 消息緩沖區(qū) TYPE message buffer = record sender : 發(fā)送者進程標志符 size : 消息長度 text : 消息正文 next : 指向下一個消息緩沖區(qū)的指針 end,2. PCB 中有關通信的數(shù)據(jù)項 type processcontrol block =record . . mq : 消息隊列隊首指針 mutex : 消息隊列互斥信號量 sm : 消息隊列資源信號量 . . end,舉例1:消息緩沖隊列通信機制,procedure send(receiver ,a) a為發(fā)送進程在自己的內(nèi)存空間設置的發(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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度家庭私人借車協(xié)議版
- 施工現(xiàn)場施工防突發(fā)公共衛(wèi)生事件威脅制度
- 跨界合作中的對公客戶關系管理策略探討
- 中外合資經(jīng)營企業(yè)合同(交通基礎設施項目)
- 二手車行業(yè)合同標準格式
- 一手房購買合同樣本大全
- 個人保證擔保債務合同樣本
- 中外合作生產(chǎn)合同(環(huán)保鍋爐)
- 專利權轉讓合同(三)
- 個人土地流轉合同范本
- 《石油鉆井基本知識》課件
- 電力兩票培訓
- TCCEAS001-2022建設項目工程總承包計價規(guī)范
- 2024.8.1十七個崗位安全操作規(guī)程手冊(值得借鑒)
- 中學生手機使用管理協(xié)議書
- 給排水科學與工程基礎知識單選題100道及答案解析
- 2024年土地變更調查培訓
- 2024年全國外貿(mào)單證員鑒定理論試題庫(含答案)
- 新版中國食物成分表
- 運輸車輛掛靠協(xié)議書(15篇)
- 完整版:美制螺紋尺寸對照表(牙數(shù)、牙高、螺距、小徑、中徑外徑、鉆孔)
評論
0/150
提交評論