操作系統第2章_第1頁
操作系統第2章_第2頁
操作系統第2章_第3頁
操作系統第2章_第4頁
操作系統第2章_第5頁
已閱讀5頁,還剩78頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第二章 進程及作業管理 第二章第二章 進程及作業管理進程及作業管理 1 進程概念進程概念 2 系統內核系統內核3 進程控制進程控制4 進程同步進程同步5 進程通訊進程通訊6 作業概念作業概念7 作業控制作業控制 第二章 進程及作業管理 1 進進 程程 概概 念念1.1 程序的順序執行與并發執行程序的順序執行與并發執行在單道程序系統中,程序的執行必然具有下述特性:(1) 順序性(2) 封閉性(3) 無關性(4) 可再現性第二章 進程及作業管理 對于多道程序系統,程序的執行就有一些新的特性:(1) 異步性(2) 競爭性(3) 相互制約(4) 與速度有關第二章 進程及作業管理 設有兩個循環結構的程序

2、A和B,它們共享一個公共變量n。程序A每執行一次循環都要作n:n1操作;程序B在每一次循環中打印出n的值,然后將n置0。對此的PASCAL描述如下:第二章 進程及作業管理 第二章 進程及作業管理 第二章 進程及作業管理 cobegin/coend表示并發結構,其中的程序可以并發執行。由于程序A和B都是異步執行,它們的語句在時間上可能是穿插或交叉執行的,故程序A的n:n1操作既可能在程序B的print(n)和n:0操作之前或之后執行,也可能在它們之間執行(即n:n1出現在print(n)之后,而在n:0之前)。于是,程序的運行可能產生三組不同的執行軌跡和結果(設在開始某個循環之前nv):第二章

3、進程及作業管理 1.2 進程定義進程定義(1) 進程是一種動態概念。(2) 進程的實體是程序和數據集合。(3) 進程是可并發的運行單位。第二章 進程及作業管理 1.3 進程的狀態進程的狀態(1) 執行狀態執行狀態(2) 就緒狀態就緒狀態 (3) 等待狀態等待狀態 (4) 停止狀態停止狀態(5) 死鎖狀態死鎖狀態 第二章 進程及作業管理 圖2-1 進程的生命歷程第二章 進程及作業管理 圖2-2 具有掛起狀態的進程生命歷程第二章 進程及作業管理 1.4 進程控制塊進程控制塊圖2-3 進程的物理表示第二章 進程及作業管理 PCB包含了進程的描述信息和控制信息,通常有如下項目:(1) 標識符(2) 存

4、貯信息(3) 現行狀態(4) 優先數(5) 現場信息(6) 鏈接字(或稱隊列指針)(7) 族系關系(8) 資源清單(9) 其他第二章 進程及作業管理 PCB的內容和大小隨系統不同而異,它不僅和具體系統的管理及控制方法有關,也和系統規模的大小有關。 為了便于管理,系統把所有的PCB用適當方式組織起來。一般說來,大致有以下三種組織方式: (1) 線性表方式 (2) 索引方式 (3) 鏈接方式第二章 進程及作業管理 圖圖2-4 PCB的組織方式的組織方式第二章 進程及作業管理 圖圖2-4 PCB的組織方式的組織方式第二章 進程及作業管理 圖2-5 進程家族樹第二章 進程及作業管理 2 系系 統統 內

5、內 核核 把操作系統中的所有程序模塊分成兩大類,即進程模塊和非進程模塊。進程模塊是系統進程的程序實體,例如POOLing程序、磁盤管理程序、作業流控制程序等等,它們以進程的形式在系統中并發運行,執行相應的系統功能。非進程模塊是不以進程形式獨立運行的程序,每個這樣的程序實現系統管理功能的某種相對獨立的基本操作,在教科書中通常稱這類模塊為“原語”(Primitive)。 原語是機器指令的延伸,一條原語由若干機器指令所組成,有時也稱之為“軟指令”。第二章 進程及作業管理 所有的原語組成了操作系統的一個核心,稱之為內核(Kernel)。從系統層次結構上看,內核處于操作系統的最底層,即它是最接近裸機的部

6、分,而且內核通常只占整個操作系統代碼中的一小部分,但卻是最頻繁使用的部分,因而內核一般常駐內存。內核中除了涉及CPU管理、存貯器管理、設備管理、文件管理以及進程管理的各種原語之外,還包括各種中斷處理、收費記帳等程序模塊。第二章 進程及作業管理 中斷處理是內核最重要的功能之一。系統中所有中斷都由內核響應,當內核響應一個中斷時,它屏蔽其他中斷信號,在處理完一個中斷后,它又繼續響應其他中斷。當確定了某個中斷的原因后, 內核把中斷處理的具體任務交給專門處理這類中斷的特定進程或程序,這樣就使內核能夠及時響應連續不斷發生的各種中斷。第二章 進程及作業管理 裸機經內核擴充后構成了計算機系統的第一層“虛擬機”

7、,所有的進程都在這個虛擬機上運行。該虛擬機有三個屬性: (1)它沒有中斷,面向進程的是一個沒有中斷的運行環境,因此進程中無需響應中斷; (2)它為每個進程提供了一臺虛擬處理機,每個進程都好象在各自的處理機上 順序地執行; ()它為進程提供了強大的指令系統,即由機器指令系統和所有原語組成的指令集合。第二章 進程及作業管理 3 進進 程程 控控 制制3.1 建立、停止及撤銷建立、停止及撤銷 一個進程可借助于“建立”原語創建一個新進程,前者為后者的父進程,后者為前者的子進程。建立新進程的工作通常包括:從PCB集合中獲取一個空閑PCB;對該PCB進行初始化;為新進程的數據集分配內存空間并初始化;為新進

8、程的程序文本分配內存空間并裝入該程序;將新進程的PCB插入就緒隊列。在一些系統中(如UNIX)允許子進程在被建立時可以直接繼承父進程的某些特征和資源,例如優先數、終端、可共享的打開文件等。建立原語可大致描述如下:第二章 進程及作業管理 procedure create(pn,pri,res,fn,args);begin getfreepcb(i); if i=NIL then return(NIL); i.id:=pn; i.priority:=pri; i.resources:=res; memallocate(datasetsize,add); if add=NIL then begin

9、pcbrelease(i) return(NIL); end;第二章 進程及作業管理 end; i.dataadd:=add; i.datasize:=datasetsize; datasetinit(i.dataadd,args); filestate(fn,add,size); if add=NIL then begin memallocate(size,add); if add=NIL then begin memrelease(i.dataadd,i.datasize); pcbrelease(i); return(NIL);第二章 進程及作業管理 end; read(fn,size,

10、add); end; i.textadd:=add; i.textsize:=size; g:=fn; i.pc=add; i.children:=0; i.parent:=EXE; EXE.children:=EXE.children+1; i.state: ready; i.queue: =RQ; insert(RQ,i); otherinit; return(i);end;第二章 進程及作業管理 調用參數說明如下:pn為新進程的外部名;res為新進程的初始資源,如終端、父進程的打開文件表等; pri為新進程的初始優先數; fn為新進程的執行程序文本之文件名; args是fn的參

11、數表。第二章 進程及作業管理 過程getfreepcb從PCB集中獲取一個空閑PCB,返回值i為PCB號。過程memallocate按指定要求分配內存空間, 返回內存區地址add。過程memrelease和pcbrelease分別釋放指定內存區和PCB。過程datasetinit初始化數據區,并裝入參數表args。過程filestate檢查指定文件的存貯狀態,若該文件駐在內存,則返回其內存區地址add及長度size,同時將該文件的共享計數加1,這表明新進程將與其它進程共享一個純代碼程序;否則打開該文件,返回文件長度size,add=NIL。過程read讀入指定文件。過程insert(RQ,i)

12、將新進程插入就緒隊列RQ。otherinit表示對PCB的其它項置初值,如消息隊列信號量、進程現場等。EXE是執行態進程的PCB指針,本原語由執行態進程調用,故執行態進程就是新進程的父進程。本原語最后返回新進程的內部號,即PCB號。如果建立失敗,則返回NIL。第二章 進程及作業管理 一個進程一旦被建立便處于就緒狀態,隨時等候被進程調度選中并啟動執行。 一個進程在正常運行結束后,一般應主動終止而進入停止狀態,同時向父進程發一“完成”消息,等待父進程撤銷它,這通過調用“停止”原語實現。停止原語halt的大致描述如下:procedure halt;begin EXE.state:=stop; sen

13、d(EXE.parent,completed); EXE:=NIL; scheduler;end;第二章 進程及作業管理 撤銷原語可大致描述如下:procedure destory(i); begin if i.state stop then remove(i.queue,i); while i.children0 do begin i.children:=i.children-1; findchild(i,child); destory(child); end; memrelease(i.dataadd,i.datasize); close(g,t); if t=true then

14、 memrelease(i.textadd,i.textsize); resrelease(i); pcbrelease(i);end;第二章 進程及作業管理 其中,過程remove將指定進程移出所屬狀態隊列;過程findchild尋找指定進程的子進程,返回子進程的內部號;過程close關閉指定文件,若返回值t=true表示關閉成功,否則表示該文件為共享文件且正被其它進程所使用;過程resrelease釋放除內存之外的其它資源。本原語可遞歸調用,用以實現撤銷指定進程的子孫進程。第二章 進程及作業管理 3.2 掛起與激活掛起與激活 掛起原語suspend和激活原語activate的調用參數均為進

15、程內部號。它們可描述如下:procedure suspend(i); begin i.state:=if i.state=readythenreadys elsewaiteds; swapout(i.dataadd,i.datasize,add); i.swapadd:=add; memrelease(i.dataadd,i.datasize); close(g,t); if t=true then memrelease(i.textadd,i.textsize);end;第二章 進程及作業管理 其中, 調用了換出過程swapout將數據集復制到外存交換區并返回相應的地址。進程實體中

16、的執行程序并未被復制到交換區,因為執行程序文件尚在外存并未被撤銷,但仍要回收它所占用的內存空間(若它未被其它進程共享),這樣做的好處是減少了交換時間。procedure activate(i);begin memallocate(i.datasize,add); if add=NILthen return(false); swapin(i.swapadd,i.datasize,add); i.dataadd:=add; filestate(g,add,size); if add=NIL then begin第二章 進程及作業管理 memallocate(size,add); if a

17、dd=NIL then begin memrelease(i.dataadd,i.datasize); return(false); end; read(g,size,add); end; i.textadd:=add; i.state:=if i.state=readysthenready elsewaited; return(true);end;第二章 進程及作業管理 3.3 阻塞與喚醒阻塞與喚醒 進程從執行態到等待態以及從等待態到就緒態的過渡分別是通過阻塞原語block和喚醒原語wakeup實現的。 當現行進程需要等待某個事件時, 可調用block原語使自己加入到該事件的等待隊

18、列中,調用參數為等待隊列指針。操作系統為每類事件設置一個等待隊列,當某個事件發生時, 通過wakeup原語移出相應等待隊列中的某個進程, 將其送入應緒隊列,調用參數也是等待隊列指針,下面是block原語和wakeup原語的類PASCAL語言描述:第二章 進程及作業管理 procedure block(q);begin save(EXE); EXE.state:=waited; EXE.queue:=q; insert(q,EXE); EXE:=NIL; scheduler;endprocedure wakeup(q);begin outqueue(q,i); i.state:=if i.sta

19、te=waited then ready elsereadys; i.queue:=RQ; insert(RQ,i);end;第二章 進程及作業管理 4 進進 程程 同同 步步4.1 同步概念同步概念 對同步與互斥的上述解釋表明,它們的實質都是對進程在執行時序上的某種限制。因此,可把它們歸結為:并發進程在執行時序上的相互制約關系。這就是廣義同步概念。故在廣義上,互斥是一種特殊的同步。第二章 進程及作業管理 4.2 臨界區臨界區 并發進程可以共享系統中的各種資源,但是系統中某些資源具有一次只允許一個進程所使用的屬性,我們稱這樣的資源為臨界資源。換言之,若有一進程正在使用某臨界資源,那么其他欲使用

20、該資源的進程必須等待,只有當占有者釋放后,其他進程才能使用。也就是說,共享臨界資源的進程必須互相排斥。第二章 進程及作業管理 許多物理設備都屬于臨界資源,如輸入機、打印機、磁帶機等。還有許多可以被幾個進程所修改的共享變量(如公共變量、數據、表格、隊列等)也是臨界資源。例如,進程A和B共享一個公共變量count,都要對count執行“count:=count+1”操作,但是在許多計算機上完成這一操作,實際上是由三條指令來實現的,如: LD R1,count INC R1 LD count, R1第二章 進程及作業管理 由于進程A和B異步前進,故A、B中相同的這個指令串可能在逐條指令基礎上交叉執行

21、,比如產生序列: A:LD R1,count A:INC R1 B:LD R1,count A:LD count,R1 B:INC R1 B:LD count,R1 count經A、B訪問后,只加了1,而不是所希望的2。為了防止發生這種與時間有關的錯誤,變量count必須按臨界資源處理。第二章 進程及作業管理 系統的同步機構對解決臨界區互斥問題應遵循下述準則: (1)當無一進程處于臨界區內時,若有一進程要求進入臨界區,應讓其立即進入-有空讓進; (2)當已有進程在臨界區內時,其他欲進入臨界區的進程必須等待-無空等待; (3)當無一進程處于臨界區,而同時有多個進程要求進入臨界區,且僅讓其中之一進

22、入,其他則等待-多中擇一; (4)任一進程進入臨界區的要求應在有限時間滿足-有限等待; (5)處于等待進入臨界區的進程應放棄占用CPU-讓權等待。第二章 進程及作業管理 4.3 同步機構同步機構 1測試與設置測試與設置(Test and Set) 這是一種借助一條硬件指令Test and Set(簡記TS)來實現互斥的同步機構。許多計算機中都提供了這種指令,在IBM 370中稱TS指令,在Z 8000中稱TSET指令,在Intel 8086/8088中稱XCHG指令。TS指令的功能可用PASCAL語言描述如下:第二章 進程及作業管理 procedure TS(vara,b:boolean);v

23、ar temp:boolean;begin temp:=a; a:=b; () b:=temp end或 function TS(var b:boolean):boolean; begin TS:=b; b:=true() endv第二章 進程及作業管理 TS指令的執行是不可分割的,利用TS指令可以簡單而有效地實現互斥。 其方法是為每個臨界資源設置一個布爾變量lock(鎖),其初值為falsc,當lock值為false表示鎖打開,臨界資源未被使用,進程可進入臨界區;反之則表示鎖關閉,進程不能進入。于是用TS指令實現互斥的進程的程序結構為:第二章 進程及作業管理 var key: blooean

24、;begin key:=true; while key do TS(lock,key); () CS (臨界區); lock:=false; end或begin while TS (lock) do skip; CS;() lock:=false; end第二章 進程及作業管理 2信號量和信號量和P、V操作操作 荷蘭的著名計算機科學家Dijkstra把互斥的關鍵含義抽象成信號量(semaphore)概念,并引入在信號量上的P、V操作作為同步原語(P和V分別是荷蘭文的“等待”和“發信號”兩詞的首字母)。信號量是個被保護的量,只有P、V操作和信號量初始化操作才能訪問和改變它的值,Dijkstra把

25、信號量s定義為一個非負整型量。把信號量s上的P操作P(s)定義為:若s0,則s值減1,否則執行進程等待,直到其他進程對s進行V操作。把信號量s上的V操作V(s)定義為:s值加1,若有進程在s上等待,則喚醒其中一個進程。第二章 進程及作業管理 信號量和P、V操作原語可構成“阻塞-喚醒”同步機構:當一個進程對值為0的信號量執行P操作時便被阻塞以等待某個事件的出現;在另一進程檢測到該事件發生時,通過執行V操作喚醒被阻塞的進程。在實現該同步機構時,可采取“忙等待”方式也可采取“讓權等待”方式。在忙等待方式下,被阻塞進程在不主動放棄處理機的情況下忙碌等待著其他進程來喚醒它,顯然這不利于處理機的有效利用。

26、讓權等待方式,即當執行進程必須在某信號量上等待時,就將該進程變為等待狀態,并將其插入與此信號量相關的等待隊列中,以讓出處理機給其他就緒進程。在單機系統中普遍采用讓權等待方式。而在多機系統中,為減少進程狀態變換而引起的開銷,可采取忙等待方式。另外,在具體實現時通常要對Dijkstra的原定義進行改進。第二章 進程及作業管理 (1)忙等待方式的P、V操作。 vars: integer; P(s):while s 0 do skip; s:=s-1; V(s):s:=s+1; 當一進程在值不大于0的信號量s上執行P操作時,將在循環語句while上陷入忙等待,直到其他進程在該信號量s上執行V操作后,解

27、除它的等待。不難看出這種形式的P、V操作完全可用硬件指令來實現。第二章 進程及作業管理 (2)讓權等待方式的P、V操作。采取這種方式需要對原信號量定義進一步擴充,把信號量由整型量擴充成為記錄形式: type psem=semaphore semaphore=record value: integer; qucue: pointer to WQ; end即信號量s是二元組s(v,q),v是信號量s的值,它是個整型量,q是指向s等待隊列WQ的隊首指針。于是P、V操作可分別描述為:第二章 進程及作業管理 procedure p(s);var s: psem;begin s.v:=s.v-1; if

28、s.v0表示某類資源的當前可用數。 每執行一次P操作意味著請求分配一個單位的資源,因此描述為s.v:=s.v-1; s.v0表示該類資源已不能供分配,因此請求資源的進程將被阻塞在等待隊列s.q中,此時s.v的絕對值等于等待隊列s.q中的進程數。執行一次V操作意味著釋放一個單位資源,故描述為.v:=s.v+1,若s.v0,表示在等待隊列s.q中有因請求該資源不能滿足而被阻塞的進程,因此喚醒等待隊列s.q中的第一個或優先數最高的進程,允許其使用該資源。第二章 進程及作業管理 4.4 信號量的應用信號量的應用1臨界區的互斥臨界區的互斥 利用信號量可方便地實現臨界區的互斥執行。此時信號量是公用信號量,

29、它的初值為1,每個進程均可對它施行P、V操作。設mutex為互斥信號量,其初值為1,表示對應的臨界資源R未被占用。對于每個想使用R的進程,只需把它們的臨界區CS置于P(mutex)和V(mutex)之間,即可實現互斥。下面給出這種模型的大致描述:第二章 進程及作業管理 var mutex: psem;procedure processl begin while true do begin p(mutex); CS1; V(mutex); end end;第二章 進程及作業管理 procedure process 2:;procedure process n:;begin seminitial(

30、mutex.v,l); cobegin process 1; process 2; process n; coendend第二章 進程及作業管理 2合作進程的同步合作進程的同步 利用信號量同樣可以方便地實現合作進程之間的同步。方法是為某個事件設置一個信號量event,event.v的初值為0,表示該事件還未發生,當一進程需要等待event對應的事件時執行P(event),如果此時event.v=0,則阻塞該進程,將它掛入event的等待隊列;若event.v=1,則表示事件已發生,該進程可繼續執行。當某進程完成了event的事件時,立即執行V(event)喚醒event等待隊列中的某個進程。

31、我們把信號量event稱為私用信號量,即只有需要等待event相應事件發生的進程或說需要其它某個進程給予合作的進程在event上執行P操作,而完成event事件的進程或說提供合作的進程只在event上執行V操作。第二章 進程及作業管理 3生產者與消費者關系生產者與消費者關系圖2-6 環形緩沖池第二章 進程及作業管理 基于環形緩沖池的生產者與消費者關系的形式描述,設: (1)公用信號量mutex:初值為1,用于實現臨界區互斥; (2)生產者私用信號量empty:初值為n,指示空緩沖塊數目; (3)消費者私用信號量full:初值為0,指示滿緩沖塊數目; (4)整型量i和j:初值均為0,i指示首空緩

32、沖塊序號,j指示首滿緩沖塊序號。var mutex, empty, full: psem; i,j: integer; buffer: array 0n-1 of stuff;procedure producer; 生產者進程 begin while true do begin第二章 進程及作業管理 produce next product; P(empty); P(mutex); buffer(i):=product; i:=(i+1)mod n; V(mutex); V(full) endend;procedure consumer; 消費者進程 begin while true do b

33、egin第二章 進程及作業管理 P(full); P(mutex) goods:=buffer(j); j:=(j+1)mod n; V(mutex); V(empty); consume product end end;begin seminitial(mutex.v ,1;empty.v,n;full.v,0); i:=j:=0; cobegin producer; consumer; coendend第二章 進程及作業管理 4讀者與寫者關系讀者與寫者關系 設某航空公司有2個售票處,它們通過遠程終端訪問設在公司總部的航空訂票系統,并要查詢或修改系統中記錄所有班機當前訂票數的數據庫B。設Bi

34、為某班機的當前訂票數,P1和P2分別代表2個售票處的售票進程,R1和R2為進程執行時使用的工作寄存器。由于售票進程并發執行,且各自訪問數據庫B的時間是隨機的,故有可能出現下面的訪問序列(假定Bi的當前值為x):第二章 進程及作業管理 P1:R1:=Bi R1:=R1+1P2:R2:=Bi R2:=R2+1Bi:=R2 P1:Bi:=R1 可見,Bi的新值是X+1,而不是正確的X+2。這里的P1和P2均為寫者,顯然,對于寫者Bi為臨界資源,因此寫者應該互斥。第二章 進程及作業管理 讀者進程與寫者進程的一般結構:讀者進程與寫者進程的一般結構:var mutex,wrt:psem; readcoun

35、t:integer; seminit(mutex.v,1;wrt.v,1); readcount:=0;cobegin procedure reader; begin P(mutex); readcount:=readcount+1; if readcount=1 then P(wrt); V(mutex);第二章 進程及作業管理 reading is perfermed; P(mutex); readcount:=readcount-1; if readcount=0 then (wrt); V(mutex); end;Procedure writer; begin (wrt); writi

36、ng is perfermed; V(wrt); end;coend;第二章 進程及作業管理 4.5 管程概念管程概念 建立管程的基本理由是:由于對臨界區的執行分散在各進程中,這樣不便于系統對臨界資源的控制和管理,也很難發現和糾正分散在用戶程序中的對同步原語的錯誤使用等問題。為此,應把分散的各同類臨界區集中起來。并為每個可共享資源設立一個專門的管程來統一管理各進程對該資源的訪問。這樣既便于系統管理共享資源,又能保證互斥訪問。管程主要由兩部分組成: (1)局部于該管程的共享數據,這些數據表示了相應資源的狀態; (2)局部于該管程的若干過程,每個過程完成關于上述數據的某種規定操作。第二章 進程及作

37、業管理 局部于管程內的數據結構只能被該管程內的過程所訪問,反之,局部于管程內的過程只能訪問該管程內的數據結構。因此管程就如同一堵圍墻把關于某個共享資源的抽象數據結構以及對這些數據施行特定操作的若干過程圍了起來。任一進程要訪問某個共享資源,就必須通過相應的管程才能進入。為了實現對臨界資源的互斥訪問,管程每次只允許一個進程進入其內(即訪問管程內的某個過程),這是由編譯系統保證的。例如,并發PASCAL編譯程序在編譯源程序時,對每一個形如: cedure/function-entry-name的調用語句,都將自動保證其按如下方式執行: P(mutex); 執行相應的過

38、程或函數V(mutex);其中,mutex是關于相應管程的互斥信號量,初值為1。第二章 進程及作業管理 管理環形緩沖池的管程結構。monitor ringbuffer;var rbuffer:array0.n-1 of stuff; k,nextempty,nextfull:integer; empty,full:condition;procedure entry put(var product:stuff); begin if k=n wait(empty); rbuffernextempty:=product; k:=k+1; nextempty:=(nextempty+1)mod n;

39、signal(full); end;第二章 進程及作業管理 procedure entry get(var goods:stuff);begin if k=0 wait(full); goods:=rbuffernextfull; k:=k-1; nextfull:=(nextfull+1)mod n; signal(empty); end;begin k:=0; nextempty:=0;nextfull:=0;end;第二章 進程及作業管理 管程ringbuffer包含兩個局部過程:過程put負責執行將數據寫入某個緩沖塊的操作;過程get負責執行從某個緩沖塊讀取數據的操作。empty和fu

40、ll被定義為兩個條件變量,對應于緩沖池滿和緩沖池空條件等待隊列。任一進程都必須通過調用管程ringbuffer來使用環形緩沖池,生產者進程調用其中的put過程,消費者進程調用get過程第二章 進程及作業管理 5 進進 程程 通通 訊訊5.1 消息緩沖通訊消息緩沖通訊 消息緩沖通訊技術是由Hansen首先提出的,其基本思想是:根據生產者與消費者關系原理,利用內存的公用消息緩沖池實現進程之間的信息交換。第二章 進程及作業管理 (1)公用消息緩沖池buffpool 這是一個結構數組, 數組元素是消息緩沖塊buffblock, 即 vat buffpool:array0n-1of buffblock;

41、 (2)消息緩沖塊buffblock 這是一個記錄結構,包含下列內容: sender:消息發送者名 size:消息長度 text:消息正文 next:指向消息隊列中的下一個第二章 進程及作業管理 (5)emphead 空緩隊列首指針,緩沖池中所有空閑緩沖塊組成一個空緩隊列。 (6)emptail 空緩隊列尾指針。 (7)mq 進程的消息隊列首指針,設置在PCB中。 (8)mmutex 進程的消息隊列互斥信號量,初值為1,設置在PCB中。 (9)msyn 同步信號量,用于消息隊列中的消息計數,初值為0,設置在PCB中。第二章 進程及作業管理 (10)發送消息原語send(receiver,a)

42、進程可調用本原語向其它進程發送一則消息,調用參數receiver為接收進程名,a為發送者在自己的內存工作區內存放待發送消息的內存區地址。 (11)接收消息原語receive(a) 進程可調用本原語摘取消息隊列中的一則消息, 調用參數a為接收者在自己的內存工作區內準備復制消息的接收區地址。第二章 進程及作業管理 圖圖2-7是消息緩沖通訊是消息緩沖通訊第二章 進程及作業管理 下面是send原語的類PASCAL語言描述:procedure send(receiver,a)begin getid(receiver,i); if i=NIL then return(false); P(buffempty

43、); P(buffmutex); k:=emphead; emphead;=buffpoolk.next; V(buffmutex); buffpoolk.sender:=a.sender; buffpoolk.size:=a.size; buffpoolk.text:=a.text; buffpoolk.next:=NIL; P(i.mmutex); insert(i.mq,k); V(i.mmutex); V(i.msyn); return(true);end;第二章 進程及作業管理 5.2 管道通訊管道通訊1. pipe的建立和使用方式的建立和使用方式圖圖2-8 兩個進程共享一個兩個進程共享一個pipe第二章 進程及作業管理 2. pipe操作的同步與互斥操作的同步與互斥 在對pipe文件進行讀寫操作過程中要對發送進程和接收進程實施正確的同步和互斥,以確保通訊的正確性。 接收進程讀pipe時,若發現pipe為空,則進入等待狀態。一旦有發送進程對該pipe執行寫操作時便喚醒等待進程。不論是讀或寫pipe時,都要考慮信

溫馨提示

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

評論

0/150

提交評論