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

下載本文檔

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

文檔簡介

2.管程的定義

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

第1頁/共28頁2.管程的定義Hansen為管程下的定義1用管程管理循環(huán)緩沖區(qū)時(shí)管程的定義。8.4管程機(jī)制

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

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

第4頁/共28頁(2)管程中定義的函數(shù)分兩類:外部函數(shù)是那些進(jìn)程可從外部調(diào)4

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

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

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

第7頁/共28頁在執(zhí)行管程中定義的操作時(shí),會因執(zhí)行signal7例8-7:利用例8-6管理緩沖區(qū)的管程,解決“生產(chǎn)者-消費(fèi)者”問題。

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

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

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

8.4管程機(jī)制

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

8.4管程機(jī)制

第10頁/共28頁若用完了n個(gè)緩沖區(qū)的位置。假定生產(chǎn)了第n+10

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

第11頁/共28頁進(jìn)入管程的消費(fèi)者進(jìn)程首先調(diào)用管程的tak118.2.1實(shí)現(xiàn)互斥的硬件方法

1.中斷禁止

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

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

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

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

第13頁/共28頁由于禁止中斷后,時(shí)鐘中斷和其他中斷都遭封殺,13

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

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

2.專用機(jī)器指令

第14頁/共28頁一些計(jì)算機(jī)中有專門指令,功能是將內(nèi)存單元的14

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

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

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

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

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

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

第16頁/共28頁8.2.2實(shí)現(xiàn)互斥的軟件方法8.2實(shí)現(xiàn)互斥的方法討論16如圖是用類C語言描述的Peterson給出①進(jìn)入臨界區(qū)的方法:enter_section()

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

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

第17頁/共28頁如圖是用類C語言描述的Peterson給出①進(jìn)入臨界區(qū)的方法17在算法里,用兩個(gè)共享的量控制進(jìn)程進(jìn)入臨界區(qū):由變量turn的取值是0還是1,表示現(xiàn)在輪到哪個(gè)進(jìn)程進(jìn)入臨界區(qū);由數(shù)組元素interested[],它以進(jìn)程號(0或1)為下標(biāo),表示該進(jìn)程是否有興趣進(jìn)入臨界區(qū)。8.2實(shí)現(xiàn)互斥的方法討論

第18頁/共28頁在算法里,用兩個(gè)共享的量控制進(jìn)程進(jìn)入臨界區(qū):由變量turn的188.2實(shí)現(xiàn)互斥的方法討論

Peterson算法是正確的,但遺憾的是它也存在忙等待的缺點(diǎn)。第19頁/共28頁8.2實(shí)現(xiàn)互斥的方法討論P(yáng)eterson算法是正確的,但198.5高級進(jìn)程通信

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

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

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

第21頁/共28頁為實(shí)現(xiàn)消息緩沖通信,要解決如下問題:(1)開辟消息緩沖區(qū)21系統(tǒng)中兩進(jìn)程間進(jìn)行直接數(shù)據(jù)傳送的通信過程

8.5高級進(jìn)程通信

第22頁/共28頁系統(tǒng)中兩進(jìn)程間進(jìn)行直接數(shù)據(jù)傳送的通信過程8.5高級進(jìn)程通228.5高級進(jìn)程通信

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

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

第25頁/共28頁Receive的處理Send的處理8.5高級進(jìn)程通信258.5.2信箱通信

信箱通信也稱間接通信,指進(jìn)程間通過信箱來傳遞消息?;舅枷胧且粋€(gè)進(jìn)程與另一個(gè)進(jìn)程進(jìn)行通信時(shí),先創(chuàng)建鏈接這兩個(gè)進(jìn)程的信箱。然后,發(fā)送者把消息投入與接收者相連的信箱,接收者從信箱里接收所需要的消息。信箱由“信箱頭(或信箱說明)”和“信箱體”兩部分組成,如圖所示。8.5高級進(jìn)程通信

第26頁/共28頁8.5.2信箱通信信箱通信也稱間接通信26信箱由“信箱頭(或信箱說明)”和“信箱體”兩部分組成。

信箱頭給出信箱大小(size)、存信件指針(inPtr)、取信件指針(outPtr)、空閑格子信號量(si)以及信件格子信號量(so)等管理信息。信箱體用來存放消息,每個(gè)消息放在一個(gè)格子里。8.5高級進(jìn)程通信

第27頁/共28頁信箱由“信箱頭(或信箱說明)”和“信箱體”兩部分組成。27感謝您的觀看!第28頁/共28頁感謝您的觀看!第28頁/共28頁282.管程的定義

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

第1頁/共28頁2.管程的定義Hansen為管程下的定義29用管程管理循環(huán)緩沖區(qū)時(shí)管程的定義。8.4管程機(jī)制

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

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

第4頁/共28頁(2)管程中定義的函數(shù)分兩類:外部函數(shù)是那些進(jìn)程可從外部調(diào)32

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

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

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

第7頁/共28頁在執(zhí)行管程中定義的操作時(shí),會因執(zhí)行signal35例8-7:利用例8-6管理緩沖區(qū)的管程,解決“生產(chǎn)者-消費(fèi)者”問題。

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

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

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

8.4管程機(jī)制

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

8.4管程機(jī)制

第10頁/共28頁若用完了n個(gè)緩沖區(qū)的位置。假定生產(chǎn)了第n+38

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

第11頁/共28頁進(jìn)入管程的消費(fèi)者進(jìn)程首先調(diào)用管程的tak398.2.1實(shí)現(xiàn)互斥的硬件方法

1.中斷禁止

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

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

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

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

第13頁/共28頁由于禁止中斷后,時(shí)鐘中斷和其他中斷都遭封殺,41

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

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

2.專用機(jī)器指令

第14頁/共28頁一些計(jì)算機(jī)中有專門指令,功能是將內(nèi)存單元的42

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

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

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

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

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

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

第16頁/共28頁8.2.2實(shí)現(xiàn)互斥的軟件方法8.2實(shí)現(xiàn)互斥的方法討論44如圖是用類C語言描述的Peterson給出①進(jìn)入臨界區(qū)的方法:enter_section()

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

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

第17頁/共28頁如圖是用類C語言描述的Peterson給出①進(jìn)入臨界區(qū)的方法45在算法里,用兩個(gè)共享的量控制進(jìn)程進(jìn)入臨界區(qū):由變量turn的取值是0還是1,表示現(xiàn)在輪到哪個(gè)進(jìn)程進(jìn)入臨界區(qū);由數(shù)組元素interested[],它以進(jìn)程號(0或1)為下標(biāo),表示該進(jìn)程是否有興趣進(jìn)入臨界區(qū)。8.2實(shí)現(xiàn)互斥的方法討論

第18頁/共28頁在算法里,用兩個(gè)共享的量控制進(jìn)程進(jìn)入臨界區(qū):由變量turn的468.2實(shí)現(xiàn)互斥的方法討論

Peterson算法是正確的,但遺憾的是它也存在忙等待的缺點(diǎn)。第19頁/共28頁8.2實(shí)現(xiàn)互斥的方法討論P(yáng)eterson算法是正確的,但478.5高級進(jìn)程通信

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

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

(1)開辟消息緩沖區(qū),每個(gè)消息緩沖區(qū)的構(gòu)成是:發(fā)送消息的進(jìn)程名或標(biāo)識name;發(fā)送消息的長度size;發(fā)送消息的正文內(nèi)容text;下一個(gè)消息緩沖區(qū)的指針nPtr。(2)系統(tǒng)要提供發(fā)送

溫馨提示

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

評論

0/150

提交評論