操作系統(tǒng)管程機制課件_第1頁
操作系統(tǒng)管程機制課件_第2頁
操作系統(tǒng)管程機制課件_第3頁
操作系統(tǒng)管程機制課件_第4頁
操作系統(tǒng)管程機制課件_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

2.管程的定義

Hansen為管程下的定義是:“一個管程(monitor)定義了一種數(shù)據(jù)結(jié)構(gòu)和并發(fā)進程在該數(shù)據(jù)結(jié)構(gòu)上執(zhí)行的一組操作,這組操作用來實現(xiàn)進程間的同步和改變管程中的數(shù)據(jù)”。用管程管理循環(huán)緩沖區(qū)時,要給出管程名稱,給出與所管理的共享資源(緩沖區(qū))有關的數(shù)據(jù)結(jié)構(gòu),給出在數(shù)據(jù)結(jié)構(gòu)上執(zhí)行的一組操作,以及數(shù)據(jù)結(jié)構(gòu)的初始化代碼。如圖示。局部數(shù)據(jù)、條件變量、一組操作都屬于定義性質(zhì)的,初始化代碼才是真正的管程體。8.4管程機制

第1頁/共28頁用管程管理循環(huán)緩沖區(qū)時管程的定義。8.4管程機制

第2頁/共28頁局部數(shù)據(jù)和條件變量(2)條件變量是一種特殊變量,當進程在管程定義的操作中使用共享資源時,若無法繼續(xù)運行,就在某個條件變量上執(zhí)行wait()操作等待,將管程讓給等候在管程外的進程使用,直等到有進程在該條件變量上做signal()操作才被喚醒。(1)局部數(shù)據(jù)是管程管理的共享資源的數(shù)據(jù)結(jié)構(gòu),是對共享資源的抽象。(3)條件變量不是計數(shù)器,也不像信號量那樣對信號進行累計。若向有關條件變量發(fā)送信號(即調(diào)用signal()操作),而在該條件變量上沒有等待的進程,那么信號就丟失。8.4管程機制

第3頁/共28頁(2)管程中定義的函數(shù)分兩類:外部函數(shù)是那些進程可從外部調(diào)用的函數(shù),是進程進入管程的入口;內(nèi)部函數(shù)是只能由管程內(nèi)的函數(shù)調(diào)用的函數(shù),進程不知道它們的存在,不能調(diào)用它們。建立在局部數(shù)據(jù)和條件變量上的一組操作(1)管程管理的數(shù)據(jù)結(jié)構(gòu)只能由在管程內(nèi)部定義的函數(shù)訪問,管程外部的函數(shù)不能作用在它們上面。(3)管程猶如一堵“圍墻”,把共享變量代表的資源及對資源的操作圍圈在管程內(nèi)。進程要使用共享資源,只有通過管程提供的入口(即外部函數(shù))才能夠進入管程。另外管程一次只允許一個進程進入,以此保證對資源互斥地訪問。8.4管程機制

第4頁/共28頁

管程管理的共享資源在使用前需要初始化,管程中的初始化代碼部分完成這樣的功能。由于前面兩個部分給出的都是相關的定義,因此初始化代碼是管程的管程體。管程數(shù)據(jù)結(jié)構(gòu)的初始化代碼8.4管程機制

第5頁/共28頁右側(cè)是組成管程的三個部分,入口處的外面有請求進入管程的進程隊列。左側(cè)的管程等待區(qū)是各種等待隊列。管程內(nèi)部針對不同的條件變量,設置各種等待隊列,以區(qū)分不同的等待原因。這些等待隊列都在該管程的等待區(qū)里。條件c1隊列cwait(c1)條件cn隊列cwait(cn)緊急隊列csignal局部數(shù)據(jù)(共享資源或數(shù)據(jù)結(jié)構(gòu))條件變量操作1:操作k:初始化代碼請求進入管程隊列入口退出管程等待區(qū):管程:管程的結(jié)構(gòu)8.4管程機制

第6頁/共28頁在執(zhí)行管程中定義的操作時,會因執(zhí)行signal(ci)而將某個進程從條件變量ci的等待隊列里喚醒。由于這些被喚醒的進程已經(jīng)在管程中執(zhí)行了部分任務,它們理應有比那些還沒有進入管程的進程(即管程入口處請求進入的進程)優(yōu)先得到執(zhí)行的權利。因此,常把這些進程排成“緊急隊列”。條件c1隊列cwait(c1)條件cn隊列cwait(cn)緊急隊列csignal局部數(shù)據(jù)(共享資源或數(shù)據(jù)結(jié)構(gòu))條件變量操作1:操作k:初始化代碼請求進入管程隊列入口退出管程等待區(qū):管程:8.4管程機制

第7頁/共28頁例8-7:利用例8-6管理緩沖區(qū)的管程,解決“生產(chǎn)者-消費者”問題。

在生產(chǎn)者進程里,由函數(shù)produce(x)生產(chǎn)一個產(chǎn)品,暫時放在變量x中。然后調(diào)用管程提供的入口函數(shù)append(x),試圖把x里的產(chǎn)品存放到緩沖區(qū)去,控制進入到管程buffer。8.4管程機制

第8頁/共28頁

append(x)檢查緩沖區(qū)計數(shù)器,在in的指示下,把產(chǎn)品放到緩沖區(qū)指定位置。執(zhí)行signal(empty)時,由于沒有等待的消費者,故什么也不做就結(jié)束生產(chǎn)者進程的執(zhí)行。若在append(x)還未執(zhí)行signal(empty)時,有生產(chǎn)者或消費者進程到來,那么這些進程只能在管程外的等待進入隊列里排隊,等到執(zhí)行signal(empty)后,才一個個地進入管程,從而保證使用管程管理資源的互斥性。利用管程,解決“生產(chǎn)者-消費者”問題。

8.4管程機制

第9頁/共28頁若用完了n個緩沖區(qū)的位置。假定生產(chǎn)了第n+1個產(chǎn)品,并通過函數(shù)append(x)進入管程。這時,由于“count==N”成立,因此做操作“wait(full)”,該生產(chǎn)者進程就在有關full的條件變量隊列里等待喚醒。利用管程,解決“生產(chǎn)者-消費者”問題。

8.4管程機制

第10頁/共28頁

進入管程的消費者進程首先調(diào)用管程的take(x)操作,以便從緩沖區(qū)里取出產(chǎn)品。8.4管程機制

第11頁/共28頁8.2.1實現(xiàn)互斥的硬件方法

1.中斷禁止

所謂“中斷禁止”,是指進程以禁止中斷的方法,構(gòu)成臨界區(qū)的進入?yún)^(qū);以開中斷的方法,構(gòu)成臨界區(qū)的退出區(qū)。8.2實現(xiàn)互斥的方法討論

由于禁止中斷后,時鐘中斷和其他中斷都遭封殺,就不會發(fā)生CPU進行進程切換的事情。所以,通過中斷禁止的辦法,完全不必擔心別的進程會進入臨界區(qū)。這時程序的結(jié)構(gòu)如圖所示。禁止中斷對于操作系統(tǒng)來說是實現(xiàn)互斥的一項很有用的技術。在系統(tǒng)內(nèi)核中,利用它來保證訪問共享資源的安全是方便的。第12頁/共28頁

由于禁止中斷后,時鐘中斷和其他中斷都遭封殺,就不會發(fā)生CPU進行進程切換的事情。所以,通過中斷禁止的辦法,完全不必擔心別的進程會進入臨界區(qū)。這時程序的結(jié)構(gòu)如圖所示。

8.2實現(xiàn)互斥的方法討論

第13頁/共28頁

一些計算機中有專門指令,功能是將內(nèi)存單元的內(nèi)容讀到寄存器中,然后往該單元里寫入一個非零值,且讀和寫操作是不可分割(即在一個指令周期內(nèi)完成)。這種指令稱為“測試并上鎖(TSL)”。格式是:

TSLR,x8.2實現(xiàn)互斥的方法討論

2.專用機器指令

第14頁/共28頁

程序中可利用TSL指令形成臨界區(qū)的進入?yún)^(qū),確保進程臨界區(qū)間的執(zhí)行是互斥的。如圖所示是匯編語言程序中指令TSL的具體安排。

圖中通過指令TSL把變量x里當前值讀入寄存器R,同時把變量x設置為1。這樣,寄存器R里保存的是變量x的原值,x的新值為1。8.2實現(xiàn)互斥的方法討論

指令: CMPR,#1 JNEenter_section用于測試到變量x的原先值為1時,表明已有進程在其臨界區(qū)里,別的進程就不能進入;只有在測試到變量x的原先值為0時,請求加入臨界區(qū)的進程才能夠進入它的臨界區(qū)。也就是說,變量x起到一把“鎖”的作用。

由指令MOVEx,#0完成退出臨界區(qū)的功能,即把變量x設置為0。只有把“鎖”x打開了,別的進程才可有機會進入自己的臨界區(qū)。

利用指令TSL確實能夠保證臨界區(qū)的互斥,其缺點是當已有進程在臨界區(qū)里時,欲進入臨界區(qū)的進程就必須不斷地去循環(huán)執(zhí)行TSL指令和測試寄存器R的值,從而形成所謂的“忙等待”。第15頁/共28頁8.2.2實現(xiàn)互斥的軟件方法

8.2實現(xiàn)互斥的方法討論

第16頁/共28頁如圖是用類C語言描述的Peterson給出①進入臨界區(qū)的方法:enter_section()

②退出臨界區(qū)的方法:

exit_section()。8.2實現(xiàn)互斥的方法討論

第17頁/共28頁在算法里,用兩個共享的量控制進程進入臨界區(qū):由變量turn的取值是0還是1,表示現(xiàn)在輪到哪個進程進入臨界區(qū);由數(shù)組元素interested[],它以進程號(0或1)為下標,表示該進程是否有興趣進入臨界區(qū)。8.2實現(xiàn)互斥的方法討論

第18頁/共28頁8.2實現(xiàn)互斥的方法討論

Peterson算法是正確的,但遺憾的是它也存在忙等待的缺點。第19頁/共28頁8.5高級進程通信

用P、V操作實現(xiàn)的通信,稱為進程間的低級通信。為使進程間能真正交換數(shù)據(jù),操作系統(tǒng)設計有高級通信命令,提供給用戶在程序一級使用。只要準備好所需的參數(shù),直接調(diào)用它們就能在進程間傳遞大量信息。8.5.1消息緩沖通信

消息緩沖通信是一種直接通信方式,基本思想是消息發(fā)送者在自己的消息發(fā)送區(qū)形成消息,向系統(tǒng)申請消息緩沖區(qū),把數(shù)據(jù)從消息發(fā)送區(qū)移到消息緩沖區(qū)中。通過發(fā)送命令,把這個消息緩沖區(qū)直接發(fā)送到消息接收者的消息隊列里。接收者從自己的消息隊列上摘下消息緩沖區(qū),把里面的數(shù)據(jù)移到自己的消息接收區(qū)里,釋放消息緩沖區(qū)。第20頁/共28頁為實現(xiàn)消息緩沖通信,要解決如下問題:

(1)開辟消息緩沖區(qū),每個消息緩沖區(qū)的構(gòu)成是:發(fā)送消息的進程名或標識name;發(fā)送消息的長度size;發(fā)送消息的正文內(nèi)容text;下一個消息緩沖區(qū)的指針nPtr。(2)系統(tǒng)要提供發(fā)送消息和接收消息的系統(tǒng)調(diào)用命令。比如發(fā)送命令為Send,接收命令為Receive。(3)進程PCB中增設管理消息隊列的內(nèi)容,它們是:消息隊列的隊首指針hPtr;mutex——在發(fā)送和接收中,Send和Receive都要操作,保證對進程消息隊列進行互斥操作的信號量mutex,初值為1。8.5高級進程通信

第21頁/共28頁系統(tǒng)中兩進程間進行直接數(shù)據(jù)傳送的通信過程

8.5高級進程通信

第22頁/共28頁8.5高級進程通信

發(fā)送消息命令Send的工作步驟(1)向系統(tǒng)申請一個消息緩沖區(qū);(2)填寫消息緩沖區(qū),并將消息發(fā)送區(qū)里的內(nèi)容送入緩沖區(qū);(3)根據(jù)接收進程名B,找到它的PCB,把消息緩沖區(qū)鏈入它的消息隊列隊尾。第23頁/共28頁8.5高級進程通信

接收消息的命令Receive的工作步驟(1)從自己的消息隊列上摘下第1個消息緩沖區(qū);(2)將消息緩沖區(qū)里的內(nèi)容送入消息接收區(qū);(3)釋放所占用的消息緩沖區(qū)。第24頁/共28頁Receive的處理流程Send的處理流程8.5高級進程通信

第25頁/共28頁8.5.2信箱通信

信箱通信也稱間接通信,指進程間通過信箱來傳遞消息?;舅枷胧且粋€進程與另一個進程進行通信時,先創(chuàng)建鏈接這兩個進程的信箱。然后,發(fā)送者把消息投入與接收者相連的信箱,接收者從信箱里接收所需要的消息。信箱由

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論