![操作系統(tǒng)課件4-3_第1頁](http://file4.renrendoc.com/view/122a7d641c2a2061520db4a8bdcc4a63/122a7d641c2a2061520db4a8bdcc4a631.gif)
![操作系統(tǒng)課件4-3_第2頁](http://file4.renrendoc.com/view/122a7d641c2a2061520db4a8bdcc4a63/122a7d641c2a2061520db4a8bdcc4a632.gif)
![操作系統(tǒng)課件4-3_第3頁](http://file4.renrendoc.com/view/122a7d641c2a2061520db4a8bdcc4a63/122a7d641c2a2061520db4a8bdcc4a633.gif)
![操作系統(tǒng)課件4-3_第4頁](http://file4.renrendoc.com/view/122a7d641c2a2061520db4a8bdcc4a63/122a7d641c2a2061520db4a8bdcc4a634.gif)
![操作系統(tǒng)課件4-3_第5頁](http://file4.renrendoc.com/view/122a7d641c2a2061520db4a8bdcc4a63/122a7d641c2a2061520db4a8bdcc4a635.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第四章互斥、同步與通訊并發(fā)進(jìn)程(concurrentprocesses)進(jìn)程互斥(mutualexclusion)進(jìn)程同步(synchronization)進(jìn)程高級(jí)通訊(communication)系統(tǒng)舉例14.3.5管程(Monitor)PV操作:分散式同步機(jī)制:共享變量操作,PV操作,分散在整個(gè)系統(tǒng)中或各個(gè)進(jìn)程中。缺點(diǎn):可讀性差;正確性不易保證;不易修改。優(yōu)點(diǎn):高效,靈活。管程:集中式同步工具:共享變量及其所有相關(guān)操作集中在一個(gè)摸塊中。優(yōu)點(diǎn):可讀性好;正確性易于保證;易于修改。缺點(diǎn):不甚靈活,效率略低。24.3.5.1管程的提出前面各種互斥手段,雖能有效地實(shí)現(xiàn)互斥,但仍存在著一些缺點(diǎn):1)進(jìn)程同時(shí)進(jìn)入臨界區(qū):將P(s)和V(s)操作顛倒:
V(S)
臨界區(qū)
P(S)可能幾個(gè)進(jìn)程同時(shí)進(jìn)入臨界區(qū),錯(cuò)誤僅在幾個(gè)進(jìn)程同時(shí)活躍在臨界區(qū)內(nèi)才可能發(fā)現(xiàn),且這種情況并非總是可再現(xiàn)的。34.3.5.1管程的提出2)產(chǎn)生死鎖:將V(s)誤寫為P(s)
P(S)
臨界區(qū)
P(S)
S被出錯(cuò)的進(jìn)程連續(xù)兩次執(zhí)行P變成-1。使任何其它進(jìn)程不能進(jìn)入臨界區(qū)不會(huì)有其它進(jìn)程執(zhí)行V操作,從而發(fā)生死鎖3)同時(shí)進(jìn)入臨界區(qū),永遠(yuǎn)不會(huì)喚醒:如遺漏P操作,使得多個(gè)進(jìn)程同時(shí)進(jìn)入臨界區(qū)遺漏V操作,使其它進(jìn)程無法進(jìn)入臨界區(qū),永遠(yuǎn)不會(huì)喚醒。44.3.5.1管程的提出基于上述問題1971年由E.W.Dijkstra提出把所有進(jìn)程對(duì)某一臨界資源的同步操作集中,構(gòu)成一個(gè)“秘書”進(jìn)程凡要訪問臨界資源的都需先報(bào)告“秘書”,由秘書來實(shí)現(xiàn)諸進(jìn)程的同步1973年P(guān).B.Hansan和C.A.R.Hoare將“秘書”發(fā)展為管程概念,將同步操作分別集中于相應(yīng)的管程中54.3.5.1管程的提出背景:Structuredprogramming基于管程的語言ConcurrentPascal(Hansen)Modula(With)MesaMod*ConcurrentEuclidXCY64.3.5.2管程形式把一組相關(guān)的數(shù)據(jù)結(jié)構(gòu)和過程一并稱為管程。Hansan定義:一個(gè)管程定義了一個(gè)數(shù)據(jù)結(jié)構(gòu)和能為并發(fā)進(jìn)程所執(zhí)行(在該數(shù)據(jù)結(jié)構(gòu)上)的一組操作,這組操作能同步進(jìn)程并改變管程中的數(shù)據(jù)。管程由三部分組成:1)局部于管程的共享變量的說明2)對(duì)該數(shù)據(jù)結(jié)構(gòu)進(jìn)行的一組操作3)對(duì)局部于管程的數(shù)據(jù)設(shè)置初始值的語句74.3.5.2管程形式管程是管理進(jìn)程間同步的機(jī)制,保證進(jìn)程互斥地訪問共享變量管程每次僅允許一個(gè)進(jìn)程進(jìn)入,提供方便的阻塞和喚醒進(jìn)程的機(jī)構(gòu)。管程提出時(shí),C語言尚未流行,管程大多采用擴(kuò)展的pascal語言描述84.3.5.2管程形式Typemonitor_name=MONITOR
共享變量說明
define
本管程內(nèi)定義,本管程外使用的子程序名表;
use
本管程外定義,本管程內(nèi)使用的子程序名表;Procedure過程名(形參表);
局部變量說明
Begin
語句序列
End;…94.3.5.2管程形式(Cont.)Function
函數(shù)名(形參表):返回值類型;局部變量說明
Begin
語句序列
End;...Begin
共享變量初始化語句序列End;104.3.5.2管程形式(Cont.)管程三個(gè)主要的特性:模塊化:一個(gè)管程是一個(gè)模塊抽象數(shù)據(jù)類型:管程是一種特殊的數(shù)據(jù)類型,不僅有數(shù)據(jù),還有對(duì)數(shù)據(jù)進(jìn)行操作的代碼信息掩蔽:管程是半透明的,管程的內(nèi)部過程(函數(shù))實(shí)現(xiàn)了某些功能,這些功能是怎樣實(shí)現(xiàn)的在外部是不可見的114.3.5.3管程語義管程的共享變量在管程外部不可見,外部只能通過調(diào)用管程中的外部子程序訪問共享變量為保證對(duì)共享變量操作的數(shù)據(jù)完整性,規(guī)定管程互斥進(jìn)入124.3.5.3管程語義管程用來管理資源,在管程中設(shè)有進(jìn)程等待隊(duì)列和相應(yīng)的等待及喚醒操作當(dāng)一個(gè)進(jìn)入管程的進(jìn)程執(zhí)行等待操作時(shí),它應(yīng)當(dāng)釋放管程的互斥權(quán)當(dāng)一個(gè)進(jìn)入管程的進(jìn)程執(zhí)行喚醒操作時(shí)(如P喚醒Q),管程中同時(shí)有兩個(gè)處于活動(dòng)狀態(tài)的進(jìn)程,有三種處理方法:P等待,Q繼續(xù),直到Q退出或等待(Hoare)Q等待,P繼續(xù),直到P退出或等待(Java)喚醒是管程中可執(zhí)行的最后一個(gè)操作(Hansen)134.3.5.3管程語義管程互斥進(jìn)入,當(dāng)進(jìn)程試圖進(jìn)入已被占用的管程時(shí)應(yīng)在管程入口處等待在管程的入口處有一個(gè)進(jìn)程等待隊(duì)列,稱作入口等待隊(duì)列。14Hoare管程設(shè)施Hoare管程設(shè)施:入口等待隊(duì)列:每個(gè)管程變量一個(gè),用于排隊(duì)進(jìn)入;緊急等待隊(duì)列:每個(gè)管程變量一個(gè),用于喚醒等待;內(nèi)部等待隊(duì)列:varc:condition;條件變量可根據(jù)需要定義多個(gè),用于設(shè)置等待條件。15條件變量操作利用管程實(shí)現(xiàn)進(jìn)程同步,必須設(shè)置PV操作等待的原因有多個(gè),為了區(qū)別,引入條件變量condition管程中對(duì)每個(gè)條件變量給出說明:
Varc:condition;
16內(nèi)部等待隊(duì)列wait(c)如緊急隊(duì)列非空,喚醒第一個(gè)等待者,否則釋放管程互斥權(quán);執(zhí)行此操作進(jìn)程的PCB(線程)進(jìn)入c鏈尾。相當(dāng)于P操作。
signal(c)c鏈空,相當(dāng)空操作。否則喚醒第一個(gè)執(zhí)行此操作進(jìn)程的PCB(線程)進(jìn)入緊急隊(duì)列。相當(dāng)于V操作。1718進(jìn)入與離開進(jìn)入管程:申請(qǐng)管程互斥權(quán)。離開管程:如緊急等待隊(duì)列非空,喚醒第一個(gè)等待者;否則開放管程。194.3.5.4管程的使用讀者/寫者問題(寫優(yōu)先)生產(chǎn)者和消費(fèi)者問題哲學(xué)家就餐問題(anotherapproach)DiskheadschedulerSingleresourcemanagementSleepybarber’sproblem20例1.讀者/寫者問題(寫者優(yōu)先)rq:讀隊(duì)列,wq:寫隊(duì)列reading_count,write_count:讀寫進(jìn)程個(gè)數(shù)Typereaers_writers=Monitor;Varrq,wq:condition;reading_count,write_count:integer;Definestart_read,finish_read,start_write,finish_write;21例1.讀者/寫者問題Procedurestart_read;BeginIfwrite_count>0Thenwait(rq);reading_count++;signal(rq);End;Procedurefinish_read;Beginreading_count--;Ifreading_count=0Thensignal(wq)End;22例1.讀者/寫者問題Procedurestart_writeBeginwrite_count++;If(write_count>1)or(reading_count>0)Thenwait(wq)End;Procedurefinish_write;Beginwrite_count--;Ifwrite_count>0Thensignal(wq)Elsesignal(rq)End;23例1.讀者/寫者問題Beginreading_count:=0;write_count:=0;End;Varrw:readers_writers;讀者:寫者:rw.start_read;rw.start_write;{reading}{writing}rw.finish_read;rw.finish_write;24例2.生產(chǎn)者和消費(fèi)者問題notFull:表示是否允許將產(chǎn)品放入緩沖區(qū)中notEmpty:表示是否允許消費(fèi)產(chǎn)品25例2.生產(chǎn)者和消費(fèi)者問題26例2.生產(chǎn)者和消費(fèi)者問題27例3.磁頭引臂調(diào)度問題某單磁頭磁盤系統(tǒng)共有200個(gè)磁道(柱面),由外向內(nèi)依次編號(hào)為0,…,199,如圖4-10所示.當(dāng)有多個(gè)磁盤塊的I/O請(qǐng)求時(shí),采用電梯算法調(diào)度,試用管程給出解法28例3.磁頭引臂調(diào)度問題01……199updown磁頭引臂扇區(qū)29調(diào)度算法FCFS(firstcomefirstserve)公平效率低SSTF(shortestseektimefirst)效率高磁道歧視SCAN(elevatoralgorithm)效率較高,較公平30Hansen管程實(shí)現(xiàn)SCAN算法外部過程:申請(qǐng):require(dest:0..199)
釋放:release()使用方式:
require(dest);{IO操作}--(管程外操作)release31Hansen管程實(shí)現(xiàn)SCAN算法資源狀態(tài)用busy描述磁頭引臂當(dāng)前位置和移動(dòng)方向分別用headpos和direction描述算法的關(guān)鍵是為每個(gè)磁道(柱面)設(shè)置一個(gè)等待隊(duì)列cylinder,同時(shí)記錄等待在每個(gè)隊(duì)列上進(jìn)程的個(gè)數(shù)32管程實(shí)現(xiàn)SCAN算法Typediskhead=MONITORVarbusy:boolean;headpos:0..199;direction:(up,down);cylinder:Array[0..199]Ofcondition;count:Array[0..199]Ofinteger;
Definerequire,release;33管程實(shí)現(xiàn)SCAN算法Procedurerequire(dest:0..199);BeginIfbusyThenBegincount[dest]:=count[dest]+1;wait(cylinder[dest])Endbusy:=true;Ifdest<headposThendirection:=downElseIfdest>headposThendirection:=up;headpos:=destEnd;34管程實(shí)現(xiàn)SCAN算法Procedureupscan;VarI:0..200;BeginI:=headpos;While(I<=199)and(count[I]=0)DoI:=I+1;IfI<=199ThenBegincount[I]:=count[I]-1;signal(cylinder[I])EndEnd;35管程實(shí)現(xiàn)SCAN算法Proceduredownscan;VarI:-1..199;BeginI:=headpos;While(I>=0)and(count[I]=0)DoI:=I-1;IfI>=0ThenBegincount[I]:=count[I]-1;signal(cylinder[I])EndEnd;36管程實(shí)現(xiàn)SCAN算法Procedurerelease;Beginbusy:=false;Ifdirection=upThenBeginupscan;downscanEndElseBegindownscan;upscanEndEnd;37管程實(shí)現(xiàn)SCAN算法Procedureinitialize;VarI:0..199;Beginbusy:=false;headpos:=0;direction:=up;ForI:=0To199Docount[I]:=0EndBegininitializeEnd;38例4.單一資源管理Typesingle_resource=MONITOR;Varbusy:boolean;q:condition;Definerequire,release;Procedurerequire;BeginIfbusyThenwait(q);busy:=trueEnd;39例4.單一資源管理Procedurerelease;Beginbusy:=false;signal(q);End;Beginbusy:=falseEnd;Varlp,tape:single_resource;Busyqlp:BusyqTape:申請(qǐng)lp:lp.require釋放lp:lp.release申請(qǐng)tape:tape.require;釋放tape:tape.release40例5.嗜眠理發(fā)師問題理發(fā)店如圖4-11所示店中有一位理發(fā)師和一把理發(fā)椅,理發(fā)時(shí)顧客坐在此椅子上,不理發(fā)時(shí)理發(fā)師在此椅子上睡覺.室內(nèi)有N個(gè)凳子,供顧客們等待理發(fā)時(shí)用.如果一位顧客進(jìn)入理發(fā)店后發(fā)現(xiàn)所有凳子均已被占用,則他退出理發(fā)店理發(fā)店只有一扇門,一次只能進(jìn)出一位顧客41例5.嗜眠理發(fā)師問題42例5.嗜眠理發(fā)師問題chair:理發(fā)師是否可以理發(fā)stool:是否有人等待理發(fā)
4344例5.嗜眠理發(fā)師問題454.3.5.5管程與PV操作的等價(jià)性用PV操作可以構(gòu)造管程用管程可以構(gòu)造PV操作46用管程構(gòu)造PV操作TYPEsemaphore=MONITOR(init_value)VARc:condition;count:integer;DEFINEP,V;PROCEDUREP;BEGINcount:=count-1;IFcount<0THENwait(c);END;PROCEDUREV;BEGINcount:=count+1;IFcount<=0THENsignal(c);END;BEGINcount:=init_value;END;47用管程構(gòu)造PV操作(Cont.)信號(hào)燈與PV操作管程VARs:semaphore;VARs:semaphore;s.value:=init_value;Inits(init_value);P(s);s.P;V(s);s.V;48用PV操作構(gòu)造管程管程信號(hào)燈與PV操作一個(gè)管程實(shí)例一個(gè)入口等待隊(duì)列mutex:semaphore(1)一個(gè)緊急等待隊(duì)列urgent:semaphore(0)一個(gè)緊急等待計(jì)數(shù)urgent_count:integer(0)一個(gè)條件變量c:condition;一個(gè)信號(hào)燈變量s:semaphore(0)一個(gè)計(jì)數(shù)變量count:integer(0)等待操作wait(c)count:=count+1;IFurgent_count>0THENBEGINurgent_count:=urgent_count-1;V(urgent)ELSEV(mutex);P(s);49用PV操作構(gòu)造管程管程信號(hào)燈與PV操作喚醒操作Signal(c)IFcount>0THENBEGINcount:=count-1;urgent_count:=urgent_count+1;V(s);P(urgent)END進(jìn)入管程P(mutex);離開管程IFurgent_count>0THENBEGINurgent_count:=urgent_count-1;V(urgent)ENDELSEV(mutex);504.3.5.6管程的嵌套調(diào)用問題Wait(c)P:M1M2MnMn-1...問題:1.是否允許嵌套;
2.若允許,如何處理互斥權(quán)。方法:1.禁止嵌套(Modula)2.允許嵌套,等待時(shí)釋放當(dāng)前管程互斥權(quán);
3.允許嵌套,等待時(shí)釋放所有管程互斥權(quán);
4.允許嵌套,調(diào)用時(shí)釋放路經(jīng)管程互斥權(quán)51Java語言中的“管程”類似管程的對(duì)象object每個(gè)object有一個(gè)互斥鎖lock,一般未用;說明為synchronized的method啟用互斥鎖;每個(gè)object內(nèi)部有一個(gè)等待隊(duì)列;wait()method:釋放lock,狀態(tài)改為blocked,進(jìn)入waitset.notify()method:在waitset中取任意線程,移到entryset,狀態(tài)改為runnable.(Signalandcontinue)notifyAll()method:Waitset所有線程移到entryset,狀態(tài)改為runnable.52EntrysetandwaitsetObjectLockownerEntrysetwaitsetwaitAcquirelocknotify,notifyAll53Entrysetandwaitset鎖的持有者執(zhí)行wait操作,狀態(tài)改為blocked,釋放所持有的鎖,進(jìn)入waitset;若entryset非空,選擇其一進(jìn)入同步方法.鎖的持有者執(zhí)行notify操作,任選waitset上的一個(gè)線程,入entryset,狀態(tài)改為runnable.鎖的持有者執(zhí)行notifyAll操作,waitset上的所有線程出waitset,入entryset,狀態(tài)改為runnable.54例子:生產(chǎn)/消費(fèi)問題--Javapublicsynchronizedvoidenter(Objectitem){while(count==BUFFER_SIZE){try{wait();//被喚醒后重新檢測等待條件
}catch(InterruptedExceptione){}}++count;buffer[in]=item;in=(in+1)%BUFFER_SIZE;notify();}55例子:生產(chǎn)/消費(fèi)問題--java
publicsynchronizedObjectremove(){while(count==0){try{wait();}catch(InterruptedExceptione){}}--count;item=buffer[out];out=(out+1)%BUFFER_SIZE;notify();return(item);}56例子:生產(chǎn)/消費(fèi)問題--java
privatestaticfinalintNAP_TIME=5;privatestaticfinalintBUFFER_SIZE=5;privateintcountin,out;privateObject[]buffer;}57讀者/寫者問題-JavasolutionMultiplenotificationnotifyAll()--喚醒waitset集合中所有線程,進(jìn)入entryset。publicclassDatabase{publicDatabase(){Readcount=0;dbReading=false;dbWriting=false;}publicsynchronizedintstartRead(){//}58讀者/寫者問題-Javasolution
publicsynchronizedintendRead(){//}publicsynchronizedstartWrite(){//}publicsynchronizedendWrite(){//}privateintreaderCount;privatebooleandbReading;privatebooleandbWriting;}59讀者/寫者問題-JavasolutionpublicsynchronizedvoidstartRead(){while(dbWriting==true){try{wait();}catch(InterruptedExceptione){}++readCount;if(readCount==1)dbReading=true;}60讀者/寫者問題-Javasolution
publicsynchronizedvoidendRead(){--readCount;if(readCount==0)dbReading=false;notifyAll();}61讀者/寫者問題-Javasolution
publicsynchronizedvoidstartWrite(){while(dbReading==true||dbWriting==true){try{wait();}catch(InterruptedExceptione){}}
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 入團(tuán)申請(qǐng)書二千字
- 推進(jìn)科技創(chuàng)新與產(chǎn)業(yè)均衡發(fā)展
- 評(píng)優(yōu)申請(qǐng)書模板
- DB2201-T 49-2023 站用儲(chǔ)氣瓶組定期檢驗(yàn)規(guī)范
- 裝電表申請(qǐng)書
- 新版北師版一年級(jí)下冊(cè)數(shù)學(xué)課件三 20以內(nèi)數(shù)與減法復(fù)習(xí)
- 人教版數(shù)學(xué)四年級(jí)上冊(cè)第五單元平行四邊形和梯形培優(yōu)測試卷(含答案)
- 維修保養(yǎng)服務(wù)合同(2篇)
- 給下屬寫續(xù)簽合同范本
- 異地安置申請(qǐng)書
- 教育部《中小學(xué)校園食品安全和膳食經(jīng)費(fèi)管理工作指引》知識(shí)培訓(xùn)
- 部編人教版語文小學(xué)六年級(jí)下冊(cè)第四單元主講教材解讀(集體備課)
- 數(shù)據(jù)結(jié)構(gòu)英文教學(xué)課件:chapter2 Array
- 20以內(nèi)分成表算式x
- 井下探放水設(shè)計(jì)編制培訓(xùn)PPT課件
- 數(shù)據(jù)結(jié)構(gòu)英文教學(xué)課件:chapter9 Sorting
- 營養(yǎng)學(xué)緒論(精)
- 最新ICD-9手術(shù)編碼
- 軟件項(xiàng)目報(bào)價(jià)方法參考模板
- 國際形式發(fā)票模板
- 陜西延長石油(集團(tuán))有限責(zé)任公司企業(yè)年金方案
評(píng)論
0/150
提交評(píng)論