c3第三章 進(jìn)程管理_第1頁
c3第三章 進(jìn)程管理_第2頁
c3第三章 進(jìn)程管理_第3頁
c3第三章 進(jìn)程管理_第4頁
c3第三章 進(jìn)程管理_第5頁
已閱讀5頁,還剩92頁未讀, 繼續(xù)免費閱讀

付費下載

下載本文檔

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

文檔簡介

1、1第三章 進(jìn)程管理3.1 進(jìn)程(PROCESS)概念3.2 進(jìn)程控制3.3 線程(THREAD)3.4 進(jìn)程互斥和同步3.5 進(jìn)程間通信(IPC, INTER-PROCESS COMMUNICATION)3.6 死鎖問題(DEADLOCK)3.7 進(jìn)程其他方面的舉例 為了描述程序在并發(fā)執(zhí)行時對系統(tǒng)資源的共享,需要一個描述程序執(zhí)行時動態(tài)特征的概念,這就是進(jìn)程。在本章中,我們將討論進(jìn)程概念、進(jìn)程控制、進(jìn)程間同步和互斥、進(jìn)程的通信和死鎖等問題。23.1 進(jìn)程(PROCESS)概念3.1.1 程序的順序執(zhí)行和并發(fā)執(zhí)行3.1.2 進(jìn)程的定義和描述3.1.3 進(jìn)程的狀態(tài)轉(zhuǎn)換返回33.1.1 程序的順序執(zhí)行

2、和并發(fā)執(zhí)行(P37)程序的執(zhí)行有兩種方式:順序執(zhí)行和并發(fā)執(zhí)行。n順序執(zhí)行是單道程序系統(tǒng)的執(zhí)行方式;n并發(fā)執(zhí)行是指多個程序在同一時間段內(nèi)執(zhí)行,多個程序交替得到處理機的執(zhí)行。4順序執(zhí)行的特征n順序性:按照程序結(jié)構(gòu)所指定的次序(可能有分支或循環(huán))執(zhí)行;n封閉性:獨占計算機的全部資源,計算機的狀態(tài)只由該程序的控制邏輯所決定;n可再現(xiàn)性:初始條件相同則結(jié)果相同。如:可通過空指令控制時間關(guān)系。同一個程序反復(fù)執(zhí)行,其結(jié)果應(yīng)該一樣。5并發(fā)執(zhí)行的特征n間斷(異步)性:“走走停?!保粋€程序可能走到中途停下來,由其他程序執(zhí)行;n失去封閉性:共享資源,受其他程序的控制邏輯的影響。如:一個程序?qū)懙酱鎯ζ髦械臄?shù)據(jù)可能被

3、另一個程序修改,失去原有的不變特征。n失去可再現(xiàn)性:失去封閉性 失去可再現(xiàn)性;外界環(huán)境在程序的兩次執(zhí)行期間發(fā)生變化,失去原有的可重復(fù)特征。6并發(fā)執(zhí)行的條件:達(dá)到封閉性和可再現(xiàn)性并發(fā)執(zhí)行的條件:達(dá)到封閉性和可再現(xiàn)性將程序中任一語句將程序中任一語句 Si Si 劃分為兩個變量的集劃分為兩個變量的集合(讀集和寫集合(讀集和寫集 R(Si)R(Si)和和W(SiW(Si) ),分別是要進(jìn),分別是要進(jìn)行讀和寫操作的變量集合)行讀和寫操作的變量集合)條件:任意兩個語句條件:任意兩個語句S1,S2S1,S2,若有:,若有:nR(i)R(i)W(j)=W(j)=; ;nW(i)W(i)R(j)=R(j)=;

4、;nW(i)W(i)W(j)=W(j)=; ; 則這兩條語句可并發(fā)執(zhí)行。則這兩條語句可并發(fā)執(zhí)行。并發(fā)執(zhí)行失去封閉性的原因是共享資源的影響,去掉這種影響并發(fā)執(zhí)行失去封閉性的原因是共享資源的影響,去掉這種影響就行了。就行了。19661966年,由年,由BernsteinBernstein給出并發(fā)執(zhí)行的條件。(在這里給出并發(fā)執(zhí)行的條件。(在這里沒有考慮語句執(zhí)行速度的影響。)沒有考慮語句執(zhí)行速度的影響。)前兩條保證一個程序的兩次讀之間數(shù)據(jù)不變化;最后一條前兩條保證一個程序的兩次讀之間數(shù)據(jù)不變化;最后一條保證寫的結(jié)果不丟掉。保證寫的結(jié)果不丟掉。7程序的并發(fā)執(zhí)行所帶來的影響并發(fā)執(zhí)行的優(yōu)點并發(fā)執(zhí)行的優(yōu)點:n

5、提供資源的利用率;提供資源的利用率;n提供系統(tǒng)的吞吐率。提供系統(tǒng)的吞吐率。并發(fā)執(zhí)行的缺點并發(fā)執(zhí)行的缺點:n加劇系統(tǒng)資源競爭;加劇系統(tǒng)資源競爭;n管理開銷增加。管理開銷增加。83.1.2 進(jìn)程的定義和描述進(jìn)程:一個具有獨立功能的程序?qū)δ硞€數(shù)據(jù)集在處理機上的一次執(zhí)行過程和分配資源的基本單位。為解決并發(fā)環(huán)境下的問題,操作系統(tǒng)引入了進(jìn)程概念9進(jìn)程的特征動態(tài)性:進(jìn)程是(程序)動態(tài)的執(zhí)行過程;獨立性:各進(jìn)程的地址空間相互獨立,除非采用進(jìn)程間通信手段;并發(fā)性:進(jìn)程可以并發(fā)執(zhí)行;異步性:進(jìn)程之間的執(zhí)行速度是不確定的;進(jìn)程間可以相互作用。10進(jìn)程與程序的區(qū)別進(jìn)程是動態(tài)的,程序是靜態(tài)的:程序是有序代碼的集合;進(jìn)程

6、是程序的執(zhí)行。通常進(jìn)程不可在計算機之間遷移;而程序通常對應(yīng)著文件、靜態(tài)和可以復(fù)制。進(jìn)程是暫時的,程序的永久的:進(jìn)程是一個狀態(tài)變化的過程,動態(tài)地被創(chuàng)建,執(zhí)行后消亡。程序可長久保存。進(jìn)程與程序的組成不同:進(jìn)程的組成包括程序、數(shù)據(jù)和進(jìn)程控制塊(即進(jìn)程狀態(tài)信息)。進(jìn)程具有并發(fā)特征(獨立性和異步性),而程序沒有。進(jìn)程與程序的對應(yīng)關(guān)系:通過多次執(zhí)行,一個程序可對應(yīng)多個進(jìn)程;通過調(diào)用關(guān)系,一個進(jìn)程可包括多個程序。11作業(yè)與進(jìn)程的區(qū)別作業(yè)是用戶向計算機提交任務(wù)的實體,被提交后進(jìn)入外存的作業(yè)等待隊列。而進(jìn)程是完成用戶任務(wù)的執(zhí)行實體,被創(chuàng)建后,總有相應(yīng)部分常駐內(nèi)存;一個作業(yè)至少由一個進(jìn)程來執(zhí)行完成,反之不然;作業(yè)

7、的概念主要用于批處理操作系統(tǒng);而進(jìn)程的概念幾乎用于所有的多道操作系統(tǒng)中。12進(jìn)程的組成程序:描述進(jìn)程要完成的功能,規(guī)定指令的執(zhí)行順序。數(shù)據(jù):程序執(zhí)行時需要的數(shù)據(jù),操作對象。進(jìn)程控制塊(PCB):存儲有關(guān)進(jìn)程的各種信息,操作系統(tǒng)根據(jù)它來控制和管理進(jìn)程。13進(jìn)程控制塊 (PCB, process control block)每個進(jìn)程在OS中的登記表項(可能有總數(shù)目限制),OS據(jù)此對進(jìn)程進(jìn)行控制和管理;處于核心段(管態(tài)或核心態(tài)),通常不能由應(yīng)用程序自身的代碼來直接訪問,而要通過系統(tǒng)調(diào)用等方式訪問。進(jìn)程控制塊是由OS維護(hù)的用來記錄進(jìn)程相關(guān)信息的一塊內(nèi)存。14進(jìn)程控制塊的內(nèi)容進(jìn)程描述信息:n進(jìn)程標(biāo)識符(

8、process ID),唯一,通常是一個整數(shù);n進(jìn)程名,通?;诳蓤?zhí)行文件名(不唯一);n用戶標(biāo)識符(user ID);進(jìn)程家族關(guān)系進(jìn)程控制信息:n當(dāng)前狀態(tài);n優(yōu)先級(priority);n代碼執(zhí)行入口地址;n程序的外存地址;n運行統(tǒng)計信息(執(zhí)行時間、頁面調(diào)度);n進(jìn)程間同步和通信信息;阻塞原因資源管理信息:虛擬地址空間的使用狀況、打開文件列表CPU現(xiàn)場保護(hù)結(jié)構(gòu):寄存器值(通用、程序計數(shù)器PC、狀態(tài)PSW,地址包括棧指針)15進(jìn)程上下文 一個進(jìn)程的執(zhí)行是在該進(jìn)程的上下文中執(zhí)行的,當(dāng)系統(tǒng)調(diào)度新進(jìn)程占用處理機時,新老進(jìn)程的上下文將進(jìn)行切換。進(jìn)程上下文是對進(jìn)程執(zhí)行活動全過程的靜態(tài)描述。進(jìn)程上下文由進(jìn)

9、程的用戶地址空間內(nèi)容(正文段、數(shù)據(jù)集等)、硬件寄存器內(nèi)容及與該進(jìn)程相關(guān)的核心數(shù)據(jù)結(jié)構(gòu)組成。16進(jìn)程空間任一進(jìn)程都有自己的地址空間,稱為進(jìn)程空間,由用戶空間和系統(tǒng)空間組成。用戶程序在用戶空間執(zhí)行,只能執(zhí)行普通指令,稱處于用戶態(tài);操作系統(tǒng)內(nèi)核在系統(tǒng)空間執(zhí)行,可執(zhí)行所有指令,稱處于系統(tǒng)態(tài)(核心態(tài)、管理態(tài))。計算機系統(tǒng)通過設(shè)置程序狀態(tài)寄存器等設(shè)置不同的狀態(tài)。173.1.3 進(jìn)程的狀態(tài)轉(zhuǎn)換在進(jìn)程的生命期內(nèi),一個進(jìn)程至少具有三種基本狀態(tài):執(zhí)行狀態(tài)、等待狀態(tài)、就緒狀態(tài)。n處于執(zhí)行狀態(tài)(Running)的進(jìn)程正在處理機上執(zhí)行,在單CPU系統(tǒng)中任意時刻處于執(zhí)行狀態(tài)的進(jìn)程只能有一個;n處于就緒狀態(tài)(Ready)的

10、進(jìn)程已獲得除處理機外的所需資源,等待分配處理機資源,只要分配CPU就可執(zhí)行;n等待狀態(tài)(Blocked):處于執(zhí)行狀態(tài)的進(jìn)程因為等待某個I/O設(shè)備或是等待某個事件的發(fā)生而進(jìn)入等待狀態(tài)。18進(jìn)程狀態(tài)轉(zhuǎn)換就緒等待執(zhí)行因為等待某個事件的發(fā)生而睡眠 時間片到(分時系統(tǒng))調(diào)度因為等待的事件已經(jīng)發(fā)生而喚醒進(jìn)程的狀態(tài)轉(zhuǎn)換193.2 進(jìn)程控制3.2.1 進(jìn)程控制的功能3.2.2 進(jìn)程的創(chuàng)建、退出、 阻塞和喚醒返回203.2.1 進(jìn)程控制的功能進(jìn)程控制的功能進(jìn)程控制:系統(tǒng)使用一些具有特殊功能的程序段進(jìn)程控制:系統(tǒng)使用一些具有特殊功能的程序段來創(chuàng)建、撤銷進(jìn)程以及完成進(jìn)程各狀態(tài)的轉(zhuǎn)換,來創(chuàng)建、撤銷進(jìn)程以及完成進(jìn)程各

11、狀態(tài)的轉(zhuǎn)換,從而達(dá)到多進(jìn)程高效率并發(fā)執(zhí)行和協(xié)調(diào)、實現(xiàn)資從而達(dá)到多進(jìn)程高效率并發(fā)執(zhí)行和協(xié)調(diào)、實現(xiàn)資源共享的目的,通常使用原語實現(xiàn)。源共享的目的,通常使用原語實現(xiàn)。原語原語(primitive)(primitive):一類是機器指令級的,其特:一類是機器指令級的,其特點是執(zhí)行期間不允許中斷,正如在物理學(xué)的原子點是執(zhí)行期間不允許中斷,正如在物理學(xué)的原子一樣,在操作系統(tǒng)中,是一個不可分割的執(zhí)行單一樣,在操作系統(tǒng)中,是一個不可分割的執(zhí)行單位;另一類是功能級的,其特點是作為原語的程位;另一類是功能級的,其特點是作為原語的程序段不允許并發(fā)執(zhí)行。這兩類原語都在系統(tǒng)態(tài)下序段不允許并發(fā)執(zhí)行。這兩類原語都在系統(tǒng)態(tài)下

12、運行,并且都是為了完成某個系統(tǒng)管理所需要的運行,并且都是為了完成某個系統(tǒng)管理所需要的功能和被高層軟件所調(diào)用。功能和被高層軟件所調(diào)用。213.2.2 進(jìn)程的控制1.進(jìn)程創(chuàng)建(創(chuàng)建原語)進(jìn)程創(chuàng)建的方式: 由系統(tǒng)程序模塊統(tǒng)一創(chuàng)建; 由父進(jìn)程創(chuàng)建,例如在層次結(jié)構(gòu)的系統(tǒng)中,父進(jìn)程創(chuàng)建子進(jìn)程以完成并行工作。入口查PCB鏈表有空PCB?取空表PCB(i)將有關(guān)參數(shù)填入PCB(i)相應(yīng)項PCB(i)入就緒隊列PCB(i)入進(jìn)程家族或進(jìn)程鏈返回創(chuàng)建失敗222. 進(jìn)程撤銷入口返回查進(jìn)程鏈表或進(jìn)程家族有此PCB嗎?該PCB有子進(jìn)程嗎?釋放該進(jìn)程所占有的資源釋放該PCB結(jié)構(gòu)本身出錯處理進(jìn)程撤銷的時機:該進(jìn)程已經(jīng)完成所

13、要求的功能而正常終止;由于某種錯誤導(dǎo)致非正常終止;祖先進(jìn)程要求撤銷某個子進(jìn)程;233.進(jìn)程的阻塞(阻塞原語)入口保存當(dāng)前進(jìn)程的CPU現(xiàn)場置該進(jìn)程的狀態(tài)被阻塞進(jìn)程入等待隊列轉(zhuǎn)進(jìn)程調(diào)度阻塞原語在一個處于執(zhí)行狀態(tài)的進(jìn)程期待某一事件(例如鍵盤輸入數(shù)據(jù)、寫盤、等待其它進(jìn)程發(fā)來的數(shù)據(jù)或是申請打印機等)的發(fā)生,但發(fā)生條件尚不具備時,被該進(jìn)程自己調(diào)用來阻塞自己。244.進(jìn)程的喚醒(喚醒原語)入口從等待隊列中摘下被喚醒進(jìn)程將被喚醒進(jìn)程置為就緒狀態(tài)將被喚醒進(jìn)程送入就緒隊列轉(zhuǎn)進(jìn)程調(diào)度或返回當(dāng)?shù)却犃兄械倪M(jìn)程所等待的事情發(fā)生時,等待該事件的所有進(jìn)程都將被喚醒。思考一下:為什么一個處于阻塞狀態(tài)的進(jìn)程不可能自己喚醒自己?

14、喚醒一個進(jìn)程的兩種方法:由系統(tǒng)進(jìn)程喚醒;由事件發(fā)生進(jìn)程喚醒。253.3 線程(THREAD) P743.3.1 線程的引入3.3.2 進(jìn)程和線程的比較3.3.3 線程舉例引入線程的目的是提高系統(tǒng)的執(zhí)行效率,減少處理機的空轉(zhuǎn)時間和調(diào)度切換時間,以及便于管理。263.3.1 線程的引入關(guān)于線程的理解 線程通常被定義為一個進(jìn)程中代碼的不同執(zhí)行路線。也就是說,一個進(jìn)程中,可以有多個不同的代碼路線在同時執(zhí)行。例如,常見的字處理程序中,主線程處理用戶輸入,而其他并行運行的線程在必要時可在后臺保存用戶的文檔。我們也可以說線程是“輕量級進(jìn)程”。在 Linux 中,每個進(jìn)程由五個基本的部分組成:代碼、數(shù)據(jù)、棧、

15、文件I/O 和信號表。因此,系統(tǒng)對進(jìn)程的處理要花費更多的開銷,尤其在進(jìn)行進(jìn)程調(diào)度和任務(wù)切換時。從這個意義上,我們可以將一般的進(jìn)程理解為重量級進(jìn)程。在重量級進(jìn)程之間,如果需要共享信息,一般只能采用管道或者共享內(nèi)存的方式實現(xiàn)。如果重量級進(jìn)程通過 fork() 派生了子進(jìn)程,則父子進(jìn)程之間只有代碼是共享的。 而我們這里提到的線程,則通過共享一些基本部分而減輕了部分系統(tǒng)開支。通過共享這些基本組成部分,可以大大提高任務(wù)切換效率。27線程的概念一個進(jìn)程內(nèi)的基本調(diào)度單位成為線程或稱為輕權(quán)進(jìn)程,這個調(diào)度單位既可以由操作系統(tǒng)內(nèi)核控制的,也可以由用戶程序控制的。28未引入線程前的進(jìn)程:進(jìn)程是資源分配單位(存儲器、

16、文件)和CPU調(diào)度(分派)單位。又稱為任務(wù)(task)“。引入線程之后:線程作為CPU調(diào)度單位,而進(jìn)程只作為其他資源分配單位。n線程只擁有必不可少的資源,如:線程狀態(tài)、寄存器上下文和棧n同樣具有就緒、阻塞和執(zhí)行三種基本狀態(tài)線程的優(yōu)點:減小并發(fā)執(zhí)行的時間和空間開銷(線程的創(chuàng)建、退出和調(diào)度),因此容許在系統(tǒng)中建立更多的線程來提高并發(fā)程度。n線程的創(chuàng)建時間比進(jìn)程短;n線程的終止時間比進(jìn)程短;n同進(jìn)程內(nèi)的線程切換時間比進(jìn)程短;n由于同進(jìn)程內(nèi)的線程間共享內(nèi)存和文件資源,可直接進(jìn)行不通過內(nèi)核的通信。29one processone threadmultiple processesone thread pe

17、r processone processmultiple threadsmultiple processesmultiple threads per process進(jìn)程與線程的關(guān)系3.3.2 進(jìn)程和線程的比較30地址空間和其他資源(如打開文件):進(jìn)程間相互獨立,同一進(jìn)程的各線程間共享某進(jìn)程內(nèi)的線程在其他進(jìn)程不可見通信:進(jìn)程間通信IPC,線程間可以直接讀寫進(jìn)程數(shù)據(jù)段(如全局變量)來進(jìn)行通信需要進(jìn)程同步和互斥手段的輔助,以保證數(shù)據(jù)的一致性調(diào)度:線程上下文切換比進(jìn)程上下文切換要快得多。3.3.3 線程舉例時間用戶程序服務(wù)器1服務(wù)器2RPC請求1RPC請求2結(jié)果1結(jié)果2用戶程序服務(wù)器1服務(wù)器2RPC請

18、求1RPC請求2結(jié)果1結(jié)果2323.4 進(jìn)程互斥和同步(P49)3.4.1 臨界資源3.4.2 信號量(semaphore)3.4.3 經(jīng)典進(jìn)程同步問題3.4.4 管程(monitor)3.4.5 進(jìn)程互斥和同步舉例333.4.1 臨界資源3.4.1.1臨界資源3.4.1.2臨界區(qū)的訪問過程3.4.1.3互斥的問題343.4.1.1臨界資源由臨界資源產(chǎn)生進(jìn)程間的制約關(guān)系-間接制約:由于某些臨界資源的存在,導(dǎo)致進(jìn)程只能互斥地訪問這些資源。另一種進(jìn)程間的制約關(guān)系-直接制約:某些進(jìn)程之間存在協(xié)作關(guān)系,一個進(jìn)程等待來自其他進(jìn)程(合作進(jìn)程)的信息,比如“同步”關(guān)系。如計算進(jìn)程和打印進(jìn)程的關(guān)系。多道程序環(huán)

19、境下進(jìn)程之間存在資源共享,進(jìn)程的運行時間受影響。臨界資源-硬件或軟件(如外設(shè)、共享代碼段、共享數(shù)據(jù)結(jié)構(gòu)),多個進(jìn)程在對其進(jìn)行訪問時(關(guān)鍵是進(jìn)行寫入或修改),必須互斥地進(jìn)行有些共享資源可以同時訪問,如只讀數(shù)據(jù),但有些資源必須互斥進(jìn)行,如對打印機設(shè)備的申請。35一個火車售票系統(tǒng),如N個終端,售票時可能出現(xiàn)如下情況:T1READ(X);IF X=1 THEN X:=X-1;WRITE(X);T2READ(X);IF X=1 THEN X:=X-1;WRITE(X);直到N終端產(chǎn)生售票沖突,出現(xiàn)一張票(同一車次、同一座位)賣給多個旅客的現(xiàn)象。在這里車票就屬于臨界資源。36多個進(jìn)程申請打印機,但作為打印

20、機只能為一個進(jìn)程提供服務(wù),其他的進(jìn)程只能在打印機等待隊列里等待,待打印機空閑時,進(jìn)入打印機。打印機就是一個臨界資源。P1P2P3占用等待等待373.4.2 臨界區(qū)的表示方法entry sectionexit section critical section remainder section臨界區(qū)38臨界區(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ū)(remaind

21、er section):代碼中的其余部分。393.4.1.3 互斥的問題互斥:一組并發(fā)進(jìn)程中的一個或多個程序段,因共享某一共享資源而導(dǎo)致它們必須以一個不允許交叉執(zhí)行的單位執(zhí)行,也就是說不允許兩個以上的共享資源的并發(fā)進(jìn)程同時進(jìn)入臨界區(qū)稱為互斥?;コ鈭?zhí)行應(yīng)遵循的準(zhǔn)則:n空閑則入:其他進(jìn)程均不處于臨界區(qū);n忙則等待:已有一進(jìn)程處于其臨界區(qū);n有限等待:等待進(jìn)入臨界區(qū)的進(jìn)程不能無限等待;n讓權(quán)等待:不能進(jìn)入臨界區(qū)的進(jìn)程,應(yīng)釋放CPU(如轉(zhuǎn)換到阻塞狀態(tài)),不阻止其它進(jìn)程進(jìn)入。403.4.2 信號量信號量(semaphore)3.4.2.1 信號量和信號量和P、V原語原語 多道程序并發(fā)執(zhí)行需要一個地位高于

22、進(jìn)程的管理者來解決多道程序并發(fā)執(zhí)行需要一個地位高于進(jìn)程的管理者來解決公有資源的使用問題。公有資源的使用問題。OS可從進(jìn)程管理者的角度來處理互斥的可從進(jìn)程管理者的角度來處理互斥的問題,信號量就是問題,信號量就是OS提供的管理公有資源的有效手段。提供的管理公有資源的有效手段。413.4.2.1 信號量和信號量和P、V原語原語1965年,由荷蘭學(xué)者年,由荷蘭學(xué)者Dijkstra提出(所以提出(所以P、V分別分別是荷蘭語的是荷蘭語的test(proberen)和和increment(verhogen)),是一種卓有成效的進(jìn)程),是一種卓有成效的進(jìn)程同步機制。同步機制。每個信號量每個信號量s除一個整數(shù)值

23、除一個整數(shù)值s.count(計數(shù))外,還(計數(shù))外,還有一個進(jìn)程等待隊列有一個進(jìn)程等待隊列s.queue,隊列中是阻塞在該,隊列中是阻塞在該信號量的各個進(jìn)程的標(biāo)識信號量的各個進(jìn)程的標(biāo)識n信號量只能通過初始化和兩個標(biāo)準(zhǔn)的原語來訪問信號量只能通過初始化和兩個標(biāo)準(zhǔn)的原語來訪問n初始化指定一個非負(fù)整數(shù)值,表示空閑資源總數(shù)(又稱為初始化指定一個非負(fù)整數(shù)值,表示空閑資源總數(shù)(又稱為資源信號量資源信號量)若為非負(fù)值表示當(dāng)前的空閑資源數(shù),)若為非負(fù)值表示當(dāng)前的空閑資源數(shù),若為負(fù)值其絕對值表示當(dāng)前等待臨界區(qū)的進(jìn)程數(shù)若為負(fù)值其絕對值表示當(dāng)前等待臨界區(qū)的進(jìn)程數(shù)二進(jìn)制信號量二進(jìn)制信號量(binary semaphor

24、e):只允許信:只允許信號量取號量取0或或1值值421. P原語原語wait(s)-s.count;/表示申請一個資源表示申請一個資源;if (s.count =0調(diào)用進(jìn)程入等待隊列調(diào)用進(jìn)程入等待隊列轉(zhuǎn)進(jìn)程調(diào)度轉(zhuǎn)進(jìn)程調(diào)度返回返回sem0是是452. V原語原語signal(s)+s.count;/表示釋放一個資源;表示釋放一個資源;if (s.count = 0)/表示有進(jìn)程處于阻塞狀態(tài);表示有進(jìn)程處于阻塞狀態(tài); 從等待隊列從等待隊列s.queue中取出一個進(jìn)程中取出一個進(jìn)程P; 進(jìn)程進(jìn)程P進(jìn)入就緒隊列進(jìn)入就緒隊列;V原語通常喚醒進(jìn)程等待隊列中的頭一個進(jìn)程原語通常喚醒進(jìn)程等待隊列中的頭一個進(jìn)程

25、46V原語操作的主要動作原語操作的主要動作:1.Sem加加1;2.若若sem加加1后大于零,則進(jìn)程繼續(xù)執(zhí)行;后大于零,則進(jìn)程繼續(xù)執(zhí)行;3.若若sem加加1后小于等于零,則從該信號后小于等于零,則從該信號的等待隊列中喚醒以等待進(jìn)程,然后再的等待隊列中喚醒以等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。V原語操作的功能框圖見下頁原語操作的功能框圖見下頁入口sem=sem1Sem buffer;V(mutex);V(full);/退出區(qū)P(full);P(mutex);/進(jìn)入?yún)^(qū) one unit - buffer;V(mutex);V(empty);/退出區(qū)522.

26、 讀者寫者問題讀者寫者問題(the readers-writers problem)問題描述:對共享資源的讀寫操作,任問題描述:對共享資源的讀寫操作,任一時刻一時刻“寫者寫者”最多只允許一個,而最多只允許一個,而“讀者讀者”則允許多個則允許多個n“讀寫讀寫”互斥,互斥,n“寫寫寫寫”互斥,互斥,n讀讀讀讀允許允許53采用信號量機制:采用信號量機制:nWmutex表示表示允許寫允許寫,初值是,初值是1。n公共變量公共變量Rcount表示表示“正在讀正在讀”的進(jìn)程數(shù),初值是的進(jìn)程數(shù),初值是0;nRmutex表示對表示對Rcount的互斥操作,初值是的互斥操作,初值是1。P(Rmutex); if

27、(Rcount = 0)P(Wmutex); +Rcount;V(Rmutex); read;P(Rmutex); -Rcount; if (Rcount = 0)V(Wmutex);V(Rmutex);ReaderP(Wmutex); write;V(Wmutex);Writer543、哲學(xué)家進(jìn)餐問題、哲學(xué)家進(jìn)餐問題哲學(xué)家進(jìn)餐問題是典型的同步問題,是由哲學(xué)家進(jìn)餐問題是典型的同步問題,是由Dijkstra提出并解提出并解決的。決的。5個哲學(xué)家,他們的生活方式是交替的思考和進(jìn)餐。哲學(xué)家們個哲學(xué)家,他們的生活方式是交替的思考和進(jìn)餐。哲學(xué)家們公用一張圓桌,分別坐在周圍的公用一張圓桌,分別坐在周圍的5

28、張椅子上,圓桌上有張椅子上,圓桌上有5個碗個碗和和5支筷子,平時哲學(xué)家進(jìn)行思考,饑餓時便坐在桌前自己的支筷子,平時哲學(xué)家進(jìn)行思考,饑餓時便坐在桌前自己的位子上試圖取用其左、右最靠近他的筷子,只有他拿到兩只位子上試圖取用其左、右最靠近他的筷子,只有他拿到兩只筷子時才能進(jìn)餐,放下筷子又繼續(xù)思考??曜訒r才能進(jìn)餐,放下筷子又繼續(xù)思考。問題:如何保證哲學(xué)家們的動作有序進(jìn)行?問題:如何保證哲學(xué)家們的動作有序進(jìn)行?n不出現(xiàn)有人永遠(yuǎn)拿不到筷子。不出現(xiàn)有人永遠(yuǎn)拿不到筷子。55哲學(xué)家的狀態(tài)哲學(xué)家的狀態(tài)Repeat 思考;思考; 取取chopsticki;取取chopstick (i+1) mod 5; /*先取左

29、手的筷子,再取右手的筷子先取左手的筷子,再取右手的筷子 進(jìn)食;進(jìn)食; 放放chopstick i;/*先放左手筷子先放左手筷子 放放chopstick (i+1) mod 5; /*再放右手再放右手Until false;56是否出現(xiàn)死鎖?是否出現(xiàn)死鎖?五個人都拿起一只筷子。五個人都拿起一只筷子。假如五位哲學(xué)家同時饑餓而各自拿起左假如五位哲學(xué)家同時饑餓而各自拿起左邊的筷子時,當(dāng)他們再試圖去拿右邊的邊的筷子時,當(dāng)他們再試圖去拿右邊的筷子時,都將因無筷子可拿而無限等待。筷子時,都將因無筷子可拿而無限等待。57如何打破死鎖?如何打破死鎖?最多允許最多允許4 4個哲學(xué)家同時坐在桌子周圍個哲學(xué)家同時坐在

30、桌子周圍僅當(dāng)一個哲學(xué)家左右兩邊的筷子都可用時,僅當(dāng)一個哲學(xué)家左右兩邊的筷子都可用時,才允許他拿筷子(才允許他拿筷子( )給所有哲學(xué)家編號,奇數(shù)號的哲學(xué)家必須給所有哲學(xué)家編號,奇數(shù)號的哲學(xué)家必須首先拿左邊的筷子,偶數(shù)號的哲學(xué)家則反首先拿左邊的筷子,偶數(shù)號的哲學(xué)家則反之之為了避免死鎖,把哲學(xué)家分為三種狀態(tài),為了避免死鎖,把哲學(xué)家分為三種狀態(tài),思考,饑餓,進(jìn)食,并且一次拿到兩只筷思考,饑餓,進(jìn)食,并且一次拿到兩只筷子,否則不拿。子,否則不拿。58具體算法具體算法Program diningphilosophers;Semaphore chopstick 5 = 1;(5支筷子的狀態(tài))支筷子的狀態(tài))S

31、emaphore seat = 4;(桌上最多允許四個人)(桌上最多允許四個人)int i;Void philospher (int i) while (true) thinking(); P( seat ); P(chopsticki); P(chopstick(i+1) mod 5) eating(); V(chopsticki); V(chopstick(i+1) mod 5) V(seat); 594 理發(fā)師問題理發(fā)師問題一個理發(fā)店由一個有一個理發(fā)店由一個有n(n1)張椅子)張椅子的等候室和一個放有一張理發(fā)椅的理發(fā)的等候室和一個放有一張理發(fā)椅的理發(fā)室組成。若沒有要理發(fā)的顧客,則理發(fā)室組

32、成。若沒有要理發(fā)的顧客,則理發(fā)師就去睡覺;若一顧客走進(jìn)理發(fā)店且所師就去睡覺;若一顧客走進(jìn)理發(fā)店且所有的椅子都被占用了,則該顧客就離開有的椅子都被占用了,則該顧客就離開理發(fā)店;若理發(fā)師正在為人理發(fā),則該理發(fā)店;若理發(fā)師正在為人理發(fā),則該顧客就找一張空椅子坐下等待;若理發(fā)顧客就找一張空椅子坐下等待;若理發(fā)師在睡覺,則顧客就喚醒他,設(shè)計一個師在睡覺,則顧客就喚醒他,設(shè)計一個協(xié)調(diào)理發(fā)師和顧客的程序。協(xié)調(diào)理發(fā)師和顧客的程序。 60問題分析問題分析理發(fā)師的狀態(tài)(理發(fā)、睡覺)理發(fā)師的狀態(tài)(理發(fā)、睡覺)顧客的狀態(tài)(等待、理發(fā)、離開)顧客的狀態(tài)(等待、理發(fā)、離開)顧客的數(shù)量顧客的數(shù)量61信號量設(shè)計信號量設(shè)計cu

33、stomers:顧客數(shù),初始值為:顧客數(shù),初始值為0;baber:理發(fā)師,初始值為:理發(fā)師,初始值為0,只有,只有0,1兩種狀態(tài);兩種狀態(tài);waiting:等待理發(fā)的顧客數(shù),初始值為:等待理發(fā)的顧客數(shù),初始值為0;mutex,對顧客數(shù)的互斥訪問信號量,初始值為,對顧客數(shù)的互斥訪問信號量,初始值為1,只有只有0,1兩種狀態(tài)。兩種狀態(tài)。62理發(fā)師進(jìn)程理發(fā)師進(jìn)程 Process baberbeginLoop: P(Customers);/*等待顧客到來等待顧客到來 ; V(baber);/通知顧客理發(fā)完成通知顧客理發(fā)完成 goto loop;end;63顧客進(jìn)程顧客進(jìn)程i Process Custo

34、mer(i)begin P(mutex); /測試是否有其他顧客對測試是否有其他顧客對waiting進(jìn)行訪問。進(jìn)行訪問。 if waitingn then /測試等待人數(shù)是否大于測試等待人數(shù)是否大于n, begin waiting=waiting+1; V(customers); V(mutex); P(baber);/,測試?yán)戆l(fā)師是否空閑測試?yán)戆l(fā)師是否空閑,如空閑就喚醒理發(fā)師如空閑就喚醒理發(fā)師 P(mutex); waiting=waiting-1; V(mutex); end else begin V(mutex); end;end; 64司機售票員問題司機售票員問題問題描述:問題描述:在

35、公共汽車上,司機和售票員各司其職,在公共汽車上,司機和售票員各司其職,司機負(fù)責(zé)開車和到站停車;售票員負(fù)責(zé)司機負(fù)責(zé)開車和到站停車;售票員負(fù)責(zé)售票和開、關(guān)門,當(dāng)售票員關(guān)好門之后,售票和開、關(guān)門,當(dāng)售票員關(guān)好門之后,駕駛員才能開車行駛。試用駕駛員才能開車行駛。試用P、V操作實操作實現(xiàn)司機與售票員的同步操作?,F(xiàn)司機與售票員的同步操作。65司機與售票員的同步關(guān)系司機與售票員的同步關(guān)系這里分別用這里分別用S1和和S2表示司機和售票員的私用信號量,其初始值表示司機和售票員的私用信號量,其初始值為為0,正常行駛正常行駛到站停車到站停車開車開車售票售票開車門開車門關(guān)車門關(guān)車門司機司機乘務(wù)員乘務(wù)員一個完一個完整的

36、動整的動作順序。作順序。66司機和售票員的同步關(guān)系描述司機和售票員的同步關(guān)系描述S1,S2:Semaphore;S1:=0;S2:=0;Process Driver /司機進(jìn)程司機進(jìn)程BeginLoop: ; ; V(S2); P(S1); Goto Loop;End;Process TicketCollector /售票員進(jìn)程售票員進(jìn)程BeginLoop: ; P(S2); ; ; V(S1); Goto Loop;End;673.4.4 管程管程 由于信號量不是很容易使用,使用不當(dāng)會造成由于信號量不是很容易使用,使用不當(dāng)會造成死鎖,死鎖,Hoare和和Hansen在在1975年提出一種高年

37、提出一種高級同步原語級同步原語-管程,以方便對于共享變量的管程,以方便對于共享變量的訪問。訪問。管程:管程:monitor,是管理進(jìn)程間同步的一種機,是管理進(jìn)程間同步的一種機制,它保證進(jìn)程互斥地訪問共享變量,并且提制,它保證進(jìn)程互斥地訪問共享變量,并且提供了一個方便的阻塞和喚醒進(jìn)程的機制。一個供了一個方便的阻塞和喚醒進(jìn)程的機制。一個管程是一個由過程、變量及數(shù)據(jù)結(jié)構(gòu)等組成的管程是一個由過程、變量及數(shù)據(jù)結(jié)構(gòu)等組成的一個集合,它們組成了一個特殊的模塊和軟件一個集合,它們組成了一個特殊的模塊和軟件包。包。683.5 進(jìn)程間通信進(jìn)程間通信(IPC, INTER-PROCESS COMMUNICATION

38、)3.5.1 進(jìn)程間通信的類型進(jìn)程間通信的類型3.5.2 信號信號(signal)3.5.3 共享存儲區(qū)共享存儲區(qū)(shared memory)3.5.4 管道管道(pipe)3.5.5 消息消息(message)3.5.6 套接字套接字(socket)693.5.1 進(jìn)程間通信的類型進(jìn)程間通信的類型低級通信:只能傳遞狀態(tài)和整數(shù)值(控制信低級通信:只能傳遞狀態(tài)和整數(shù)值(控制信息),包括進(jìn)程互斥和同步所采用的信號量和息),包括進(jìn)程互斥和同步所采用的信號量和管程機制。優(yōu)點的速度快。缺點是:管程機制。優(yōu)點的速度快。缺點是:n傳送信息量?。盒实?,每次通信傳遞的信息量固傳送信息量?。盒实?,每次通信傳

39、遞的信息量固定,若傳遞較多信息則需要進(jìn)行多次通信。定,若傳遞較多信息則需要進(jìn)行多次通信。n編程復(fù)雜:用戶直接實現(xiàn)通信的細(xì)節(jié),編程復(fù)雜,編程復(fù)雜:用戶直接實現(xiàn)通信的細(xì)節(jié),編程復(fù)雜,容易出錯。容易出錯。高級通信:能夠傳送任意數(shù)量的數(shù)據(jù),包括三高級通信:能夠傳送任意數(shù)量的數(shù)據(jù),包括三類:共享存儲區(qū)、管道、消息。類:共享存儲區(qū)、管道、消息。返回返回1. 低級通信和高級通信低級通信和高級通信702. 直接通信和間接通信直接通信和間接通信直接通信:信息直接傳遞給接收方,如管道。直接通信:信息直接傳遞給接收方,如管道。n在發(fā)送時,指定接收方的地址或標(biāo)識,也可以指在發(fā)送時,指定接收方的地址或標(biāo)識,也可以指定多

40、個接收方或廣播式地址;定多個接收方或廣播式地址;n在接收時,允許接收來自任意發(fā)送方的消息,并在接收時,允許接收來自任意發(fā)送方的消息,并在讀出消息的同時獲取發(fā)送方的地址。在讀出消息的同時獲取發(fā)送方的地址。間接通信:借助于收發(fā)雙方進(jìn)程之外的共享間接通信:借助于收發(fā)雙方進(jìn)程之外的共享數(shù)據(jù)結(jié)構(gòu)作為通信中轉(zhuǎn),如消息隊列。通常數(shù)據(jù)結(jié)構(gòu)作為通信中轉(zhuǎn),如消息隊列。通常收方和發(fā)方的數(shù)目可以是任意的。收方和發(fā)方的數(shù)目可以是任意的。713. 高級通信的特征高級通信的特征通信鏈路通信鏈路(communication link):n點對點點對點/多點多點/廣播廣播n單向單向/雙向雙向n有容量(鏈路帶緩沖區(qū))有容量(鏈路

41、帶緩沖區(qū))/無容量(發(fā)送方和接收方需自備緩沖區(qū))無容量(發(fā)送方和接收方需自備緩沖區(qū))數(shù)據(jù)格式:數(shù)據(jù)格式:n字節(jié)流字節(jié)流(byte stream):各次發(fā)送之間的分界,在接收時不被保留,:各次發(fā)送之間的分界,在接收時不被保留,沒有格式;沒有格式;n報文報文(datagram/message):各次發(fā)送之間的分界,在接收時被保:各次發(fā)送之間的分界,在接收時被保留,通常有格式(如表示類型),定長留,通常有格式(如表示類型),定長/不定長報文,可靠報文不定長報文,可靠報文/不可不可靠報文??繄笪?。收發(fā)操作的同步方式收發(fā)操作的同步方式n發(fā)送阻塞(直到被鏈路容量或接收方所接受)和不阻塞(失敗時立即發(fā)送阻塞

42、(直到被鏈路容量或接收方所接受)和不阻塞(失敗時立即返回)返回)n接收阻塞(直到有數(shù)據(jù)可讀)和不阻塞(無數(shù)據(jù)時立即返回)接收阻塞(直到有數(shù)據(jù)可讀)和不阻塞(無數(shù)據(jù)時立即返回)n由事件驅(qū)動收發(fā):在允許發(fā)送或有數(shù)據(jù)可讀時,才做發(fā)送和接收操作由事件驅(qū)動收發(fā):在允許發(fā)送或有數(shù)據(jù)可讀時,才做發(fā)送和接收操作723.5.2 信號信號(signal)3.5.2.1 UNIX信號信號3.5.2.2 Windows NT信號信號返回返回信號相當(dāng)于給進(jìn)程的信號相當(dāng)于給進(jìn)程的“軟件軟件”中斷;進(jìn)程可發(fā)送信號,中斷;進(jìn)程可發(fā)送信號,指定信號處理例程;它是單向和異步的。指定信號處理例程;它是單向和異步的。733.5.2.

43、1 UNIX信號信號一個進(jìn)程向另一個進(jìn)程或進(jìn)程組(或自己)發(fā)送一個進(jìn)程向另一個進(jìn)程或進(jìn)程組(或自己)發(fā)送(kill系統(tǒng)調(diào)用):發(fā)送者必須具有接收者同樣的系統(tǒng)調(diào)用):發(fā)送者必須具有接收者同樣的有效用戶有效用戶ID,或者發(fā)送者是超級用戶身份,或者發(fā)送者是超級用戶身份某些鍵盤按鍵,如:中斷字符(通常是某些鍵盤按鍵,如:中斷字符(通常是Ctrl+C或或Del)、暫停字符()、暫停字符(如如Ctrl+Z)硬件條件,如:除數(shù)為零、浮點運算錯、訪問非法硬件條件,如:除數(shù)為零、浮點運算錯、訪問非法地址等異常條件地址等異常條件軟件條件,如:軟件條件,如:Socket中有加急數(shù)據(jù)到達(dá)。中有加急數(shù)據(jù)到達(dá)。1. 信號

44、類型信號類型742. 對信號的處理對信號的處理進(jìn)程可以設(shè)置信號處理例程(進(jìn)程可以設(shè)置信號處理例程(signal系統(tǒng)調(diào)用),系統(tǒng)調(diào)用),在接收到信號時就被調(diào)用,稱為在接收到信號時就被調(diào)用,稱為捕獲捕獲該信號。信該信號。信號處理例程的參數(shù)是接收到信號的編號。號處理例程的參數(shù)是接收到信號的編號。進(jìn)程也可以忽略指定的信號進(jìn)程也可以忽略指定的信號(SIG_IGN)。n只有只有SIGKILL信號(無條件終止進(jìn)程)和信號(無條件終止進(jìn)程)和SIGSTOP(使(使進(jìn)程暫停)不能被忽略。進(jìn)程暫停)不能被忽略。n在庫函數(shù)在庫函數(shù)system()的實現(xiàn)中,通過的實現(xiàn)中,通過fork和和exec加載新程加載新程序之后

45、,在父進(jìn)程中對序之后,在父進(jìn)程中對SIGINT和和SIGQUIT都要忽略,都要忽略,然后然后wait直到子進(jìn)程終止,才恢復(fù)對直到子進(jìn)程終止,才恢復(fù)對SIGINT和和SIGQUIT的原有處理例程。的原有處理例程。進(jìn)程創(chuàng)建后為信號設(shè)立了默認(rèn)處理例程進(jìn)程創(chuàng)建后為信號設(shè)立了默認(rèn)處理例程(SIG_DFL),如:終止并留映象文件如:終止并留映象文件(core)753.5.3 共享存儲區(qū)共享存儲區(qū)(shared memory)創(chuàng)建或打開共享存儲區(qū)創(chuàng)建或打開共享存儲區(qū)(shmget):依據(jù)用戶給出的整數(shù)值:依據(jù)用戶給出的整數(shù)值key,創(chuàng),創(chuàng)建新區(qū)或打開現(xiàn)有區(qū),返回一個共享存儲區(qū)建新區(qū)或打開現(xiàn)有區(qū),返回一個共享

46、存儲區(qū)ID。連接共享存儲區(qū)連接共享存儲區(qū)(shmat):連接共享存儲區(qū)到本進(jìn)程的地址空間,:連接共享存儲區(qū)到本進(jìn)程的地址空間,可以指定虛擬地址或由系統(tǒng)分配,返回共享存儲區(qū)首地址。父進(jìn)程可以指定虛擬地址或由系統(tǒng)分配,返回共享存儲區(qū)首地址。父進(jìn)程已連接的共享存儲區(qū)可被已連接的共享存儲區(qū)可被fork創(chuàng)建的子進(jìn)程繼承。創(chuàng)建的子進(jìn)程繼承。拆除共享存儲區(qū)連接拆除共享存儲區(qū)連接(shmdt):拆除共享存儲區(qū)與本進(jìn)程地址空間:拆除共享存儲區(qū)與本進(jìn)程地址空間的連接。的連接。共享存儲區(qū)控制共享存儲區(qū)控制(shmctl):對共享存儲區(qū)進(jìn)行控制。如:共享存儲:對共享存儲區(qū)進(jìn)行控制。如:共享存儲區(qū)的刪除需要顯式調(diào)用區(qū)的

47、刪除需要顯式調(diào)用shmctl(shmid, IPC_RMID, 0);相當(dāng)于內(nèi)存,可以任意讀寫和使用任意數(shù)據(jù)結(jié)構(gòu)(當(dāng)然,對相當(dāng)于內(nèi)存,可以任意讀寫和使用任意數(shù)據(jù)結(jié)構(gòu)(當(dāng)然,對指針要注意),需要進(jìn)程互斥和同步的輔助來確保數(shù)據(jù)一致指針要注意),需要進(jìn)程互斥和同步的輔助來確保數(shù)據(jù)一致性性1. UNIX的共享存儲區(qū)的共享存儲區(qū)763.5.4 管道管道(pipe)管道是一條在進(jìn)程間以字節(jié)流方式傳送的管道是一條在進(jìn)程間以字節(jié)流方式傳送的通信通道。它由通信通道。它由OS核心的緩沖區(qū)(通常幾核心的緩沖區(qū)(通常幾十十KB)來實現(xiàn),是單向的;常用于命令)來實現(xiàn),是單向的;常用于命令行所指定的輸入輸出重定向和管道命

48、令。行所指定的輸入輸出重定向和管道命令。在使用管道前要建立相應(yīng)的管道,然后才在使用管道前要建立相應(yīng)的管道,然后才可使用??墒褂谩?71. UNIX管道管道通過通過pipe系統(tǒng)調(diào)用創(chuàng)建無名管道,得到兩個文件描系統(tǒng)調(diào)用創(chuàng)建無名管道,得到兩個文件描述符,分別用于寫和讀。述符,分別用于寫和讀。nint pipe(int fildes2);n文件描述符文件描述符fildes0為讀端,為讀端,fildes1為寫端;為寫端;n通過系統(tǒng)調(diào)用通過系統(tǒng)調(diào)用write和和read進(jìn)行管道的寫進(jìn)行管道的寫和讀;和讀;n進(jìn)程間雙向通信,通常需要兩個管道;進(jìn)程間雙向通信,通常需要兩個管道;n只適用于父子進(jìn)程之間或父進(jìn)程安

49、排的各個子進(jìn)程之間;只適用于父子進(jìn)程之間或父進(jìn)程安排的各個子進(jìn)程之間;UNIX中的命名管道,可通過中的命名管道,可通過mknod系統(tǒng)調(diào)用建立:系統(tǒng)調(diào)用建立:指定指定mode為為S_IFIFOnint mknod(const char *path, mode_t mode, dev_t dev);78 寫端寫端:fd1Write(fd1,buf,size) 讀端讀端: fd0read(fd0,buf,size)nint pipe(int fd2);n文件描述符文件描述符fd0為讀端,為讀端,fd1為寫為寫端;端;管道工作原理如下:管道工作原理如下:79管道通信實例用C語言編寫一個程序,建立一個p

50、ipe,同時父進(jìn)程生成一個子進(jìn)程,子進(jìn)程向pipe中寫入一字符串,父進(jìn)程從pipe中讀出該字符串。程序如下:include int x,fd2; char buf30,s30; pipe(fd); /*創(chuàng)建管道*/ while(x=fork()=-1);/*創(chuàng)建子進(jìn)程失敗,反復(fù)循環(huán)*/ if(x=0) sprintf(buf,”This is an examplen”); write(fd1,buf,30);/*把buf中的字符寫入管道*/ exit(0); /*續(xù)左面*/ else/*父進(jìn)程返回*/ wait(0); read(fd0,s,30); /*父進(jìn)程讀管道字符*/ printf(“

51、%s”,s); 803.5.5 消息消息(message)與窗口系統(tǒng)中的與窗口系統(tǒng)中的“消息消息”不同。通常是不同。通常是不定長數(shù)據(jù)塊。消息的發(fā)送不需要接收不定長數(shù)據(jù)塊。消息的發(fā)送不需要接收方準(zhǔn)備好,隨時可發(fā)送。方準(zhǔn)備好,隨時可發(fā)送。81 UNIX消息消息消息隊列消息隊列(message queue)(message queue):每個:每個messagemessage不定長,由類型不定長,由類型(type)(type)和正文和正文(text)(text)組成組成UNIXUNIX消息隊列消息隊列APIAPI:nmsggetmsgget依據(jù)用戶給出的整數(shù)值依據(jù)用戶給出的整數(shù)值keykey,創(chuàng)建新

52、消息隊列或打開現(xiàn)有消息,創(chuàng)建新消息隊列或打開現(xiàn)有消息隊列,返回一個消息隊列隊列,返回一個消息隊列IDID;nmsgsndmsgsnd發(fā)送消息;發(fā)送消息;nmsgrcvmsgrcv接收消息,可以指定消息類型;沒有消息時,返回接收消息,可以指定消息類型;沒有消息時,返回-1-1;nmsgctlmsgctl對消息隊列進(jìn)行控制,如刪除消息隊列;對消息隊列進(jìn)行控制,如刪除消息隊列;通過指定多種消息類型,可以在一個消息隊列中建立多個虛通過指定多種消息類型,可以在一個消息隊列中建立多個虛擬信道擬信道注意:消息隊列不隨創(chuàng)建它的進(jìn)程的終止而自動撤銷,必須注意:消息隊列不隨創(chuàng)建它的進(jìn)程的終止而自動撤銷,必須用用m

53、sgctl(msgqidmsgctl(msgqid, IPC_RMID, 0), IPC_RMID, 0)。另外,。另外,msggetmsgget獲得消息隊獲得消息隊列列IDID之后,之后,forkfork創(chuàng)建子進(jìn)程,在子進(jìn)程中能否繼承該消息隊創(chuàng)建子進(jìn)程,在子進(jìn)程中能否繼承該消息隊列列IDID而不必再一次而不必再一次msggetmsgget。823.5.6 套接套接字字(socket)雙向的,數(shù)據(jù)格式為字節(jié)流(一對一)或報文(多雙向的,數(shù)據(jù)格式為字節(jié)流(一對一)或報文(多對一,一對多);主要用于網(wǎng)絡(luò)通信;對一,一對多);主要用于網(wǎng)絡(luò)通信;支持支持client-server模式和模式和peer-

54、to-peer模式,本模式,本機或網(wǎng)絡(luò)中的兩個或多個進(jìn)程進(jìn)行交互。提供機或網(wǎng)絡(luò)中的兩個或多個進(jìn)程進(jìn)行交互。提供TCP/IP協(xié)議支持協(xié)議支持UNIX套接字套接字(基于基于TCP/IP):send, sendto, recv, recvfrom;在在Windows NT中的規(guī)范稱為中的規(guī)范稱為Winsock(與協(xié)議與協(xié)議獨立,或支持多種協(xié)議獨立,或支持多種協(xié)議):WSASend, WSASendto, WSARecv, WSARecvfrom;833.6 死鎖問題(DEADLOCK) P723.6.1 概述3.6.2 死鎖的預(yù)防3.6.3 死鎖的檢測3.6.4 解決死鎖問題的綜合方法843.6.1

55、 概述死鎖是指系統(tǒng)中多個進(jìn)程無限制地等待永遠(yuǎn)不會發(fā)生的條件;1. 死鎖發(fā)生原因并發(fā)進(jìn)程對互斥資源的共享,并發(fā)執(zhí)行的順序不當(dāng)85. Request(B); Request(A); Release(A); Release(B);P2. Request(A); Request(B); Release(B); Release(A);P1死鎖舉例死鎖發(fā)生:雙方都擁有部分資源,同時在請求對方已占有的資源。如次序:P1 P2 P1 P2862. 死鎖發(fā)生的必要條件只有4個條件都滿足時,才會出現(xiàn)死鎖。n互斥:任一時刻只允許一個進(jìn)程使用資源n請求和保持:進(jìn)程在請求其余資源時,不主動釋放已經(jīng)占用的資源n非剝奪:進(jìn)

56、程已經(jīng)占用的資源,不會被強制剝奪n環(huán)路等待:環(huán)路中的每一條邊是進(jìn)程在請求另一進(jìn)程已經(jīng)占有的資源。873. 處理死鎖的基本方法方法 資源分配策略 各種可能模式 主要優(yōu)點 主要缺點 一次請求所有資源 適用于作突發(fā)式處理的進(jìn)程;不必剝奪 資源剝奪 適用于狀態(tài)可以保存和恢復(fù)的資源 預(yù)防 Prevention 保守的; 寧可資源閑置 (從機制上使死鎖條件不成立) 資源按序申請 可以在編譯時(而不必在運行時)就進(jìn)行檢查 效率低;進(jìn)程初始化時間延長 剝奪次數(shù)過多;多次對資源重新起動 不便靈活申請新資源 避免 Avoidance 是 “預(yù)防” 和 “檢測” 的折衷 (在運行時判斷是否可能死鎖) 尋找可能的安全的運行順序 不必進(jìn)行剝奪 使用條件:必須知道將來的資源需求;進(jìn)程可能會長時間阻塞 檢測 Detection 寬松的;只要允許,就分配資源 定期檢查死鎖是否已經(jīng)發(fā)生 不延長進(jìn)程

溫馨提示

  • 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

提交評論