《計(jì)算機(jī)操作系統(tǒng)》課件第4章_第1頁(yè)
《計(jì)算機(jī)操作系統(tǒng)》課件第4章_第2頁(yè)
《計(jì)算機(jī)操作系統(tǒng)》課件第4章_第3頁(yè)
《計(jì)算機(jī)操作系統(tǒng)》課件第4章_第4頁(yè)
《計(jì)算機(jī)操作系統(tǒng)》課件第4章_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

4.1與時(shí)間有關(guān)的錯(cuò)誤4.2進(jìn)程的互斥4.3信號(hào)量與PV操作4.4進(jìn)程同步4.5進(jìn)程通信4.6進(jìn)程同步實(shí)現(xiàn)舉例4.7進(jìn)程通信的實(shí)現(xiàn)舉例習(xí)題在采用多道程序設(shè)計(jì)技術(shù)的系統(tǒng)中,若干個(gè)作業(yè)可以同時(shí)執(zhí)行,而每一個(gè)作業(yè)又需要由多個(gè)進(jìn)程的協(xié)作來(lái)完成。因此,系統(tǒng)中會(huì)同時(shí)存在許多進(jìn)程來(lái)競(jìng)爭(zhēng)處理機(jī)。另外,在一個(gè)進(jìn)程運(yùn)行過(guò)程中,由于自身或外界的原因,該進(jìn)程可能被中斷,且斷點(diǎn)是不固定的。一個(gè)進(jìn)程被中斷后,哪個(gè)進(jìn)程可以運(yùn)行,被中斷的進(jìn)程什么時(shí)候再去占用處理機(jī),這些問(wèn)題是與進(jìn)程調(diào)度策略有關(guān)的,所以,進(jìn)程的執(zhí)行速度是不能由自己來(lái)控制的。4.1與時(shí)間有關(guān)的錯(cuò)誤

若系統(tǒng)中存在一組進(jìn)程的執(zhí)行在時(shí)間上是重疊的,就稱(chēng)該組進(jìn)程具有并發(fā)性,這組進(jìn)程就被稱(chēng)為“并發(fā)進(jìn)程”。

并發(fā)進(jìn)程相互之間可能是無(wú)關(guān)的,也可能是有交往的。如果一個(gè)進(jìn)程的執(zhí)行不影響其他進(jìn)程的執(zhí)行,且與其他進(jìn)程的進(jìn)展情況無(wú)關(guān),即它們是各自獨(dú)立的,則稱(chēng)這些并發(fā)進(jìn)程相互之間是無(wú)關(guān)的。如果一個(gè)進(jìn)程的執(zhí)行可能影響其他進(jìn)程的執(zhí)行結(jié)果,則稱(chēng)這些并發(fā)進(jìn)程相互之間是有交往的。對(duì)于有交往的并發(fā)進(jìn)程來(lái)說(shuō),可能有若干并發(fā)進(jìn)程同時(shí)使用共享資源,即一個(gè)進(jìn)程一次使用未結(jié)束,另一進(jìn)程就開(kāi)始使用,形成交替使用共享資源。如果對(duì)這種情況不加控制,在共享資源時(shí)就會(huì)出錯(cuò)。

其中觀察者進(jìn)程能識(shí)別卡車(chē),并對(duì)通過(guò)的卡車(chē)計(jì)數(shù),報(bào)告者進(jìn)程定時(shí)將觀察者的計(jì)數(shù)值打印輸出,每次打印后把計(jì)數(shù)值清“0”。兩個(gè)進(jìn)程的并發(fā)執(zhí)行可完成對(duì)每小時(shí)中卡車(chē)流量的統(tǒng)計(jì),兩個(gè)進(jìn)程的功能描述如下:在cobegin和coend之間的進(jìn)程為可并發(fā)執(zhí)行的進(jìn)程。觀察者進(jìn)程和報(bào)告者進(jìn)程并發(fā)執(zhí)行時(shí)可能有如下兩種情況:

(1)報(bào)告者進(jìn)程執(zhí)行時(shí)無(wú)卡車(chē)通過(guò)。這種情況下,報(bào)告者進(jìn)程把上一小時(shí)通過(guò)的卡車(chē)數(shù)打印輸出后將計(jì)數(shù)器清“0”,完成了一次任務(wù)后,當(dāng)有卡車(chē)通過(guò)時(shí),觀察者進(jìn)程重新開(kāi)始對(duì)一個(gè)新時(shí)間段內(nèi)的流量進(jìn)行統(tǒng)計(jì)。

(2)報(bào)告者進(jìn)程執(zhí)行時(shí)有卡車(chē)通過(guò)。當(dāng)報(bào)告者進(jìn)程工作時(shí),啟動(dòng)了打印機(jī),在等待打印機(jī)打印輸出時(shí)恰好有一輛卡車(chē)通過(guò),這時(shí),觀察者進(jìn)程工作將計(jì)數(shù)器count的值又增加“1”。報(bào)告者進(jìn)程在打印完成后繼續(xù)執(zhí)行count=0,將計(jì)數(shù)器上新增加的“1”也清除了。如果在打印輸出期間有多個(gè)卡車(chē)通過(guò),觀察者進(jìn)程雖然將它們記錄到計(jì)數(shù)器上,但都因報(bào)告者進(jìn)程執(zhí)行count=0而把計(jì)數(shù)值丟失了,導(dǎo)致了統(tǒng)計(jì)結(jié)果的錯(cuò)誤??梢?jiàn),由于并發(fā)進(jìn)程執(zhí)行的隨機(jī)性,其中一個(gè)進(jìn)程對(duì)另一個(gè)進(jìn)程的影響是不可預(yù)知的。關(guān)鍵是它們都涉及到共享變量count,當(dāng)在不同時(shí)刻交替地修改了count的值就會(huì)造成結(jié)果的不正確。導(dǎo)致不正確的原因與進(jìn)程占用處理機(jī)的時(shí)間、執(zhí)行的速度以及外界的影響有關(guān)。這些因素都與時(shí)間有關(guān),所以稱(chēng)為“與時(shí)間有關(guān)的錯(cuò)誤”。4.2.1臨界資源

有交往的并發(fā)進(jìn)程執(zhí)行時(shí)出現(xiàn)與時(shí)間有關(guān)的錯(cuò)誤,其根本原因是對(duì)共享資源的使用不受限制,當(dāng)進(jìn)程交叉使用了共享資源就造成了錯(cuò)誤。例如,進(jìn)程A,B共享一臺(tái)打印機(jī),若讓它們?nèi)我馐褂?,那么可能發(fā)生的情況是:兩個(gè)進(jìn)程的輸出結(jié)果將交織在一起,很難區(qū)分。解決這一問(wèn)題的辦法是:進(jìn)程A要使用打印機(jī)時(shí)應(yīng)先提出申請(qǐng),一旦系統(tǒng)把資源分配給它,就一直為它所獨(dú)占。這時(shí),即使進(jìn)程B要使用打印機(jī),也必須等待,直到進(jìn)程A用完并釋放后,系統(tǒng)才把打印機(jī)分配給進(jìn)程B使用。4.2進(jìn)?程?的?互?斥由此可見(jiàn),雖然系統(tǒng)中可同時(shí)存在許多進(jìn)程,它們共享著各種資源,然而有許多資源一次只能為一個(gè)進(jìn)程使用。通常把一次僅允許一個(gè)進(jìn)程使用的資源稱(chēng)為臨界資源。許多物理設(shè)備,如輸入機(jī)、打印機(jī)、磁帶機(jī)等都具有這種性質(zhì)。除了物理設(shè)備外,還有一些軟件資源,如變量、數(shù)據(jù)、表格、隊(duì)列等也都具有這一特點(diǎn)。允許若干進(jìn)程均能訪問(wèn)和修改的存儲(chǔ)單元稱(chēng)為公共變量。并發(fā)進(jìn)程對(duì)公共變量進(jìn)行訪問(wèn)和修改時(shí),必須作某種限制,否則就會(huì)產(chǎn)生與時(shí)間有關(guān)的錯(cuò)誤。例如,在一個(gè)機(jī)票預(yù)訂系統(tǒng)中,某一機(jī)座的訂購(gòu)情況由一個(gè)確定的內(nèi)存單元的內(nèi)容表示,假設(shè)把若干個(gè)訂票處看成為若干個(gè)訪問(wèn)這一內(nèi)存單元的進(jìn)程。如果一次有兩個(gè)或n個(gè)進(jìn)程同時(shí)存取該變量,那么就有可能使兩家或幾家訂票處同時(shí)幫顧客訂到相同的機(jī)座。所以,當(dāng)兩個(gè)(或n個(gè))進(jìn)程可能異步地改變公共數(shù)據(jù)區(qū)內(nèi)容時(shí),必須防止兩個(gè)(或n個(gè))進(jìn)程同時(shí)存取或改變數(shù)據(jù)。如果兩個(gè)進(jìn)程共用一個(gè)變量,則它們必須順序地使用,即一個(gè)進(jìn)程對(duì)公共變量操作完畢后,另一個(gè)進(jìn)程才能去訪問(wèn)和修改這一變量。

綜上所述,對(duì)公共變量這樣的臨界資源的共享有這樣的限制:共享的各方不能同時(shí)讀寫(xiě)同一數(shù)據(jù)區(qū),只有當(dāng)一方讀寫(xiě)完成后,另一方才能讀寫(xiě)。到底哪一方先讀寫(xiě),要根據(jù)問(wèn)題的性質(zhì)和設(shè)計(jì)人員的意圖而定。4.2.2臨界區(qū)

在每個(gè)進(jìn)程中,訪問(wèn)臨界資源的那段程序能夠從概念上分離出來(lái),因而稱(chēng)為臨界區(qū)或臨界段。它就是進(jìn)程中對(duì)公共變量進(jìn)行訪問(wèn)與修改的程序段,稱(chēng)為相對(duì)于該公共變量的臨界區(qū)。例如,前面提到的自動(dòng)計(jì)數(shù)系統(tǒng)中,觀察者進(jìn)程的臨界區(qū)是“count=count+1”,報(bào)告者進(jìn)程的臨界區(qū)是“printf("%d",count);count=0;”。如果有進(jìn)程在相關(guān)臨界區(qū)執(zhí)行,不讓另一個(gè)進(jìn)程進(jìn)入相關(guān)的臨界區(qū)執(zhí)行,就不會(huì)形成多個(gè)進(jìn)程對(duì)共享變量交叉訪問(wèn),于是就可以避免出現(xiàn)與時(shí)間有關(guān)的錯(cuò)誤。在觀察者和報(bào)告者進(jìn)程并發(fā)執(zhí)行時(shí),當(dāng)報(bào)告者進(jìn)程啟動(dòng)打印機(jī)后,在執(zhí)行count=0之前,雖然觀察者進(jìn)程發(fā)現(xiàn)有卡車(chē)通過(guò),但應(yīng)該限制觀察者進(jìn)程進(jìn)入相關(guān)臨界區(qū)(即暫不執(zhí)行count=count+1),直到報(bào)告者進(jìn)程執(zhí)行了count=0退出臨界區(qū),觀察者進(jìn)程才可以執(zhí)行,否則就可能在觀察者進(jìn)程執(zhí)行完count=count+1后,報(bào)告者進(jìn)程執(zhí)行了count=0,而導(dǎo)致數(shù)據(jù)丟失。當(dāng)報(bào)告者進(jìn)程退出臨界區(qū)后,觀察者進(jìn)程再進(jìn)入臨界區(qū)執(zhí)行,這樣就不會(huì)交替地修改count的值,觀察到的卡車(chē)數(shù)被統(tǒng)計(jì)在下一個(gè)時(shí)間段內(nèi),不會(huì)出現(xiàn)數(shù)據(jù)丟失。對(duì)若干進(jìn)程共享某一變量的相關(guān)臨界區(qū)的管理應(yīng)滿(mǎn)足如下三個(gè)要求:

(1)每次最多有一個(gè)進(jìn)程處于臨界區(qū)。

(2)任何一個(gè)進(jìn)入臨界區(qū)執(zhí)行的進(jìn)程必須在有限的時(shí)間內(nèi)退出臨界區(qū)。

(3)當(dāng)有若干進(jìn)程欲進(jìn)入它的臨界區(qū)時(shí),應(yīng)在有限時(shí)間內(nèi)使進(jìn)程進(jìn)入臨界區(qū)。

需要注意的一點(diǎn)是,臨界區(qū)是對(duì)某一資源而言的,對(duì)于不同資源的臨界區(qū),它們之間是不相交的,不必互斥執(zhí)行。4.2.3互斥的概念

在操作系統(tǒng)中,當(dāng)一個(gè)進(jìn)程進(jìn)入臨界區(qū)使用臨界資源時(shí),另一個(gè)進(jìn)程必須等待,當(dāng)占用臨界資源的進(jìn)程退出臨界區(qū)后,另一進(jìn)程才被允許去訪問(wèn)此臨界資源。進(jìn)程之間的這種相互制約關(guān)系被稱(chēng)為互斥。下面幾節(jié)將列出處理互斥問(wèn)題的幾種方法。4.2.4上鎖和解鎖操作

在大多數(shù)同步機(jī)構(gòu)中,必須用一個(gè)標(biāo)志來(lái)代表某一資源的狀態(tài)。比如,標(biāo)志為“0”表示未被使用,標(biāo)志為“1”表示已被使用。這一標(biāo)志經(jīng)常被稱(chēng)為鎖或信號(hào)量。

對(duì)于每一共享數(shù)據(jù)塊或設(shè)備都要有一個(gè)單位的鎖位。常用的鎖位值為“0”表示資源可用,為“1”表示資源已被占用。進(jìn)程在使用某一共享資源之前必須完成下列操作:

(1)考察鎖位的值。

(2)如果原來(lái)的值為0,將鎖位置1。

(3)如果原來(lái)的值為1,則返回第一步再考察。

系統(tǒng)提供在一個(gè)鎖位W上的兩個(gè)原語(yǔ)操作:上鎖原語(yǔ)LOCK(W)和開(kāi)鎖原語(yǔ)UNLOCK(W),其功能可描述如下:

LOCK(W) UNLOCK(W)

L:ifW=1thenGOTOL W=0;

elseW=1;4.2.5利用上鎖和解鎖操作實(shí)現(xiàn)進(jìn)程互斥

使用上鎖原語(yǔ)和開(kāi)鎖原語(yǔ)可以解決并發(fā)進(jìn)程的互斥問(wèn)題,任何欲進(jìn)入臨界區(qū)的進(jìn)程,必須先執(zhí)行上鎖原語(yǔ),若上鎖原語(yǔ)順利通過(guò),則進(jìn)程可進(jìn)入臨界區(qū),當(dāng)完成對(duì)臨界資源的訪問(wèn)后再執(zhí)行開(kāi)鎖原語(yǔ),釋放該臨界資源。4.3.1信號(hào)量的概念

信號(hào)量是一個(gè)確切的二元組(S,Q),S是一個(gè)具有非負(fù)初值的整型變量,Q是一個(gè)初始狀態(tài)為空的隊(duì)列。整型變量S代表資源的實(shí)體,操作系統(tǒng)利用它的狀態(tài)對(duì)并發(fā)進(jìn)程、共享資源進(jìn)行管理。信號(hào)量的值只能通過(guò)P,V操作來(lái)改變,其可能的取值范圍是負(fù)整數(shù)、零、正整數(shù)。信號(hào)量是操作系統(tǒng)中實(shí)現(xiàn)進(jìn)程間同步和通信的常用工具。

一個(gè)信號(hào)量的建立必須經(jīng)過(guò)說(shuō)明,即應(yīng)該準(zhǔn)確說(shuō)明S的意義和初值。每個(gè)信號(hào)量都有相應(yīng)的一個(gè)隊(duì)列,在建立信號(hào)量時(shí),隊(duì)列為空。4.3信號(hào)量和PV操作4.3.2PV操作

信號(hào)量的數(shù)值僅能由P,V操作加以改變。對(duì)信號(hào)量的P操作記為P(S),對(duì)信號(hào)量的V操作記為V(S),它們都是不可分割的原語(yǔ)操作。它們的主要操作過(guò)程如下:

1.?P操作過(guò)程

(1)?S值減1。

(2)若相減結(jié)果大于或等于0,則進(jìn)程繼續(xù)執(zhí)行。

(3)若相減結(jié)果小于0,則該進(jìn)程被阻塞,并將它插入到該信號(hào)量的等待隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度。

2.?V操作過(guò)程

(1)?S值加1。

(2)若相加結(jié)果大于0,則進(jìn)程繼續(xù)執(zhí)行。

(3)若相加結(jié)果小于或等于0,則從該信號(hào)量的等待隊(duì)列中移出一個(gè)進(jìn)程,解除它的等待狀態(tài),然后返回本進(jìn)程繼續(xù)執(zhí)行。4.3.3利用信號(hào)量實(shí)現(xiàn)進(jìn)程互斥

為了實(shí)現(xiàn)對(duì)相關(guān)臨界區(qū)的管理要求,先分析一下P,V操作的兩個(gè)過(guò)程,如果把信號(hào)量S的初值定為“1”,此時(shí)有若干個(gè)進(jìn)程都要調(diào)用P(S),則只有第一個(gè)調(diào)用P(S)的進(jìn)程不會(huì)處于等待而可以繼續(xù)執(zhí)行下去。P(S)被調(diào)用一次后S的值變?yōu)椤?”,以后其他進(jìn)程調(diào)用P(S)時(shí),在執(zhí)行S=S-1后,S的值總是小于“0”,于是這些進(jìn)程均被置成等待信號(hào)量S的狀態(tài)。直到有進(jìn)程調(diào)用一次V(S),將信號(hào)量S加“1”,若其結(jié)果不大于“0”,說(shuō)明有進(jìn)程正處于等待信號(hào)量S的狀態(tài),這時(shí)V(S)將釋放其中的一個(gè)進(jìn)程,每調(diào)用一次V(S)就可釋放一個(gè)等待信號(hào)量S的進(jìn)程。因此,用PV操作能夠?qū)崿F(xiàn)對(duì)相關(guān)臨界區(qū)的管理要求。只要用一個(gè)信號(hào)量與一組涉及共享變量的相關(guān)臨界區(qū)聯(lián)系起來(lái),信號(hào)量的初值定為“1”,任何一個(gè)進(jìn)程要進(jìn)入臨界區(qū)前先調(diào)用P操作,執(zhí)行完臨界區(qū)的操作后,退出臨界區(qū)時(shí)調(diào)用V操作。例如,設(shè)兩個(gè)并發(fā)進(jìn)程A和B,具有相對(duì)于變量N的臨界段CSA和CSB,用信號(hào)量實(shí)現(xiàn)它們的互斥情況可描述如下:對(duì)于兩個(gè)并發(fā)進(jìn)程,互斥信號(hào)量的值僅取1、0、-1三個(gè)值。

若S=1,表示沒(méi)有進(jìn)程進(jìn)入臨界區(qū);

若S=0,表示有一個(gè)進(jìn)程進(jìn)入臨界區(qū);

若S=?-1,表示一個(gè)進(jìn)程進(jìn)入臨界區(qū),另一個(gè)進(jìn)程等待進(jìn)入。

下面請(qǐng)大家思考這樣一個(gè)問(wèn)題,如果N個(gè)并發(fā)進(jìn)程共用一個(gè)公共變量Q,用信號(hào)量和PV操作實(shí)現(xiàn)這N個(gè)進(jìn)程的互斥,信號(hào)量的取值范圍如何呢?首先要把信號(hào)量的初值定為“1”,當(dāng)N個(gè)進(jìn)程中有一個(gè)進(jìn)程進(jìn)入臨界區(qū)時(shí),由于調(diào)用了P(S),則信號(hào)量的值將變?yōu)椤?”。其余N?-1個(gè)進(jìn)程也要調(diào)用P(S),而且第一個(gè)進(jìn)程沒(méi)有退出臨界區(qū),導(dǎo)致了N-1個(gè)進(jìn)程均被置成等待信號(hào)量S的狀態(tài),當(dāng)?shù)诙€(gè)進(jìn)程置成等待狀態(tài)時(shí),信號(hào)量的值為-2,依次類(lèi)推,-3、-4,直到信號(hào)量的值為-(N?-1),此時(shí)N?-1個(gè)進(jìn)程都入了等待隊(duì)列。所以,信號(hào)量的取值范圍為[-(N?-1),1]。前面曾討論過(guò)交通路口的自動(dòng)計(jì)數(shù)系統(tǒng)中出現(xiàn)的與時(shí)間有關(guān)的錯(cuò)誤,現(xiàn)在可以用PV操作來(lái)解決這個(gè)問(wèn)題,具體過(guò)程描述如下:4.3.4哲學(xué)家進(jìn)餐問(wèn)題

哲學(xué)家問(wèn)題是描述有5個(gè)哲學(xué)家,它們的生活方式是交替地進(jìn)行思考和進(jìn)餐。哲學(xué)家們共用一張圓桌,分別坐在周?chē)?把椅子上。在圓桌上有5個(gè)碗和5支筷子,平時(shí)一個(gè)哲學(xué)家進(jìn)行思考,饑餓時(shí)便試圖取用其左右最靠近他的筷子,只有在他拿到兩支筷子時(shí)才能進(jìn)餐。進(jìn)餐畢,放下筷子又繼續(xù)思考。請(qǐng)用信號(hào)量和PV操作說(shuō)明這五位哲學(xué)家的同步

過(guò)程。經(jīng)過(guò)分析可以知道,相鄰的兩個(gè)哲學(xué)家是不能同時(shí)拿起它們中間的筷子的,在使用這個(gè)筷子的時(shí)候,哲學(xué)家們必須互斥使用。由于每個(gè)哲學(xué)家之間的筷子都不能同時(shí)拿起,因此,需要設(shè)置5個(gè)互斥信號(hào)量,下面是具體的實(shí)現(xiàn)過(guò)程:4.3.5讀者-寫(xiě)者問(wèn)題

在計(jì)算機(jī)系統(tǒng)中,有些文件是可以供若干進(jìn)程共享的。假定有某個(gè)共享文件F,系統(tǒng)允許進(jìn)程對(duì)文件F讀或者修改,但規(guī)定:

(1)多個(gè)進(jìn)程可以同時(shí)讀文件F。

(2)任一個(gè)進(jìn)程在對(duì)文件F進(jìn)行修改時(shí)不允許其他進(jìn)程對(duì)文件進(jìn)行讀或者修改。

(3)當(dāng)有進(jìn)程在讀文件時(shí)不允許任何進(jìn)程去修改文件。在這個(gè)問(wèn)題中,可以把想讀文件的進(jìn)程稱(chēng)為讀者,把想修改文件的進(jìn)程稱(chēng)為寫(xiě)者。當(dāng)有多個(gè)讀者和寫(xiě)者都要對(duì)文件讀或?qū)憰r(shí),按規(guī)定每次只允許一個(gè)進(jìn)程執(zhí)行寫(xiě)操作且有進(jìn)程執(zhí)行寫(xiě)時(shí)不允許進(jìn)程去讀文件。顯然,寫(xiě)者和寫(xiě)者之間要互斥,寫(xiě)者和讀者之間也要互斥,但多個(gè)讀者之間可同時(shí)讀。

下面用PV操作實(shí)現(xiàn)“讀者和寫(xiě)者”問(wèn)題。4.4.1同步的概念

利用信號(hào)量可以解決進(jìn)程的互斥問(wèn)題,互斥主要解決并發(fā)進(jìn)程對(duì)臨界區(qū)的使用問(wèn)題。這種基于臨界區(qū)控制的交互作用是比較簡(jiǎn)單的,只要各進(jìn)程對(duì)臨界區(qū)的執(zhí)行時(shí)間互斥,每個(gè)進(jìn)程就可忽略其他進(jìn)程的存在和作用。4.4進(jìn)程同步在計(jì)算機(jī)系統(tǒng)中,還會(huì)存在一組相互合作的進(jìn)程實(shí)現(xiàn)一個(gè)共同的任務(wù)的情況。在這組相互合作的并發(fā)進(jìn)程中,每一個(gè)進(jìn)程都以各自獨(dú)立、不可預(yù)知的速度向前推進(jìn),它們之間要協(xié)作,就要交換一定的信息,需要彼此知道相互的存在和作用。例如,當(dāng)某進(jìn)程未獲得其合作進(jìn)程發(fā)出的消息之前,該進(jìn)程就等待,直到所需信息收到時(shí)才變?yōu)榫途w狀態(tài)以便繼續(xù)執(zhí)行,從而實(shí)現(xiàn)各進(jìn)程的協(xié)調(diào)運(yùn)行。所謂同步,就是并發(fā)進(jìn)程在一些關(guān)鍵點(diǎn)上可能要互相等待與互通消息,這種相互制約的等待與互通消息稱(chēng)為進(jìn)程同步。同步意味著兩個(gè)或多個(gè)進(jìn)程之間根據(jù)它們一致同意的協(xié)議進(jìn)行相互作用。要實(shí)現(xiàn)同步,一定存在著必須遵循的同步規(guī)則。同步的例子不僅在操作系統(tǒng)中有,在日常生活中也大量存在。例如,醫(yī)生為某病員診病,認(rèn)為需要做某些化驗(yàn),于是,就為病員開(kāi)了化驗(yàn)單。病員取樣送到化驗(yàn)室,等待化驗(yàn)完畢交回化驗(yàn)結(jié)果,然后繼續(xù)診病。醫(yī)生為病員診病是一個(gè)進(jìn)程,化驗(yàn)室的化驗(yàn)工作又是另一個(gè)進(jìn)程,它們是各自獨(dú)立的活動(dòng)單位,但他們共同完成醫(yī)療任務(wù),所以需要交換信息。上述這兩個(gè)合作進(jìn)程之間的同步關(guān)系為:化驗(yàn)進(jìn)程只有在接收到診病進(jìn)程的化驗(yàn)單后才開(kāi)始工作;而診病進(jìn)程只有獲得化驗(yàn)結(jié)果后才能繼續(xù)為該病員診病,并根據(jù)化驗(yàn)結(jié)果確定醫(yī)療方案。在操作系統(tǒng)中進(jìn)程同步的例子:為了把原始的一批記錄加工成當(dāng)前需要的記錄,創(chuàng)建兩個(gè)進(jìn)程A和B。進(jìn)程A啟動(dòng)輸入設(shè)備不斷地讀記錄,每讀一個(gè)記錄,存入緩沖區(qū),進(jìn)程B從緩沖區(qū)中取出記錄進(jìn)行加工。進(jìn)程A和進(jìn)程B是兩個(gè)并發(fā)進(jìn)程,它們共享緩沖區(qū),如果對(duì)兩個(gè)進(jìn)程不進(jìn)行制約的話就會(huì)造成如下錯(cuò)誤:

(1)當(dāng)進(jìn)程A的執(zhí)行速度超過(guò)進(jìn)程B的執(zhí)行速度時(shí),可能進(jìn)程A把一個(gè)記錄存入緩沖區(qū)后,進(jìn)程B還沒(méi)有取走,進(jìn)程A又把新讀出的一個(gè)記錄存入緩沖區(qū),后一個(gè)記錄就會(huì)把尚未取走的記錄覆蓋了,造成記錄的丟失。

(2)當(dāng)進(jìn)程B的執(zhí)行速度超過(guò)進(jìn)程A的執(zhí)行速度時(shí),可能進(jìn)程B從緩沖區(qū)取出一個(gè)記錄并加工后,進(jìn)程A仍沒(méi)有把下一個(gè)新記錄存入緩沖區(qū),而進(jìn)程B卻又從緩沖區(qū)去取記錄,造成重復(fù)地取出同一個(gè)記錄加工。用進(jìn)程互斥的辦法不能克服上述兩種錯(cuò)誤,事實(shí)上,進(jìn)程A和進(jìn)程B雖然共享緩沖區(qū),但它們都是在無(wú)進(jìn)程使用緩沖區(qū)時(shí)才向緩沖區(qū)存記錄或從緩沖區(qū)取記錄的。也就是說(shuō),它們?cè)诨コ馐褂霉蚕砭彌_區(qū)的情況下仍發(fā)生錯(cuò)誤。引起錯(cuò)誤的根本原因是它們的速度,可以采用互通消息的辦法來(lái)控制它們的執(zhí)行速度,使相互協(xié)作的進(jìn)程正確工作。兩個(gè)進(jìn)程應(yīng)如下協(xié)作:

(1)進(jìn)程A把一個(gè)記錄存入緩沖區(qū)后,應(yīng)向進(jìn)程B發(fā)送“緩沖區(qū)中有記錄”的消息。

(2)進(jìn)程B從緩沖區(qū)中取出記錄后,應(yīng)向進(jìn)程A發(fā)送“緩沖區(qū)中的記錄已取走”的消息。

(3)進(jìn)程A只有在得到進(jìn)程B發(fā)送來(lái)的“緩沖區(qū)中的記錄已取走”的消息后,才能把下一個(gè)記錄再存入緩沖區(qū)。否則進(jìn)程A等待,直到消息到達(dá)。

(4)進(jìn)程B只有在得到進(jìn)程A發(fā)送來(lái)的“緩沖區(qū)中有記錄”的消息后,才能從緩沖區(qū)中取出記錄并加工。否則進(jìn)程B等待,直到消息到達(dá)。4.4.2利用信號(hào)量和PV操作實(shí)現(xiàn)進(jìn)程同步

要實(shí)現(xiàn)進(jìn)程的同步就必須提供一種機(jī)制,該機(jī)制能把進(jìn)程需要的消息發(fā)出去,也能測(cè)試自己需要的消息是否到達(dá)。把能實(shí)現(xiàn)進(jìn)程同步的機(jī)制稱(chēng)為“同步機(jī)制”。不同的同步機(jī)制實(shí)現(xiàn)同步的方法也不同,在這里,將介紹利用PV操作實(shí)現(xiàn)進(jìn)程的同步。

在前面的學(xué)習(xí)中,已經(jīng)知道如何用PV操作實(shí)現(xiàn)進(jìn)程的互斥。事實(shí)上,PV操作不僅是實(shí)現(xiàn)進(jìn)程互斥的有效工具,而且還是實(shí)現(xiàn)同步的工具。把一個(gè)信號(hào)量與一個(gè)消息聯(lián)系起來(lái),當(dāng)信號(hào)量的值為“0”時(shí),表示期望的消息尚未產(chǎn)生,當(dāng)信號(hào)量的值為非“0”時(shí),表示期望的消息已經(jīng)存在。假定信號(hào)量S表示某個(gè)消息,現(xiàn)在來(lái)看如何用PV操作實(shí)現(xiàn)進(jìn)程同步。

1.調(diào)用P操作判定消息是否到達(dá)

任何進(jìn)程調(diào)用P操作可以判定自己所期望的消息是否到達(dá)。若消息尚未產(chǎn)生,則S=0,調(diào)用P(S)后,在執(zhí)行完P(guān)操作的第一步S=S-1后,S的值變成-1,使調(diào)用者成為等待信號(hào)量S的狀態(tài),即調(diào)用者要等待直到消息到達(dá)為止;若消息已經(jīng)存在,則S>0,調(diào)用P(S)后,進(jìn)程不會(huì)成為等待狀態(tài)而可以繼續(xù)執(zhí)行,即進(jìn)程測(cè)試到自己期望的消息已經(jīng)存在。

2.調(diào)用V操作發(fā)送消息

任何進(jìn)程調(diào)用V操作可以向其他進(jìn)程發(fā)送消息。若調(diào)用V操作之前S=0,表示消息尚未產(chǎn)生且無(wú)等待消息的進(jìn)程,調(diào)用V(S)后,在執(zhí)行完V操作的第一步S=S+1后,使S>0,即意味著消息已經(jīng)存在;若調(diào)用V操作之前S<0,表示消息未產(chǎn)生前已經(jīng)有進(jìn)程在等待消息,這時(shí)調(diào)用V操作后將釋放一個(gè)等待消息的進(jìn)程,即表示該進(jìn)程等待的消息已經(jīng)到達(dá),可以繼續(xù)執(zhí)行。圖4-1計(jì)算進(jìn)程和打印進(jìn)程在用PV操作實(shí)現(xiàn)進(jìn)程同步時(shí),一定要根據(jù)具體的問(wèn)題來(lái)定義信號(hào)量和調(diào)用P操作、V操作。一個(gè)信號(hào)量與一個(gè)消息聯(lián)系在一起,當(dāng)有多個(gè)消息時(shí)必須定義多個(gè)信號(hào)量,測(cè)試不同的消息是否到達(dá)或發(fā)送不同的消息時(shí),應(yīng)對(duì)不同的信號(hào)量調(diào)用P操作和V操作。圖4-1計(jì)算進(jìn)程和打印進(jìn)程首先分析兩個(gè)并發(fā)進(jìn)程的同步規(guī)則:

(1)當(dāng)CP進(jìn)程把計(jì)算結(jié)果送入BUFFER時(shí),PN進(jìn)程才能從BUFFER中取出計(jì)算結(jié)果去打印。

(2)當(dāng)PN進(jìn)程把BUFFER中的數(shù)據(jù)取出打印后,CP進(jìn)程才能把下一個(gè)計(jì)算結(jié)果送入BUFFER中。

為了遵循上述同步規(guī)則,這兩個(gè)進(jìn)程在并發(fā)操作時(shí)必須互通消息。為此,設(shè)置兩個(gè)信號(hào)量SA和SB。信號(hào)量SA用來(lái)表示緩沖區(qū)有無(wú)空位置存放新的信息,其初值為“1”。信號(hào)量SB用來(lái)表示緩沖區(qū)中是否有可供打印的計(jì)算結(jié)果,其初值為“0”。上述兩個(gè)進(jìn)程之間的同步可描述如下:4.4.3生產(chǎn)者-消費(fèi)者問(wèn)題

生產(chǎn)者-消費(fèi)者問(wèn)題是一個(gè)典型的進(jìn)程同步的例子。計(jì)算機(jī)系統(tǒng)中的每個(gè)進(jìn)程都可以消費(fèi)(使用)和生產(chǎn)(釋放)某類(lèi)資源,這些資源可以是硬資源(如主存緩沖區(qū)、外設(shè)或處理機(jī)),也可以是軟資源(如臨界區(qū)、消息)等。當(dāng)系統(tǒng)中某一進(jìn)程使用某一資源時(shí),可以看做是消耗,且該進(jìn)程稱(chēng)為消費(fèi)者。而當(dāng)某個(gè)進(jìn)程釋放資源時(shí),則它就相當(dāng)于一個(gè)生產(chǎn)者。比如在上例中,對(duì)數(shù)據(jù)而言,計(jì)算進(jìn)程相當(dāng)于生產(chǎn)者,打印進(jìn)程相當(dāng)于消費(fèi)者。通過(guò)一個(gè)有界緩沖區(qū)可以把一群生產(chǎn)者P1,P2,P3,…,Pm和一群消費(fèi)者C1,C2,C3,…,Ck聯(lián)系起來(lái),如圖4-2所示。假定這些生產(chǎn)者和消費(fèi)者是互相等效的。只要緩沖區(qū)未滿(mǎn),生產(chǎn)者就可以把產(chǎn)品送入緩沖區(qū),類(lèi)似地,只要緩沖區(qū)未空,消費(fèi)者便可以從緩沖區(qū)中取走物品并消耗它。生產(chǎn)者和消費(fèi)者的同步關(guān)系將禁止生產(chǎn)者向滿(mǎn)的緩沖區(qū)輸送產(chǎn)品,也禁止消費(fèi)者從空的緩沖區(qū)中提取產(chǎn)品。圖4-2生產(chǎn)者-消費(fèi)者問(wèn)題為了解決這一類(lèi)生產(chǎn)者-消費(fèi)者問(wèn)題,應(yīng)該設(shè)置兩個(gè)同步信號(hào)量,一個(gè)表示緩沖區(qū)是否為空,用empty表示,其初值為有界緩沖區(qū)的大小n,因?yàn)榫彌_區(qū)中可以有n個(gè)單元存放產(chǎn)品,所以初值設(shè)為“n”。另一個(gè)表示緩沖區(qū)是否有信息,用full表示,其初值為“0”,因?yàn)樽畛蹙彌_區(qū)中無(wú)信息,所以初值設(shè)為0。在本例中有P1,P2,P3,…,Pm個(gè)生產(chǎn)者和C1,C2,C3,…,Ck個(gè)消費(fèi)者,它們?cè)趫?zhí)行生產(chǎn)活動(dòng)和消費(fèi)活動(dòng)中要對(duì)有界緩沖區(qū)進(jìn)行操作。由于有界緩沖區(qū)是一個(gè)臨界資源,必須互斥使用,因此,另外還需設(shè)置一個(gè)互斥信號(hào)量mutex,其初值為“1”。生產(chǎn)者-消費(fèi)者問(wèn)題的同步描述如下:

生產(chǎn)者-消費(fèi)者問(wèn)題是非常典型的問(wèn)題,有許多問(wèn)題可以歸結(jié)為生產(chǎn)者-消費(fèi)者問(wèn)題,但也要根據(jù)實(shí)際情況靈活應(yīng)用。下面給出幾個(gè)例題來(lái)進(jìn)一步說(shuō)明進(jìn)程同步問(wèn)題。

【例4-1】有三個(gè)進(jìn)程PA、PB和PC合作解決文件打印問(wèn)題,如圖4-3所示:PA將文件記錄從磁盤(pán)讀入緩沖區(qū)1中,每執(zhí)行一次讀一個(gè)記錄;PB將緩沖區(qū)1中的內(nèi)容復(fù)制到緩沖區(qū)2中,每執(zhí)行一次復(fù)制一個(gè)記錄;PC將緩沖區(qū)2的內(nèi)容打印出來(lái),每執(zhí)行一次打印一個(gè)記錄。這兩個(gè)緩沖區(qū)都是單緩沖區(qū),只能放一個(gè)記錄。請(qǐng)用PV操作來(lái)保證文件的正確打印。圖4-3三個(gè)合作進(jìn)程

【例4-2】桌上有一個(gè)空盤(pán)子,允許存放一個(gè)水果。爸爸可向盤(pán)中放蘋(píng)果,也可向盤(pán)中放桔子,兒子專(zhuān)等吃盤(pán)中的桔子,女兒專(zhuān)等吃盤(pán)中的蘋(píng)果。請(qǐng)用PV操作實(shí)現(xiàn)爸爸、兒子和女兒三個(gè)并發(fā)進(jìn)程的同步。

【例4-3】

設(shè)公共汽車(chē)上,司機(jī)和售票員的活動(dòng)分別是:在汽車(chē)不斷地到站、停車(chē)、行駛過(guò)程中,為保證乘客的安全,司機(jī)與售票員應(yīng)密切配合協(xié)調(diào)工作。請(qǐng)用PV操作來(lái)實(shí)現(xiàn)司機(jī)與售票員之間的同步。4.5.1進(jìn)程通信的類(lèi)型

隨著操作系統(tǒng)的發(fā)展,進(jìn)程通信機(jī)制也在發(fā)展,由早期的低級(jí)進(jìn)程通信機(jī)制發(fā)展為能傳遞大量數(shù)據(jù)的高級(jí)通信機(jī)制。目前,高級(jí)通信機(jī)制可歸結(jié)為三大類(lèi):共享存儲(chǔ)器系統(tǒng)、消息傳遞系統(tǒng)以及管道通信系統(tǒng)。4.5進(jìn)程通信

1.共享存儲(chǔ)器系統(tǒng)

在共享存儲(chǔ)器系統(tǒng)中,相互通信的進(jìn)程共享某些數(shù)據(jù)結(jié)構(gòu)或共享存儲(chǔ)區(qū),進(jìn)程之間能夠通過(guò)它們進(jìn)行通信。由此,又可把它們進(jìn)一步分成基于共享數(shù)據(jù)結(jié)構(gòu)的通信方式和基于共享存儲(chǔ)區(qū)的通信方式。

1)基于共享數(shù)據(jù)結(jié)構(gòu)的通信方式

在這種通信方式中,要求各進(jìn)程共用某些數(shù)據(jù)結(jié)構(gòu),進(jìn)程通過(guò)它們交換信息。如在生產(chǎn)者-消費(fèi)者問(wèn)題中,就是用有界緩沖區(qū)這種數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)通信的。這里,共用數(shù)據(jù)結(jié)構(gòu)的設(shè)置及對(duì)進(jìn)程間同步的處理,都是程序員的職責(zé)。這無(wú)疑增加了程序員的負(fù)擔(dān),而操作系統(tǒng)卻只需提供共享存儲(chǔ)器。因此,這種通信方式是低效的,只適于傳遞少量數(shù)據(jù)。

2)基于共享存儲(chǔ)區(qū)的通信方式

為了傳輸大量的數(shù)據(jù),在存儲(chǔ)器中劃出一塊共享存儲(chǔ)區(qū),各進(jìn)程可以通過(guò)對(duì)共享存儲(chǔ)區(qū)中的數(shù)據(jù)進(jìn)行讀或?qū)憗?lái)實(shí)現(xiàn)通信。這種通信方式屬于高級(jí)通信。進(jìn)程在通信前,向系統(tǒng)申請(qǐng)共享存儲(chǔ)區(qū)中的一個(gè)分區(qū),并指定該分區(qū)的關(guān)鍵字;若系統(tǒng)已經(jīng)給其他進(jìn)程分配了這樣的分區(qū),則將該分區(qū)的描述符返回給申請(qǐng)者。接著,申請(qǐng)者把獲得的共享存儲(chǔ)分區(qū)連接到本進(jìn)程上;此后,便可像讀寫(xiě)普通存儲(chǔ)器一樣地讀寫(xiě)公用存儲(chǔ)分區(qū)。

2.消息傳遞系統(tǒng)

在消息傳遞系統(tǒng)中,進(jìn)程間的數(shù)據(jù)交換以消息為單位。在計(jì)算機(jī)網(wǎng)絡(luò)中,消息又稱(chēng)為報(bào)文。程序員直接利用系統(tǒng)提供的一組通信命令來(lái)實(shí)現(xiàn)通信。操作系統(tǒng)隱藏了通信的實(shí)現(xiàn)細(xì)節(jié),簡(jiǎn)化了通信程序編制的復(fù)雜性,因而獲得廣泛的應(yīng)用。消息傳遞系統(tǒng)的通信方式屬于高級(jí)通信方式。

3.管道通信

所謂管道,是指用于連接一個(gè)讀進(jìn)程和一個(gè)寫(xiě)進(jìn)程,以實(shí)現(xiàn)它們之間通信的共享文件。向管道提供輸入的發(fā)送進(jìn)程,以字符流形式將大量的數(shù)據(jù)送入管道;而接收管道輸出的接收進(jìn)程,可從管道中接收數(shù)據(jù)。由于發(fā)送進(jìn)程和接收進(jìn)程是利用管道進(jìn)行通信的,故稱(chēng)為管道通信。4.5.2直接通信和間接通信方式

在進(jìn)程之間通信時(shí),源進(jìn)程可以直接或間接地將消息傳送給目標(biāo)進(jìn)程,由此可將進(jìn)程通信分為直接進(jìn)程通信和間接進(jìn)程通信。

1.直接通信方式

直接通信方式是指發(fā)送進(jìn)程利用操作系統(tǒng)所提供的發(fā)送命令,直接把消息發(fā)送給目標(biāo)進(jìn)程。此時(shí),要求發(fā)送進(jìn)程和接收進(jìn)程都以顯式的方式,提供對(duì)方的標(biāo)識(shí)符。通常,系統(tǒng)提供下述兩條通信原語(yǔ):

Send(Receiver,message);

Receive(Sender,message);

2.間接通信方式

間接通信方式是指進(jìn)程之間的通信,需要通過(guò)作為某種共享數(shù)據(jù)結(jié)構(gòu)的實(shí)體。該實(shí)體用來(lái)暫存發(fā)送進(jìn)程發(fā)送給目標(biāo)進(jìn)程的消息;接收進(jìn)程則從該實(shí)體中取出對(duì)方發(fā)送給自己的消息。通常把這種中間實(shí)體稱(chēng)為信箱。消息在信箱中可以安全地保存,只允許核準(zhǔn)的目標(biāo)用戶(hù)隨時(shí)讀取。因此,利用信箱通信方式,既可實(shí)現(xiàn)實(shí)時(shí)通信,也可實(shí)現(xiàn)非實(shí)時(shí)通信。系統(tǒng)為信箱通信提供了若干條原語(yǔ),用于信箱的創(chuàng)建、撤銷(xiāo)和消息的發(fā)送、接收等。

(1)信箱的創(chuàng)建和撤銷(xiāo)。進(jìn)程可利用信箱創(chuàng)建原語(yǔ)來(lái)建立一個(gè)新信箱。創(chuàng)建者進(jìn)程應(yīng)給出信箱名字、信箱屬性(公用、私用或共享);對(duì)于共享信箱,還應(yīng)給出共享者的名字。當(dāng)進(jìn)程不再需要讀信箱時(shí),可用信箱撤消原語(yǔ)來(lái)撤消它。

(2)消息的發(fā)送和接收。當(dāng)進(jìn)程之間要利用信箱進(jìn)行通信時(shí),又必須共享信箱,可利用系統(tǒng)提供的下述通信原語(yǔ)來(lái)實(shí)現(xiàn)。

Send(mailbox,message);將一個(gè)消息發(fā)送到指定信箱;

Receive(mailbox,message);從指定信箱中接收一個(gè)消息;信箱可由操作系統(tǒng)創(chuàng)建,也可由用戶(hù)進(jìn)程創(chuàng)建,創(chuàng)建者是信箱的擁有者,據(jù)此,可把信箱分為以下三類(lèi):

(1)私用信箱。用戶(hù)進(jìn)程可為自己建立一個(gè)新信箱,并作為該進(jìn)程的一部分。信箱的擁有者有權(quán)從信箱中讀取消息,其他用戶(hù)則只能將自己構(gòu)成的消息發(fā)送到該信箱中。這種私用信箱可采用單向通信鏈路信箱實(shí)現(xiàn)。當(dāng)擁有該信箱的進(jìn)程結(jié)束時(shí),信箱也隨之消失。

(2)公用信箱。它由操作系統(tǒng)創(chuàng)建,并提供給系統(tǒng)中的所有核準(zhǔn)進(jìn)程使用。核準(zhǔn)進(jìn)程既可把消息發(fā)送到該信箱中,也可從信箱中取出發(fā)送給自己的消息。顯然,公用信箱應(yīng)采用雙向通信鏈路的信箱來(lái)實(shí)現(xiàn)。通常,公用信箱在系統(tǒng)運(yùn)行期間始終存在。

(3)共享信箱。它由某進(jìn)程創(chuàng)建,在創(chuàng)建時(shí)或創(chuàng)建后,指明它是可供共享的,同時(shí)需指出共享進(jìn)程的名字。信箱的擁有者和共享者,都有權(quán)從信箱中取走發(fā)送給自己的消息。在利用信箱通信時(shí),在發(fā)送進(jìn)程和接收進(jìn)程之間,存在下述四種關(guān)系:

(1)一對(duì)一關(guān)系。即可以為發(fā)送進(jìn)程和接收進(jìn)程建立一條專(zhuān)用的通信鏈路,使它們之間的交互,不受其他進(jìn)程的影響。

(2)多對(duì)一關(guān)系。允許提供服務(wù)的進(jìn)程與多個(gè)用戶(hù)進(jìn)程之間進(jìn)行交互,也稱(chēng)為客戶(hù)/服務(wù)器交互。

(3)一對(duì)多關(guān)系。允許一個(gè)發(fā)送進(jìn)程與多個(gè)接收進(jìn)程進(jìn)行交互,使發(fā)送進(jìn)程可用廣播形式,向接收者發(fā)送消息。

(4)多對(duì)多關(guān)系。允許建立一個(gè)公用信箱,讓多個(gè)進(jìn)程都能向信箱中投遞消息,也可從信箱中取走屬于自己的消息。4.5.3消息傳遞系統(tǒng)中的幾個(gè)問(wèn)題

在單機(jī)和計(jì)算機(jī)網(wǎng)絡(luò)環(huán)境下,高級(jí)進(jìn)程通信廣泛采用消息傳遞系統(tǒng)。因此,對(duì)這種通信中的幾個(gè)主要問(wèn)題做扼要的闡述。

1.通信鏈路

為了在發(fā)送進(jìn)程和接收進(jìn)程之間能進(jìn)行通信,必須在它們之間建立一條通信鏈路。有以下兩種建立通信鏈路的方式:

(1)顯式建立鏈路。由發(fā)送進(jìn)程在通信之前,用“建立連接”原語(yǔ)請(qǐng)求系統(tǒng)為之建立一條通信鏈路;在鏈路使用完后,也應(yīng)用顯式方式拆除鏈路。這種方式主要用于計(jì)算機(jī)網(wǎng)

絡(luò)中。

(2)隱式建立鏈路。發(fā)送進(jìn)程無(wú)需明確提出建立鏈路的請(qǐng)求,只需利用系統(tǒng)提供的發(fā)送原語(yǔ),系統(tǒng)會(huì)自動(dòng)地為之建立一條鏈路。這種方式主要用于單機(jī)系統(tǒng)中。根據(jù)通信鏈路的連接方法,又可把通信鏈路分為:

(1)點(diǎn)-點(diǎn)連接通信鏈路。一條鏈路只連接兩個(gè)結(jié)點(diǎn)(進(jìn)程)。

(2)多點(diǎn)連接鏈路。一條鏈路連接多個(gè)(n>2)結(jié)點(diǎn)(進(jìn)程)。

根據(jù)通信方式的不同,又可把鏈路分為:

(1)單向通信鏈路。只允許發(fā)送進(jìn)程向接收進(jìn)程發(fā)送消息。

(2)雙向鏈路。允許由進(jìn)程A向進(jìn)程B發(fā)送消息,也允許進(jìn)程B同時(shí)向進(jìn)程A發(fā)送消息。根據(jù)通信鏈路容量的不同也可把鏈路分成:

(1)無(wú)容量通信鏈路。在這種通信鏈路上沒(méi)有緩沖區(qū),因而不能暫存任何消息。

(2)有容量通信鏈路。在通信鏈路中設(shè)置了緩沖區(qū),因而能暫存消息。緩沖區(qū)數(shù)目愈大,通信鏈路的容量愈大。

2.消息的格式

在消息傳遞系統(tǒng)中所用的消息格式,與它所處的環(huán)境有關(guān)。在單機(jī)系統(tǒng)環(huán)境中,消息格式比較簡(jiǎn)單;但在計(jì)算機(jī)網(wǎng)絡(luò)環(huán)境下,消息的格式就比較復(fù)雜了。通常,可把一個(gè)消息分成消息頭和消息正文兩部分。消息頭包括消息傳輸時(shí)所需的控制信息,如發(fā)送進(jìn)程名、接收進(jìn)程名、消息長(zhǎng)度、消息類(lèi)型、消息編號(hào)及消息的發(fā)送日期和時(shí)間;而消息正文則是發(fā)送進(jìn)程實(shí)際上所發(fā)送的數(shù)據(jù)。

3.進(jìn)程同步方式

在進(jìn)程之間進(jìn)行通信時(shí),往往也需要輔以進(jìn)程同步,以使它們能協(xié)調(diào)通信。這樣,當(dāng)一個(gè)進(jìn)程發(fā)送一個(gè)消息后,存在兩種可能性:一是發(fā)送進(jìn)程阻塞,直到消息被接收進(jìn)程接收;或者發(fā)送進(jìn)程繼續(xù)執(zhí)行。類(lèi)似地,接收進(jìn)程執(zhí)行完接收原語(yǔ)后,也有兩種可能性:一是當(dāng)它接收完后,其所需的消息又已到達(dá),它將繼續(xù)執(zhí)行,再接收新消息;另一種可能性則是在它接收完后,它所需的新消息尚未到達(dá),此時(shí),接收進(jìn)程又可采取兩種方式之一進(jìn)行處理:其一是進(jìn)行自我阻塞,直至新消息到達(dá);另一種方式是進(jìn)程繼續(xù)執(zhí)行,放棄本次接收。根據(jù)發(fā)送進(jìn)程和接收進(jìn)程都可采取阻塞或繼續(xù)執(zhí)行兩種方式的情況,可組合出以下三種情況。當(dāng)然,對(duì)于一個(gè)實(shí)際系統(tǒng),只能采取其中的一種或兩種。

1)發(fā)送進(jìn)程阻塞、接收進(jìn)程阻塞

這種情況主要用于進(jìn)程之間緊密同步、發(fā)送進(jìn)程和接收進(jìn)程之間無(wú)緩沖區(qū)時(shí)。這兩個(gè)進(jìn)程平時(shí)都處于阻塞狀態(tài),直到有消息傳遞時(shí)才進(jìn)行發(fā)送和接收。這種同步方式稱(chēng)為匯合。

2)發(fā)送進(jìn)程不阻塞、接收進(jìn)程阻塞

這是一種應(yīng)用最廣泛的進(jìn)程同步方式。平時(shí)發(fā)送進(jìn)程不阻塞,因而它可以盡快地把一個(gè)或多個(gè)消息發(fā)給多個(gè)目標(biāo);而接收進(jìn)程平時(shí)則處于阻塞狀態(tài),直到發(fā)送進(jìn)程發(fā)來(lái)消息時(shí),才被喚醒。

3)發(fā)送進(jìn)程和接收進(jìn)程均不阻塞

這也是一種較常見(jiàn)的進(jìn)程同步方式。平時(shí)發(fā)送進(jìn)程和接收進(jìn)程都忙于自己的事情,僅當(dāng)發(fā)生某事件使它無(wú)法繼續(xù)運(yùn)行時(shí),才把自己阻塞起來(lái)等待。

1.實(shí)驗(yàn)內(nèi)容

進(jìn)程同步實(shí)驗(yàn)。

2.實(shí)驗(yàn)?zāi)康?/p>

通過(guò)模擬進(jìn)程同步操作解決生產(chǎn)者-消費(fèi)者問(wèn)題,了解系統(tǒng)中并發(fā)進(jìn)程是怎樣同步執(zhí)行的。

3.實(shí)驗(yàn)題目

編寫(xiě)一段程序模擬PV操作實(shí)現(xiàn)進(jìn)程同步,且用PV操作解決生產(chǎn)者-消費(fèi)者問(wèn)題。4.6進(jìn)程同步實(shí)現(xiàn)舉例

4.實(shí)驗(yàn)提示

(1)?PV操作由P操作原語(yǔ)和V操作原語(yǔ)組成。P操作原語(yǔ)P(S)將信號(hào)量S減1,若S<0則執(zhí)行原語(yǔ)的進(jìn)程被置成等待狀態(tài)。V操作原語(yǔ)V(S)將信號(hào)量S加1,若S≤0則釋放一個(gè)等待的進(jìn)程。

(2)生產(chǎn)者、消費(fèi)者問(wèn)題主要解決的是進(jìn)程并發(fā)執(zhí)行時(shí)訪問(wèn)公共變量的問(wèn)題。假定有一個(gè)生產(chǎn)者和一個(gè)消費(fèi)者。生產(chǎn)者每次生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品存入共享緩沖區(qū)供消費(fèi)者取走。消費(fèi)者每次從共享緩沖區(qū)中取出一個(gè)產(chǎn)品去消費(fèi)。禁止生產(chǎn)者將產(chǎn)品放入已滿(mǎn)的緩沖區(qū),禁止消費(fèi)者從空緩沖區(qū)內(nèi)取產(chǎn)品。

(3)模擬程序中對(duì)應(yīng)關(guān)系如表4-1所示。表4-1對(duì)應(yīng)關(guān)系

5.實(shí)例代碼

//進(jìn)程同步生產(chǎn)者、消費(fèi)者實(shí)例pcustomer.c

//運(yùn)行環(huán)境Redhad9.0gcc4.0

#include<stdio.h>

#include<pthread.h>

#include<unistd.h>

//產(chǎn)品數(shù)量

int_nCurrProductor=0;

intMaxBuffer=10;

//信號(hào)量

pthread_mutex_t_dealmutex;

void*producer(void*arg){

//生產(chǎn)者進(jìn)程

6.結(jié)果分析

通過(guò)運(yùn)行程序可以看到生產(chǎn)和消費(fèi)的過(guò)程。正如所設(shè)想的那樣,當(dāng)沒(méi)有產(chǎn)品時(shí)消費(fèi)者進(jìn)程會(huì)等待一個(gè)產(chǎn)品的生產(chǎn),并提示“沒(méi)有產(chǎn)品了”。而緩沖區(qū)裝滿(mǎn)時(shí)生產(chǎn)者進(jìn)程會(huì)停止生產(chǎn),等待消費(fèi)者進(jìn)程消費(fèi)產(chǎn)品。兩個(gè)進(jìn)程間通過(guò)信號(hào)量方法實(shí)現(xiàn)進(jìn)程同步。

1.實(shí)驗(yàn)內(nèi)容

進(jìn)程通信實(shí)驗(yàn)。

2.實(shí)驗(yàn)?zāi)康?/p>

通過(guò)編寫(xiě)進(jìn)程通信程序,了解進(jìn)程間是怎樣通信的。掌握一種進(jìn)程通信方法并從原理入手,深入理解進(jìn)程通信是如何實(shí)現(xiàn)的。

3.實(shí)驗(yàn)題目

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論