操作系統(tǒng):04第四章 互斥同步與通訊(2_第1頁
操作系統(tǒng):04第四章 互斥同步與通訊(2_第2頁
操作系統(tǒng):04第四章 互斥同步與通訊(2_第3頁
操作系統(tǒng):04第四章 互斥同步與通訊(2_第4頁
操作系統(tǒng):04第四章 互斥同步與通訊(2_第5頁
已閱讀5頁,還剩75頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、4.3.6 會(huì) 合 (Rendezvous) P/V操作、管程等同步機(jī)制 適合于單機(jī)系統(tǒng)及具有公共內(nèi)存的多CPU系統(tǒng); 會(huì)合適合于不具有公共內(nèi)存的分布式系統(tǒng); 80年代, Ada, Initiated by DOD; Ada 95, (Object-oriented) 會(huì) 合: 兩個(gè)并發(fā)執(zhí)行流匯集到一處。并發(fā)執(zhí)行流:調(diào)用;接受均發(fā)生, 握手, 同步。 共享變量與訪問進(jìn)程在同一存儲(chǔ)區(qū), 不適合分布環(huán)境。 分布系統(tǒng):P/V 操作問題4.3.6 會(huì) 合(Cont.)共享變量( 被動(dòng) )CR1P1:CR2P2: 分布系統(tǒng):管程問題 管程與調(diào)用進(jìn)程在同一存儲(chǔ)區(qū), 不適合分布環(huán)境。P1:共享變量CR2管程

2、(被動(dòng)):CR1P2:分布系統(tǒng)中的同步機(jī)制應(yīng)避開被動(dòng)成分4.3.6 會(huì) 合(Cont.) 會(huì)合圖示 被調(diào)用者代調(diào)用者執(zhí)行調(diào)用代碼。4.3.6.1 會(huì)合的描述調(diào)用語句調(diào)用語句接受語句選擇語句任 務(wù)task任 務(wù)task任 務(wù)task不同主機(jī)中主動(dòng)成分進(jìn)程直接相互作用:會(huì)合同步機(jī)制。 會(huì)合描述: 一個(gè)任務(wù)可有多個(gè)入口,每個(gè)入口對(duì)應(yīng)一段程序; 一個(gè)任務(wù)調(diào)用另一個(gè)任務(wù)的入口, 被調(diào)任務(wù)接受該調(diào)用,會(huì)合發(fā)生; 調(diào)用者發(fā)出調(diào)用請求,被調(diào)者未接受該調(diào)用,調(diào)用者等待; 被調(diào)者要接受調(diào)用,而當(dāng)前尚無調(diào)用者時(shí),被調(diào)用者等待; 當(dāng)多個(gè)任務(wù)調(diào)用某任務(wù)的同一個(gè)入口時(shí), 被調(diào)用者按先來先服務(wù)(FCFS)的次序接受調(diào)用;

3、入口處可以攜帶調(diào)用參數(shù),還可以有返回參數(shù), 以實(shí)現(xiàn)信息的交換; 被調(diào)用者可以選擇會(huì)合的入口。 先到達(dá)會(huì)合處者等待后到達(dá)者。4.3.6.1 會(huì)合的描述(Cont.)會(huì)合描述的圖示:調(diào)用語句PCBPCB入口調(diào)用語句PCBPCB入口select調(diào)用任務(wù)被調(diào)用任務(wù)入口隊(duì)列(FIFO)4.3.6.1 會(huì)合的描述(Cont.)Ada實(shí)現(xiàn)會(huì)合的核心語句:1. 調(diào)用語句 . ;2. 接受語句 accept do end 形參表中可有入?yún)?shù)和出參數(shù),分別用保留字 in 和 out 來區(qū)分。 由于分布系統(tǒng)中沒有公共內(nèi)存,故形參全為值參,且不可為指針。 4.3.6.1 會(huì)合的描述(Cont.)accept 語句的語

4、義: 若無調(diào)用者,則等待; 選取第一個(gè)調(diào)用者; 會(huì)合開始,調(diào)用者等待; 若有 in 參數(shù),則取 in 參數(shù); 若有,則執(zhí)行之; 若有 out 參數(shù),則送 out 參數(shù); 會(huì)合結(jié)束,調(diào)用者繼續(xù)。會(huì)合期4.3.6.1 會(huì)合的描述(Cont.)accept 語句流程有調(diào)用者選取隊(duì)列中第一個(gè)調(diào)用者會(huì)合開始,調(diào)用者等待有 in 參數(shù)取 in 參數(shù)等 待有語句序列執(zhí)行語句序列有 out 參數(shù)送 out 參數(shù)會(huì)合結(jié)束,喚醒調(diào)用者TFFFFTTT4.3.6.1 會(huì)合的描述(Cont.)例4-10 (分布系統(tǒng)會(huì)合例):單一資源管理task single_resource is entry require ; e

5、ntry release ;end single_resource;task body single_resource is begin loop accept require; accept release; end loop end single_resource;single_resource.require; 使用single_resource.release;single_resource.require; 使用single_resource.release;HOST1HOST24.3.6.1 會(huì)合的描述(Cont.)3. 選擇語句: 同一時(shí)刻多個(gè)入口均有調(diào)用者時(shí), 可通過selec

6、t 語句選擇一個(gè)入口的調(diào)用者與被調(diào)者會(huì)合。4.3.6.1 會(huì)合的描述(Cont.)select when = ; or when = ; else end select ;如果select語句中的某接受語句 A 之前的when條件為真, 或 A 前面無when語句,則稱A為開放的接受語句。4.3.6.1 會(huì)合的描述(Cont.)select 語句的語義: 計(jì)算所有布爾表達(dá)式,為真者對(duì)應(yīng)標(biāo)記開放; 無開放的: 如果有ELSE部分則執(zhí)行Selse ,否則異常; break; 無被調(diào)用的開放的 (此時(shí)有開放的accept): 如果有ELSE部分,則執(zhí)行Selse,break; 否則被調(diào)用者等待; 任

7、取一開放的且被調(diào)用的: 會(huì)合開始,調(diào)用者等待; 若有 in 參數(shù),則取 in 參數(shù); 若有,則執(zhí)行之; 若有 out 參數(shù),則送 out 參數(shù); 會(huì)合結(jié)束,調(diào)用者繼續(xù)。會(huì)合期4.3.6.1 會(huì)合的描述(Cont.)select 語句流程計(jì)算所有布爾表達(dá)式為真者對(duì)應(yīng)標(biāo)記開放有開放的有else部分F有被調(diào)用的開放的T有else部分F等 待F會(huì)合開始,調(diào)用者等待有 in 參數(shù)有語句序列F取 in 參數(shù)T執(zhí)行語句序列T有 out 參數(shù)F送 out 參數(shù)Telse部分T建立異常條件Felse部分TF會(huì)合結(jié)束,調(diào)用者繼續(xù)任取一開放且被調(diào)用的T客 棧Master 主人4.3.6.2 會(huì)合的例子 例4-11

8、客棧問題 客棧問題描述 客棧限制:一份獵物 一份面包一份三明治一位客人主人活動(dòng): 接受獵物 接受面包 做三明治 給探險(xiǎn)者.Explorers探險(xiǎn)者Baker面包師Hunter狩獵者到客棧取一個(gè)三明治在外吃獵物交給客棧主人面包交給客棧主人explorers:loop 探 險(xiǎn) 進(jìn)客棧 取三明治 出客棧 吃三明治end loophunter:loop 狩 獵 進(jìn)客棧 送獵物 出客棧end loopbaker:loop 做面包 進(jìn)客棧 送面包 出客棧end loop入口進(jìn)程定義 入口入口4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題任務(wù)及入口定義:procedure Adalodge

9、is task type explorer ; task hunter ; task baker ; task master is entry delivermeat ; /狩獵者送獵物 entry deliverbread ; /面包師送面包 entry lodge ; /探險(xiǎn)家取三明治 end master ;4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題task body explorer is victuals : food ; begin loop explore ; master.lodge (victuals) ; /入客棧取三明治 eat ( victuals

10、) ; end loop end explorer ;探險(xiǎn)者任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題task body hunter is walrus : food ; begin loop hunt ( walrus ) ; master.delivermeat (walrus) end loop end hunter ;狩獵者任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題task body baker is rolls : food ; begin loop bake ( rolls ) ; master.deliverbread ( r

11、olls ) end loop end baker ;面包師任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題task body master is bread, meat, sandwich : food ; procedure makesandwich is begin cook (meat ) ; sandwich := bread + meat ; bread := 0 ; meat := 0 ; end makesandwich ;客棧主人任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題begin /master開始 bread := 0 ; m

12、eat := 0; sandwich := 0 ; loop select when bread=0 = accept deliverbread ( br: in food) do bread := br; end deliverbread; or when meat=0 = accept delivermeat(mt: in food) do meat := mt ; end delivermeat ; or客棧主人任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題 when (sandwich0)or (bread0 and meat0) = accept lodge (

13、snack: out food ) /入店取三明治 do if sandwich=0 then makesandwich end if ; snack := sandwich ; end lodge ; sandwich := 0 /會(huì)合期之外。該語句里外都行客棧主人任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題explorers: array 1 . Numberofexploers of explorer;begin null; end Adalodge ; else if ( bread 0 ) and ( meat 0 ) and ( sandwich = 0 )

14、 then makesandwich end if /棧主人活動(dòng) end select end loopend master客棧主人任務(wù):4.3.6.2 會(huì)合的例子(Cont.) 例4-11 客棧問題用 Ada 語言中的會(huì)合解決讀者/寫者問題,要求寫者優(yōu)先。即編寫一個(gè)任務(wù),其中有如下四個(gè)入口: start_read; finish_read; start_write; finish_write. 提示:可以使用嵌套的 accept 語句。4.3.6.2 會(huì)合的例子(Cont.) 例4-12 讀者-寫者問題task readers_writers is entry start_read ; en

15、try finish_read ; entry start_write ; entry finish_write ;end readers_writes ;task body readers_writers is var read_count , write_count : integer;begin read_count := 0; write_count := 0 ; loop select4.3.6.2 會(huì)合的例子(Cont.) 例4-12 讀者-寫者問題when write_count = 0 = accept start_read do read_count+; end start_

16、read; orwhen read_count 0 = accept finish_read do read_count-; end finish_read; or when (write_count 0) = accept finish_write do write_count-; end finish_write ; or 4.3.6.2 會(huì)合的例子(Cont.) 例4-12 讀者-寫者問題 when write_count = 0 = accept start_write do while read_count 0 do accept finish_read do read_count-

17、 ; end finish_read ; end while write_count+; end start_write;end selectend loop;end readers_writers;4.3.6.2 會(huì)合的例子(Cont.) 例4-12 讀者-寫者問題讀者活動(dòng):readers_writes . start_read ;讀操作;Readers_writers . finish_read ;寫者活動(dòng):readers_writers . start_write ;寫操作;readers_writers . finish_write ;4.3.6.2 會(huì)合的例子(Cont.) 例4-1

18、2 讀者-寫者問題task boundedbuffer is entry putin ; entry getout ;end boundedbuffer ;task body boundedbuffer is b : array 0 . k-1 of integer ; ip , op : 0 . k-1 ; count : integer ; begin ip:=0; op:=0; count:=0; loop4.3.6.2 會(huì)合的例子(Cont.) Bounded buffer problem select when (count accept putin ( item : in inte

19、ger ) do b ip := item ; ip := ( ip + 1 ) mod k ; count := count + 1 ; end putin ; or when (count 0 ) = accept getout ( item : out integer ) do item := b op ; op := ( op + 1 ) mod k ; count := count 1 ; end getout ; end select end loopend boundedbuffer ; 4.3.6.2 會(huì)合的例子(Cont.) Bounded buffer problem生產(chǎn)者

20、活動(dòng) do 加工一件物品 item ; boundedbuffer.putin(item) ; /物品放入箱中 while ( 1 )消費(fèi)者活動(dòng):do boundedbuffer.getout(item) ; /箱中取一物品; 消耗物品 item ; while ( 1 )4.3.6.2 會(huì)合的例子(Cont.) Bounded buffer problem4.4 進(jìn)程高級(jí)通信低級(jí)通信 (簡單信號(hào)) 進(jìn)程互斥:相關(guān)或不相關(guān)進(jìn)程之間; 進(jìn)程同步:相關(guān)進(jìn)程之間。 高級(jí)通信 (大宗信息的交換) memory sharing message passing direct vs. indirect sy

21、mmetric vs. non-symmetric buffering vs. non-buffering4.4.1 進(jìn)程通信的概念進(jìn)程通信:進(jìn)程之間的互斥、同步及信息交換統(tǒng)稱為進(jìn)程通信(Inter-Process Communication : IPC)。4.4.2 進(jìn)程通信的模式1. 共享內(nèi)存模式(shared memory)OS 提供: 公共內(nèi)存; 互斥同步機(jī)制。P1P2公共內(nèi)存通信實(shí)現(xiàn):進(jìn)程之間運(yùn)用OS提供的互斥同步機(jī)制 實(shí)現(xiàn)對(duì)公共內(nèi)存信息讀/寫。直接: 進(jìn)程-進(jìn)程間接: 進(jìn)程-信箱-進(jìn)程4.4.2 進(jìn)程通信的模式(Cont.)2. 消息傳遞模式(message passing)P1s

22、endP2receiveM 進(jìn)程之間無公共內(nèi)存; OS 提供系統(tǒng)調(diào)用命令: 發(fā)送命令send 接收命令receive 消息傳遞過程由 OS 完成, 對(duì)用戶透明。4.4.3 直接方式對(duì)稱形式 (symmetric): sender and receiver name each other send ( R , message ) ; receive ( S , message ) ;send (R,M)R:直接方式: 相互通信進(jìn)程在通信時(shí),直接指定接收者 或發(fā)送者的名字。receive (S,N)S:一對(duì)一通信4.4.3 直接方式(Cont.)非對(duì)稱形式 (asymmetric):多對(duì)一 onl

23、y sender names receiver send ( R , message ) ; receive ( pid , message ) ;send (R,M1)S1:send (R,M2)S2:receive (pid,N)R:傳送途徑: 緩沖途徑、非緩沖途徑C/S model4.4.3.1 有緩沖途徑適用于消息傳遞模式、直接方式(非對(duì)稱形式)。發(fā)送過程: 發(fā)送進(jìn)程執(zhí)行send; OS為發(fā)送進(jìn)程分配緩沖區(qū); 將send消息拷貝到緩沖區(qū); 將緩沖區(qū)鏈接到接收進(jìn)程的消息鏈中。接收過程: 接收進(jìn)程執(zhí)行receive; OS在接收進(jìn)程的消息鏈中取出消息緩沖區(qū), 并將其內(nèi)容拷貝到接收進(jìn)程空間;

24、 釋放緩沖區(qū)。4.4.3.1 有緩沖途徑(Cont.)緩沖消息通信示圖:SPCBsend(R,M)M:發(fā)送者SsizetextRPCBreceive(pid,N)N:sizetext接收者Rmsg2msgn.msg1緩沖消息鏈?zhǔn)腔コ鈪^(qū)sizetextsenderlink載有消息的緩沖:消息隊(duì)列互斥: var m_mutex : semaphore; (1) P ( m_mutex ) ; 入/出隊(duì)列動(dòng)作 ; V ( m_mutex ) ;4.4.3.1 有緩沖途徑(Cont.)消息隊(duì)列同步: var S_msg : semaphore; (0) 收取消息前:P ( S_msg ) ; 消息入隊(duì)

25、后:V ( S_msg ) ;消息隊(duì)列有入隊(duì)列(發(fā)送)、出隊(duì)列(接收)操作,需要互斥和同步管理。msgi:Buffer pool managementvar S_buf, b_mutex : semaphore ; (k,1)申 請:P ( S_buf ) ;P ( b_mutex ) ;頭緩沖區(qū)出鏈;V ( b_mutex ) ;釋 放:P ( b_mutex ) ;緩沖區(qū)入鏈頭 ;V ( b_mutex ) ;V ( S_buf ) ;bufbufbufHead4.4.3.1 有緩沖途徑(Cont.)發(fā)送/接收消息時(shí),要對(duì)系統(tǒng)提供的緩沖池進(jìn)行申請和釋放操作,該緩沖池需要互斥和同步管理。假定

26、系統(tǒng)在緩沖池提供 k 個(gè)消息緩沖區(qū)。發(fā)送/接收原語send ( R , M ) 根據(jù) R 找接收者; P ( S_buf ) ; P ( b_mutex ) ; 從緩沖池鏈頭取一空 buf ; V ( b_mutex ) ; size,M,sender = buf P ( m_mutex ) ; 消息 buf 入 R 消息隊(duì)列鏈尾; V ( m_mutex ) ; V ( S_msg ) ; receive ( pid , N ) P ( S_msg ) ; P ( m_mutex ) ; 消息隊(duì)列頭消息msg1出鏈; V (m_mutex ) ; (msg1.size,msg1.text)=

27、 N msg1.sender = pid P ( b_mutex ) ; msg1入緩沖池鏈頭; V ( b_mutex ) ; V ( S_buf ) ;4.4.3.1 有緩沖途徑(Cont.)Remarks: send/receive 為高級(jí)通信原語, 可用低級(jí)原語實(shí)現(xiàn); send/receive不是真正意義的原語, 可以被中斷。 每個(gè)進(jìn)程的PCB中都要定義 S_msg 和 m_mutex . S_buf和b_mutex是操作系統(tǒng)定義的公共信號(hào)量。4.4.3.1 有緩沖途徑(Cont.)適用于消息傳遞模式,直接方式,非對(duì)稱形式。發(fā)送/接收過程:發(fā)送進(jìn)程執(zhí)行 send, 若接收進(jìn)程未執(zhí)行到

28、receive,則發(fā)送者等待;接收進(jìn)程執(zhí)行 receive, 若發(fā)送進(jìn)程未執(zhí)行到 send,則接收者等待;發(fā)送 / 接收都發(fā)生,信息由發(fā)送者復(fù)制到接收者。4.4.3.2 無緩沖途徑發(fā)送/接收的同步:每個(gè)進(jìn)程的PCB中兩個(gè)信號(hào)量。semaphore S_m ; / 初值為 0, 用于接收者等待。semaphore S_w ; / 初值為 0, 用于發(fā)送者等待。通過通用寄存器4.4.3.2 無緩沖途徑(Cont.) send(R, M):根據(jù) R 找到消息接收者;發(fā)送消息進(jìn)程個(gè)數(shù)增1, 執(zhí)行V(R.S_m), 通知進(jìn)程 R 要發(fā)消息 (如等待將其喚醒);等待 R 執(zhí)行到 receive, 即執(zhí)行

29、P ( S.S_w ) 。receive(pid, N):等待消息到達(dá), 即執(zhí)行 P (R.S_m ) ;消息由發(fā)送進(jìn)程空間 M 復(fù)制到接收進(jìn)程空間 N ;喚醒發(fā)送消息進(jìn)程, 即執(zhí)行 V (S.S_w ) 。發(fā)送/接收原語R進(jìn)程Send所在進(jìn)程4.4.3.2 無緩沖途徑(Cont.)發(fā)送/接收示圖OSHALregistersend(R,M);M:S_mS_W發(fā)送進(jìn)程 Sreceived(pid,N);N:S_mS_W接收進(jìn)程 R優(yōu) 點(diǎn):節(jié)省空間(不需要buffer)缺 點(diǎn):并發(fā)性差: 發(fā)送進(jìn)程需要等待接收進(jìn)程執(zhí)行receive 把信息復(fù)制到接收進(jìn)程空間后才能繼續(xù)。4.4.3.2 無緩沖途徑(C

30、ont.)Mailbox(FIFO)發(fā)送 send_MB (MB,M): 將消息M發(fā)送到信箱MB.接收 receive_MB (MB,N): 從信箱MB接收消息到N.特點(diǎn): multi-sender multi-receiver; multi-sender one receiver4.4.4 間接方式間接方式: 通信進(jìn)程之間在通信時(shí)不指定對(duì)方名字, 而是指定一個(gè)中間媒體信箱。 又稱作信箱方式。msg1msg2msg3typedef mailbox struct int in, out; /*初值均為0; 取值范圍0k-1*/ semaphore s1, s2 ; ( k , 0 ) semap

31、hore mutex ; ( 1 ) message letterk ; ;mailbox mb ; /編譯時(shí)并不分配空間create_MB ( mb ) ; /系統(tǒng)調(diào)用, 為mb分配空間delete_MB ( mb ) ; /系統(tǒng)調(diào)用, 釋放mb空間4.4.4 間接方式(Cont.)通信實(shí)現(xiàn): 信箱即可以在操作系統(tǒng)空間, 也可以在用戶空間。 考慮信箱在操作系統(tǒng)空間的通信實(shí)現(xiàn)。send_MB (mailbox mb; message M) P ( mb.s1 ) ; /信箱有空位? P ( mb.mutex ) ; mb.letter mb.in = M ; mb.in = ( mb.in +

32、 1 ) % k ; V ( mb.mutex ) ; V ( mb.s2 ) /消息增加一個(gè) 4.4.4 間接方式(Cont.)receive_MB(mailbox mb; message *N) P ( mb.s2 ) ; /申請消息 P ( mb.mutex ) ; *N= mb.letter mb.out ; mb.out = ( mb.out + 1 ) % k ; V ( mb.mutex ) ; V ( mb.s1 ) ; /空位增加一個(gè)4.4.4 間接方式(Cont.)4.4.4 間接方式(Cont.)creat_MB(mb);.receive_MB(mb,N);delete_

33、MB(mb); N:.send_MB(mb,M); M:OS Creat_MB Delete_MB Send_MB Receive_MBmsg1msg2msg3mailbox mb;通信實(shí)現(xiàn)示圖(信箱在系統(tǒng)空間):msg1msg2msg3創(chuàng)建信箱的進(jìn)程為信箱擁有者, 可以調(diào)用receive_MB.4.5 系統(tǒng)舉例4.5.1 Java中的管程類似管程的對(duì)象object每個(gè)object有一個(gè)互斥鎖lock,一般未用;說明為synchronized的method啟用互斥鎖;每個(gè)object內(nèi)部有一個(gè)等待隊(duì)列;wait() : 釋放lock, 狀態(tài)改為blocked, 進(jìn)入wait set.notif

34、y() :在wait set中取任意線程,移到entry set, 狀態(tài)改為runnable. (Signal and continue)notifyAllwait set所有線程移到entry set, 狀態(tài)改為runnable.4.5.1 Java中的管程(Cont.)entry set and wait setObjectLock ownerentry setwait setAcquire locknotify(), notifyAll()wait()4.5.1 Java中的管程(Cont.)entry set and wait set鎖的持有者執(zhí)行 wait 操作, 狀態(tài)改為block

35、ed, 釋放所持有的鎖 , 進(jìn)入 wait set ; 若 entry set 非空 , 選擇其一進(jìn)入同步方法。鎖的持有者執(zhí)行 notify 操作 , 任選 wait set 上的一個(gè)線程 , 入 entry set , 狀態(tài)改為 runnable . 執(zhí)行notify操作的線程繼續(xù)。鎖的持有者執(zhí)行 notifyAll 操作 , wait set 上的所有線程出 wait set , 入 entry set , 狀態(tài)改為 runnable . 執(zhí)行notifyAll操作的線程繼續(xù)。例:生產(chǎn)/消費(fèi)問題public class BoundedBuffer /*類定義開始*/public Bound

36、edBuffer ( ) /*緩沖區(qū)變量定義*/ count=0; in=0; out=0; buffer = new Object BUFFER_SIZE ; private static final int BUFFER_SIZE=5;private int count, in, out ;private Object buffer ;4.5.1 Java中的管程(Cont.)4.5.1 Java中的管程(Cont.)例:生產(chǎn)/消費(fèi)問題(Cont.)public synchronized void enter(Object item) while ( count = BUFFER_SIZE

37、 ) try wait(); /被喚醒后重新檢測等待條件 catch (InterruptedException e) count+; buffer in = item ; in = ( in+1 ) % BUFFER_SIZE ; notify ( ) ; 4.5.1 Java中的管程(Cont.)例:生產(chǎn)/消費(fèi)問題(Cont.)public synchronized Object remove ( ) while ( count = 0 ) try wait(); catch (InterruptedException e) count - ; item = buffer out ; ou

38、t = ( out + 1 ) % BUFFER_SIZE ; notify ( ) ; return ( item ) ; /*類定義結(jié)束*/4.5.1 Java中的管程(Cont.)例:生產(chǎn)/消費(fèi)問題(Cont.)生產(chǎn)者活動(dòng):do 加工一件物品item; pc.enter( item ); while ( 1 )消費(fèi)者活動(dòng):do item=pc.remove; 消耗物品item; while ( 1 )BoundedBuffer pc; /*定義對(duì)象 pc */4.5.1 Java中的管程(Cont.)例:讀者/寫者問題public class Database /* 類定義開始 */pu

39、blic Database ( ) readcount = 0 ; dbReading = false ; dbWriting = false ; private int readercount;private boolean dbReading;private boolean dbWriting;4.5.1 Java中的管程(Cont.)例:讀者/寫者問題(Cont.)public synchronized void startRead ( ) while ( dbWriting = true ) try wait ( ) ; catch(InterruptedException e) re

40、adcount + ; if ( readcount = 1 ) dbReading = true ; public synchronized void endRead() readcount - ; if ( readcount = 0 ) dbReading = false ; notifyAll () ;4.5.1 Java中的管程(Cont.)例:讀者/寫者問題(Cont.)public synchronized void startWrite ( ) while(dbReading=true|dbWriting=true) try wait(); catch (Interrupted

41、Exception e) dbWriting=true;public synchronized void endWrite ( ) dbWriting=false; notifyAll(); /*類定義結(jié)束*/4.5.1 Java中的管程(Cont.)Java synchronization rulesA thread that owns the lock for an object can enter another synchronized method (or block) for the same object.A method can nest synchronized method

42、 invocation for different objects. Thus a thread can simultaneously own the lock for several different objects.If a method is not declared as synchronized, then it can be invoked regardless of lock ownership, even while another synchronized method for the same object is executing. If the wait set fo

43、r an object is empty, then a call to notify() or notifyAll() has no effect.4.5.2 Linux進(jìn)程通信4.5.2.1 共享內(nèi)存textdata棧共享存儲(chǔ)區(qū)進(jìn)程P的邏輯空間textdata棧進(jìn)程Q的邏輯空間內(nèi)存空間共享內(nèi)存通信keysizeshmaddrpagetable其它shmid:共享存儲(chǔ)區(qū)表AABB4.5.2.1 共享內(nèi)存(Cont.)(1) 共享存儲(chǔ)區(qū)建立int shmget(key, size, shmflg)key_t key; int size, shmflg; 檢查共享存儲(chǔ)區(qū)表,查找與key相同的表項(xiàng)

44、。 若有,則該區(qū)已建立,返回shmid。 若無,且shmflg=IPC_CREAT、size合法, 則分配頁表及相應(yīng)頁面; 根據(jù)參數(shù)key、size和shmflg, 在共享存儲(chǔ)區(qū)表中填寫新的表項(xiàng),返回共享存儲(chǔ)區(qū)描述符。4.5.2.1 共享內(nèi)存(Cont.)(2) 共享存儲(chǔ)區(qū)的附接char *shmat(shmid, shmaddr, shmflg)int shmid, shmflg; char *shmaddr;shmid: shmget返回的共享存儲(chǔ)區(qū)描述符;shmaddr: 共享存儲(chǔ)區(qū)對(duì)應(yīng)的 進(jìn)程虛擬空間的起始地址;shmflg: 讀寫標(biāo)志。 等于SHM_RDONLY表示只讀; 等于0表示

45、可讀寫;函數(shù)返回值:共享存儲(chǔ)區(qū)對(duì)應(yīng)進(jìn)程空間的虛擬地址。共享區(qū)首地址?4.5.2.1 共享內(nèi)存(Cont.)(3) 共享存儲(chǔ)區(qū)的分離int shmdt( shmaddr )char *shmaddr;shmaddr: 要分離的虛擬地址, 即shmat返回的虛擬地址。4.5.2.1 共享內(nèi)存(Cont.)(4) 共享存儲(chǔ)區(qū)使用例:進(jìn)程P: char * A; shmid0=shmget(key0 ,1024, IPC_CREAT); A*shmat(shmid0, A, SHM_RDONLY); ; i=shmdt( A );進(jìn)程Q: char *B; shmid0=shmget(key0 ,10

46、24, IPC_CREAT); B*shmat(shmid0, B, 0); ; i=shmdt( B );4.5.2.2 signal、pipe與持久對(duì)象Signal是一種軟件中斷, 通知程序某種事件的發(fā)生。Signal產(chǎn)生: 按下CTRL+C產(chǎn)生SIGINT; 硬件中斷, 如除0, 非法內(nèi)存訪問(SIGSEV)等; Kill 函數(shù)可以對(duì)進(jìn)程發(fā)送Signal; Kill命令。實(shí)際上是對(duì)Kill函數(shù)的一個(gè)包裝; 軟件中斷: 當(dāng)Alarm Clock超時(shí)(SIGURG); 當(dāng)Reader中止之后又向管道寫數(shù)據(jù) (SIGPIPE).4.5.2.2 signal、pipe與持久對(duì)象pipe是用于進(jìn)程

47、間傳遞消息。持久對(duì)象(persistent object)可以被進(jìn)程創(chuàng)建和撤銷,也可能被移到后備存儲(chǔ)器中。4.5.3 Windows 2000/XP 的并發(fā)控制同步對(duì)象Win32應(yīng)用程序接口功能描述信號(hào)量CreateSemaphore創(chuàng)建一個(gè)信號(hào)量變量,由參數(shù)給出初值。OpenSemaphore打開已經(jīng)存在的信號(hào)量對(duì)象,返回句柄。ReleaseSemaphore釋放對(duì)信號(hào)量對(duì)象的引用?;コ怄iCreateMutex創(chuàng)建一個(gè)新互斥鎖對(duì)象。OpenMutex打開已經(jīng)存在的互斥鎖對(duì)象,返回句柄。ReleaseMutex釋放對(duì)互斥對(duì)象的占有。事 件CreateEvent創(chuàng)建一個(gè)事件對(duì)象。OpenEven

48、t打開事件對(duì)象,返回句柄。SetEvent設(shè)置事件對(duì)象為有信號(hào)狀態(tài)。ResetEvent重置事件對(duì)象。PulseEvent探測事件對(duì)象。臨界區(qū)InitializeCriticalSection初始化一個(gè)臨界區(qū)對(duì)象。EnterCriticalSection等待進(jìn)入臨界區(qū),得到使用權(quán)時(shí)返回。TryEnterCriticalSection以非等待方式申請臨界區(qū)互斥權(quán),申請失敗則返回0。LeaveCriticalSection釋放一個(gè)臨界區(qū)的使用權(quán)。DeleteCriticalSection撤銷臨界區(qū)對(duì)象。UNIX進(jìn)程高級(jí)通訊機(jī)制Pipe: an unnamed file with two fds ,

49、 one for write, and the other for read. The size of pipe file is limited to 4 blocks(one block is 512 bytes). int fd 2 ; pipe ( fd ) : 功能:創(chuàng)建一個(gè)pipe文件返回:fd 0: 讀描述符; fd 1: 寫描述符。pipe 可以被子進(jìn)程繼承.管道讀/寫:write(fd1,buf1,count1);/將buf1中count1個(gè)字節(jié)寫入管道;read(fd0,buf2,count2);/把管道中count2個(gè)字節(jié)讀到buf2.無名管道UNIX進(jìn)程高級(jí)通訊機(jī)制(Cont.)實(shí)現(xiàn)特點(diǎn): pipe作為文件, 需要兩次I/O, 但一般不會(huì)真正執(zhí)行I/O操作。pipe文件大小的限制 (Eg. 2k), 循環(huán)使用, 避免緩沖資源緊張;緩沖與延遲寫(delayed write), 寫到內(nèi)存緩沖區(qū), 只要內(nèi)存資源不緊張, 緩沖區(qū)不另作它用, 不會(huì)寫到外存; 讀時(shí)可在內(nèi)存緩沖區(qū)中得到?;谖募到y(tǒng)實(shí)現(xiàn), 與文件統(tǒng)一的界面;管道數(shù)據(jù)讀出后就清除。緩沖區(qū)通訊方式UNIX進(jìn)程高級(jí)通訊機(jī)制(Cont.) 管道讀規(guī)則 管道寫端不存在: 所有進(jìn)程都關(guān)閉了寫端。 則認(rèn)為已經(jīng)讀到了數(shù)據(jù)的末尾, 讀函數(shù)返回的讀出字節(jié)數(shù)為0; 管道寫端關(guān)閉后, 寫

溫馨提示

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

評(píng)論

0/150

提交評(píng)論