




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第三章 并發(fā)進(jìn)程,3.1 并發(fā)進(jìn)程 3.2 臨界區(qū)管理 3.3 信號(hào)量與PV操作 3.4 管程 3.5 進(jìn)程通信 3.6 死鎖,學(xué)習(xí)目標(biāo),并發(fā)的進(jìn)程間為何要對(duì)話?(協(xié)作或競(jìng)爭(zhēng)) 并發(fā)的進(jìn)程間的對(duì)話方式(通信方式)有哪些? 信號(hào)量(重點(diǎn)掌握) 共享文件 共享存儲(chǔ)區(qū) 消息傳遞 并發(fā)的進(jìn)程間如果溝通的不好的話會(huì)咋樣? 答:會(huì)死鎖! 掌握如何解決死鎖問(wèn)題,3.1 并發(fā)進(jìn)程,順序程序設(shè)計(jì) 并發(fā)進(jìn)程 與時(shí)間有關(guān)的錯(cuò)誤 進(jìn)程間的交互,并發(fā)的進(jìn)程(洗衣房的故事),A, B, C, D的任務(wù)是收衣服、洗衣服、干衣服和折衣服 洗衣服要用 30 分鐘 干衣服要用 40 分鐘 折衣服要用 20 分鐘,順序作業(yè),30,
2、40,20,30,40,20,30,40,20,30,40,20,6,7,8,9,10,11,12,Time,流水線作業(yè),? D如何得知C使用完了洗衣機(jī)? ! C使用完畢應(yīng)該通知D!,6,7,8,9,10,11,12,Time,?,并發(fā)進(jìn)程間的關(guān)系,并發(fā)進(jìn)程執(zhí)行時(shí)分別在各自的變量集合上操作,則稱他們是獨(dú)立或無(wú)關(guān)的。 進(jìn)程 A進(jìn)程 B x = 1;y = 2; x = x + 1;y = y 2; 并發(fā)進(jìn)程執(zhí)行時(shí)共享某些變量,一個(gè)進(jìn)程的執(zhí)行結(jié)果可能會(huì)影響其它進(jìn)程的執(zhí)行結(jié)果,則稱他們是交互或相關(guān)的。 進(jìn)程 A進(jìn)程 B x = 1;y = 2; x = y + 1;y = y * 2;,兩個(gè)交互進(jìn)程
3、可能會(huì)產(chǎn)生的問(wèn)題1,Ti是訂票終端,x=2代表剩余票數(shù),為所有終端共享 T1 : T2: T=x; T=x; if T=1 then if T=1 then x =T-1; x =T-1; 剩余票數(shù)最終結(jié)果不確定!可能是1,也可能是0.,兩個(gè)交互進(jìn)程可能會(huì)產(chǎn)生的問(wèn)題2,/B表示申請(qǐng)和歸還主存的容量,x表示空閑主存容量 procedure borrow (int B) if B x then 申請(qǐng)進(jìn)程進(jìn)入等待隊(duì)列等主存資源 x = x - B; 修改主存分配表,申請(qǐng)進(jìn)程獲得主存資源 procedure return (int B) x = x + B; 修改主存分配表 釋放等主存資源的進(jìn)程 可能
4、會(huì)導(dǎo)致申請(qǐng)進(jìn)程永遠(yuǎn)等待!,交互的并發(fā)進(jìn)程與時(shí)間有關(guān)的錯(cuò)誤,錯(cuò)誤的兩種表現(xiàn)形式: 結(jié)果不惟一(飛機(jī)訂票) 永遠(yuǎn)等待(內(nèi)存管理) 無(wú)關(guān)的并發(fā)進(jìn)程不會(huì)產(chǎn)生此類錯(cuò)誤,如何判斷并發(fā)的進(jìn)程是無(wú)關(guān)的?Bernstein條件: R(pi)=a1,a2,an,程序pi在執(zhí)行期間引用的變量集 W(pi)=b1,b2,bm,程序pi在執(zhí)行期間改變的變量集 若兩個(gè)程序的變量集交集之和為空集: R(p1)W(p2)R(p2)W(p1)W(p1)W(p2)= 則并發(fā)進(jìn)程的執(zhí)行與時(shí)間無(wú)關(guān)。,例題 (p211),有如下四條語(yǔ)句: S1: a := x + y S2: b := z + 1 S3: c := a b S4: w
5、 := c + 1 于是有: S1和S2可并發(fā)執(zhí)行,滿足Bernstein條件。其他語(yǔ)句并發(fā)執(zhí)行可能會(huì)產(chǎn)生與時(shí)間有關(guān)的錯(cuò)誤。,進(jìn)程間的交互,競(jìng)爭(zhēng) 多個(gè)進(jìn)程訪問(wèn)同一共享資源時(shí)發(fā)生 可能出現(xiàn)兩個(gè)問(wèn)題:死鎖和饑餓 解決競(jìng)爭(zhēng)關(guān)系的手段 : 進(jìn)程的互斥 協(xié)作 多個(gè)進(jìn)程為完成同一任務(wù)需要分工協(xié)作 處理協(xié)作關(guān)系的手段 : 進(jìn)程的同步 互斥是一特殊的同步,即逐次使用互斥資源,3.2 臨界區(qū)管理,臨界區(qū)(互斥區(qū)) 臨界區(qū)管理的嘗試 實(shí)現(xiàn)臨界區(qū)管理的軟件方法 實(shí)現(xiàn)臨界區(qū)管理的硬件方法,臨界區(qū)(互斥區(qū)),由于相關(guān)的并發(fā)進(jìn)程共享變量會(huì)引起與時(shí)間相關(guān)的錯(cuò)誤,故引入一種機(jī)制來(lái)解決這種錯(cuò)誤。 互斥:確保一個(gè)時(shí)刻僅有一個(gè)進(jìn)程
6、在訪問(wèn)共享資源。 共享變量代表的資源叫“臨界資源”。 在并發(fā)進(jìn)程中涉及到臨界資源的程序段叫“臨界區(qū)”。 一個(gè)時(shí)刻僅能讓一個(gè)進(jìn)程進(jìn)入臨界區(qū) 臨界區(qū)(critical section)與互斥(mutual exclusion)是同一事物的兩種描述方式,使用臨界區(qū)的原則,有空讓進(jìn),臨界區(qū)是否空?,無(wú)空等待,臨界區(qū),擇一而入(互斥),讓權(quán)等待,有限等待,實(shí)現(xiàn)互斥機(jī)制的基本手段,鎖(lock):阻止某進(jìn)程做某事 在進(jìn)入臨界區(qū)前應(yīng)該上鎖 在離開(kāi)臨界區(qū)時(shí)要開(kāi)鎖 進(jìn)程見(jiàn)到鎖必須等待直到鎖被打開(kāi) 所有的同步互斥都引入了進(jìn)程的等待! 使用鎖是為了實(shí)現(xiàn)互斥,必須滿足臨界區(qū)的使用原則,因此對(duì)鎖的使用必須謹(jǐn)慎。,臨界區(qū)
7、管理的嘗試 ,int turn = 1 or 2; /*表示誰(shuí)可以進(jìn)入臨界區(qū)*/,process P1 while (turn != 1); turn = 2; ,臨界區(qū);,process P2 while (turn != 2); turn = 1; ,臨界區(qū);,P1和P2必須交替執(zhí)行,若時(shí)刻無(wú)P1在執(zhí)行,但turn=1,則P2想進(jìn)空的臨界區(qū)也沒(méi)有辦法。此法不滿足有空讓進(jìn)。,臨界區(qū)管理的嘗試 1,process P1 while (inside2); inside1 = true; inside1 = false; ,process P2 while (inside1); inside2 =
8、 true; inside2 = false; ,BOOL inside1,inside2; inside1 = false; /* P1不在其臨界區(qū)內(nèi) */ inside2 = false; /* P2不在其臨界區(qū)內(nèi) */,臨界區(qū);,臨界區(qū);,臨界區(qū)管理的嘗試 2,process P1 inside1 = true; while (inside2); inside1 = false; ,process P2 inside2 = true; while (inside1); inside2 = false; ,BOOL inside1,inside2; inside1 = false; /*
9、P1不想進(jìn)其臨界區(qū) */ inside2 = false; /* P2不想進(jìn)其臨界區(qū) */,臨界區(qū);,臨界區(qū);,兩次嘗試失敗的原因,兩進(jìn)程總是想爭(zhēng)先進(jìn)入臨界區(qū),導(dǎo)致: 嘗試1:先測(cè)試再上鎖,兩個(gè)都進(jìn)去了 (不滿足擇一而入) 嘗試2:先上鎖再測(cè)試,兩個(gè)都進(jìn)不去 (不滿足有空讓進(jìn),有限等待) 進(jìn)入臨界區(qū)的兩個(gè)必要步驟: 測(cè)試/等待:while(insidei) 上鎖:insidei = true 如何改進(jìn)? 讓雙方變得更禮貌點(diǎn),總是讓對(duì)方先進(jìn)!,臨界區(qū)管理的嘗試 3,insidei表示i進(jìn)程想進(jìn)入臨界區(qū),而不表示它已經(jīng)在臨界區(qū); 加入一個(gè)令牌turn,表示該由誰(shuí)進(jìn)入; i若想進(jìn)入臨界區(qū)先提交申請(qǐng),
10、并將令牌丟給對(duì)方,讓對(duì)方優(yōu)先進(jìn)入: insidei = true ; turn = j ; 然后測(cè)試對(duì)方j(luò)是否能進(jìn)入: if (turn = j) and (insidej = true),改進(jìn)后的算法描述(Peterson算法),Process P1 inside1 = true; turn = 2; while (inside2 ,Process P2 inside2 = true; turn = 1; while (inside1 ,臨界區(qū);,臨界區(qū);,int turn = 1 or 2; /* 令牌歸誰(shuí)所有 */ BOOL inside1 = false; /* P1不想進(jìn)其臨界區(qū) *
11、/ BOOL inside2 = false; /* P2不想進(jìn)其臨界區(qū) */,實(shí)現(xiàn)臨界區(qū)管理的軟件方法,Dekker算法(自學(xué)) Peterson算法 軟件方法缺點(diǎn): 忙式等待:空循環(huán)在浪費(fèi)CPU時(shí)間片 實(shí)現(xiàn)復(fù)雜,需要較高的編程技巧,不同的進(jìn)程實(shí)現(xiàn)代碼要分別設(shè)計(jì) 產(chǎn)生問(wèn)題的根本原因: 測(cè)試和上鎖沒(méi)有一氣呵成,如果測(cè)試與上鎖工作不被打斷,我們將這兩個(gè)工作分別封裝進(jìn)兩個(gè)函數(shù): BOOL Lock = FREE; LockAcquire() while (Lock = BUSY); Lock = BUSY ; LockRelease() Lock = FREE ; ,那么進(jìn)程i的描述可以簡(jiǎn)化為 P
12、rocess Pi LockAcquire(); LockRelease(); ,臨界區(qū);,Disable Ints;,Enable Ints;,怎么實(shí)現(xiàn)呢?,可能出什么問(wèn)題?,原語(yǔ)(原子操作),原語(yǔ)是操作系統(tǒng)內(nèi)核中執(zhí)行時(shí)不可中斷的過(guò)程,即原子操作。 許多系統(tǒng)提供了特殊的硬件指令,指令執(zhí)行過(guò)程是原子地。 用硬件指令來(lái)管理臨界區(qū) 測(cè)試并建立指令(TestAndSet) 對(duì)換指令(Swap) (自學(xué)),TS指令(TestAndSet),BOOL TS(BOOL s) BOOL result = s;s = false;return result; TS指令管理臨界區(qū)時(shí),可把一個(gè)臨界區(qū)與一個(gè)布爾變量
13、s相連,s為true表示臨界區(qū)空閑,可把它看成一把鎖。進(jìn)程進(jìn)入臨界區(qū)前要保證TS(s)的返回值為true。,用TS指令實(shí)現(xiàn)臨界區(qū)管理,算法描述如下: BOOL s = true; / free LockAcquire() while ( !TS(s) ); /loop if busy LockRelease() s = true; 算法解釋: 如果臨界區(qū)空閑則s=true,TS返回true并將s設(shè)為false,此時(shí)臨界區(qū)為設(shè)為占用狀態(tài),同時(shí)跳出while循環(huán)進(jìn)入臨界區(qū)。 如果臨界區(qū)占用則s=false,TS返回false并且s值不變,所以此時(shí)循環(huán)將繼續(xù)。 存在忙式等待!,臨界區(qū);,復(fù)習(xí):臨界區(qū)
14、,為了解決并發(fā)進(jìn)程共享變量時(shí)可能引起的錯(cuò)誤,引入互斥的概念: 互斥:確保一個(gè)時(shí)刻僅有一個(gè)進(jìn)程在訪問(wèn)共享資源。 共享變量代表的資源叫“臨界資源”。 在并發(fā)進(jìn)程中涉及到臨界資源的程序段叫“臨界區(qū)”。 臨界區(qū)的使用原則 有空讓進(jìn) 擇一而入 無(wú)空等待 有限等待 讓權(quán)等待,復(fù)習(xí):用軟件方法實(shí)現(xiàn)鎖,鎖(lock)是互斥機(jī)制的實(shí)現(xiàn)手段! 使用過(guò)程: 測(cè)試成功并上鎖(若測(cè)試失敗則等待) 進(jìn)入臨界區(qū) 開(kāi)鎖 兩次用軟件方法嘗試失敗的原因 測(cè)試和上鎖沒(méi)有一氣呵成,導(dǎo)致兩進(jìn)程交替執(zhí)行 Peterson和Dekker算法解決了這一問(wèn)題,但設(shè)計(jì)的過(guò)于復(fù)雜,復(fù)習(xí):用硬件指令實(shí)現(xiàn)鎖,硬件指令大都是原子操作,其執(zhí)行過(guò)程不會(huì)被打
15、斷,可以使用開(kāi)/關(guān)中斷來(lái)達(dá)到這一目的。,BOOL TS(BOOL s) /s表示臨界區(qū)是否空閑 BOOL result = s;s = false;/上鎖return result; /返回測(cè)試結(jié)果 ,使用TS指令實(shí)現(xiàn)的鎖算法: BOOL s = true; /free LockAcquire() while ( !TS(s) ); LockRelease() s = true; ,忙式等待 進(jìn)程在等待進(jìn)入臨界區(qū)時(shí)仍占有CPU執(zhí)行一個(gè)空循環(huán),浪費(fèi)了CPU時(shí)間片。 浪費(fèi)的時(shí)間和臨界區(qū)長(zhǎng)度有關(guān) 解決方法?,讓忙等的進(jìn)程睡覺(jué)去,為了克服忙等,可以讓進(jìn)程阻塞自己。阻塞操作將一個(gè)進(jìn)程插入一個(gè)等待隊(duì)列,同
16、時(shí)調(diào)度程序可以調(diào)度另一個(gè)進(jìn)程運(yùn)行。 算法描述如下:,LockAcquire() if ( !TS(s) ) sleep(); ,LockRelease() if (有等待進(jìn)程) wakeup();/釋放一個(gè)到就緒隊(duì)列 else s = true; ,這個(gè)算法完美了? 還記得“永遠(yuǎn)等待”嗎?,臨 界 區(qū) 代 碼,BOOL guard = true; int lock = FREE; LockAcquire() / 短暫的忙等 while ( !TS(guard) ); if (lock = BUSY) sleep() ,用TS指令實(shí)現(xiàn)一個(gè)減少忙等的算法,將上鎖和解鎖代碼看成另一個(gè)臨界區(qū),所以用一
17、把新鎖guard保證這個(gè)臨界區(qū)代碼不會(huì)被打斷執(zhí)行!(即兩個(gè)函數(shù)都變成了原子操作) 框線代碼必須一并完成,否則有何后果?,LockRelease() / 短暫的忙等 while ( !TS(guard) ); if (有等待進(jìn)程) wakeup(); /釋放一個(gè)到就緒隊(duì)列 else lock = FREE; guard = true;,同步機(jī)制的實(shí)現(xiàn),我們已經(jīng)在TS指令的基礎(chǔ)上實(shí)現(xiàn)了鎖及其操作原語(yǔ),解決了互斥問(wèn)題。 鎖(互斥)是一種特殊的同步,廣泛意義上的同步是指并發(fā)進(jìn)程可以按照某種規(guī)則共享多個(gè)資源。 e.g.如果系統(tǒng)有兩臺(tái)打印機(jī),就可以同時(shí)讓兩個(gè)進(jìn)程同時(shí)享用。此時(shí)鎖的局限性就體現(xiàn)出來(lái)了 信號(hào)量
18、出現(xiàn)了。,3.3 信號(hào)量與PV操作,信號(hào)量,信號(hào)量是一種廣義上的鎖 1965年,由荷蘭學(xué)者Dijkstra提出 信號(hào)量是一個(gè)非負(fù)的整數(shù),并有兩個(gè)操作原語(yǔ): P():如果信號(hào)量的值為負(fù)數(shù)則等待,否則將信號(hào)量值減1 V():將信號(hào)量的值加1,如果有進(jìn)程在等待則喚醒它 在荷蘭語(yǔ)中,P表示 “proberen” (測(cè)試) , V表示“verhogen”(增加)。常用的符號(hào)還有:wait和signal等。 信號(hào)量用于制約控制并發(fā)進(jìn)程的執(zhí)行速度,是一種卓有成效的進(jìn)程同步(互斥)機(jī)制!,信號(hào)量像整數(shù),但不是整數(shù),信號(hào)量與整數(shù)的區(qū)別 信號(hào)量是一個(gè)非負(fù)的整數(shù) 除了設(shè)置初值,信號(hào)量值的變化只能由P或V操作完成,用
19、戶程序不能直接讀取或修改它 PV操作是原語(yǔ),執(zhí)行過(guò)程不可中斷 信號(hào)量在鐵路的應(yīng)用,信號(hào)量被初始化成2(表示有兩條空閑的軌道),Value=,2,1,0,Value=?,1,整型信號(hào)量,P(s) while (s = 0); s = s 1; V(s) s = s + 1; ,s是一個(gè)整型數(shù)值的信號(hào)量,代表資源的個(gè)數(shù)。 與TS指令的區(qū)別 TS指令的執(zhí)行效果與s等于1時(shí)相同 當(dāng)資源不足時(shí),P(s)將陷入與TS指令一樣的“忙式等待” 這個(gè)我們寫的代碼有什么兩樣? 這是OS內(nèi)核提供的原子操作,內(nèi)部實(shí)現(xiàn)復(fù)雜。,記錄型信號(hào)量,P(s) s.value = s.value - 1 ; if (s.value
20、 0) ProcessState = “waiting”; sleep(); ,V(s) s.value = s.value + 1; if (s.value = 0) wakeup(); ProcessState = “ready”; ,記錄型信號(hào)量s是一個(gè)如下內(nèi)容的結(jié)構(gòu)體變量 struct semaphore int value; PCB *queue; s;,信號(hào)量分類,按用途分為: 公共信號(hào)量(允許所有進(jìn)程對(duì)信號(hào)量進(jìn)行P操作,通常用于互斥) 私有信號(hào)量(僅允許信號(hào)量擁有進(jìn)程才能執(zhí)行P操作,通常用于同步) 按信號(hào)量的取值分為: 一般信號(hào)量(整型、記錄型) 二元信號(hào)量(只能取值為0或1),
21、用PV操作解決進(jìn)程間互斥問(wèn)題,semaphore mutex = 1; Process Pi P(mutex); V(mutex); 互斥信號(hào)量屬于公有信號(hào)量,通?;コ庑盘?hào)量的初值為1,表示臨界區(qū)同時(shí)僅能讓一個(gè)進(jìn)程進(jìn)入。,/*解決單類機(jī)票問(wèn)題*/ int Am; semaphore mutex = 1; Process Pi int Xi; /按旅客定票要求找到Aj P(mutex); Xi = Aj; if Xi = 1 then Xi = Xi - 1; Aj = Xi; V(mutex); /輸出一張票; else V(mutex); /輸出票已售完; ,臨界區(qū);,Value=2,Val
22、ue=1,Value=0,信號(hào)量初值不為1時(shí)的情況,鐵軌是資源,用一個(gè)初值為2的信號(hào)量來(lái)表示空閑鐵軌數(shù)為2,可供兩列火車同時(shí)通過(guò)。 信號(hào)量的數(shù)值表示了可用資源的個(gè)數(shù), P操作代表請(qǐng)求一個(gè)資源,V操作代表釋放一個(gè)資源。,/*火車控制問(wèn)題*/ semaphore road = 2; Process Pi P(road); /通過(guò)交叉路口; V(road); ,Value=1,Value=0,Value=0,信號(hào)量的一些使用規(guī)則,必須置一次且只能置一次初值 初值不能為負(fù)數(shù) 只能用于執(zhí)行P、V操作 若s 0,則s代表還可以使用的資源數(shù) 若s 0,則s表示等待隊(duì)列里的進(jìn)程數(shù) P操作代表請(qǐng)求一個(gè)資源 V操
23、作代表釋放一個(gè)資源,哲學(xué)家吃通心面問(wèn)題,semaphore fork5; forki = 1; process Pi /i=0,1,2,3,4 思考; P(forki); P(fork(i+1)mod 5); 吃通心面; V(forki); V(fork(i+1)mod 5); ,問(wèn)題描述 5個(gè)哲學(xué)家圍在桌旁,每人面前有一盤子,每?jī)扇酥g放一把叉子。每個(gè)哲學(xué)家思考、饑餓,然后想吃通心面。只有拿到兩把叉子的人才可以吃面,并且每人只能直接拿自己左手或右手邊的叉子。,哲學(xué)家吃通心面可能產(chǎn)生死鎖,上述解法可能出現(xiàn)永遠(yuǎn)等待 當(dāng)五個(gè)人同時(shí)都取到左手的叉子時(shí)發(fā)生 有若種辦法可避免死鎖: 至多允許四個(gè)哲學(xué)家同
24、時(shí)吃; 奇數(shù)號(hào)先取左手邊的叉子,偶數(shù)號(hào)先取右手邊的叉子; 每個(gè)哲學(xué)家取到手邊的兩把叉子才吃,否則一把叉子也不取。,同步問(wèn)題,司機(jī) 啟動(dòng)車輛 正常行車 到站停車,同步問(wèn)題實(shí)質(zhì)上是讓那些隨機(jī)發(fā)生的事件變得有序。 實(shí)現(xiàn)的方法是調(diào)節(jié)并發(fā)進(jìn)程的執(zhí)行速度,讓某些進(jìn)程必須等待另一些進(jìn)程的執(zhí)行而得以繼續(xù)。 一個(gè)簡(jiǎn)單的同步問(wèn)題:公共汽車上司機(jī)和售票員的活動(dòng)分別如下: 司機(jī):?jiǎn)?dòng)車輛;正常行車;到站停車 售票員:關(guān)車門;售票;開(kāi)車門 同步要點(diǎn):司機(jī)要等門關(guān)閉才能開(kāi)車,售票員要等停車才能開(kāi)門,售票員 關(guān)車門 售票 開(kāi)車門,P( ),P( ),V( ),V( ),等待點(diǎn),等待點(diǎn),用PV操作解決進(jìn)程間同步問(wèn)題,P司機(jī)
25、P(s1); 行車; V(s2); ,P售票員 V(s1); 售票; P(s2); ,使用私有信號(hào)量解決同步問(wèn)題 某進(jìn)程在等待點(diǎn)上等待一個(gè)信號(hào)讓它繼續(xù)執(zhí)行,這個(gè)信號(hào)量即為該進(jìn)程的私有信號(hào)量,僅能由本進(jìn)程進(jìn)行P操作。 為了讓進(jìn)程等待,私有信號(hào)量的初值一般為0. 公共汽車問(wèn)題應(yīng)該有2個(gè)私有信號(hào)量,分別指示司機(jī)和售票員的行動(dòng)。semaphore s1=0,s2=0.,生產(chǎn)者-消費(fèi)者問(wèn)題(經(jīng)典同步問(wèn)題),生產(chǎn)者(P)與消費(fèi)者(C)共用一個(gè)緩沖區(qū),P進(jìn)程不能往“滿”的緩沖區(qū)中放產(chǎn)品,C進(jìn)程不能從“空”的緩沖區(qū)中取產(chǎn)品。 因?yàn)楣蚕砹司彌_區(qū),故并發(fā)的P、C進(jìn)程有可能產(chǎn)生與時(shí)間相關(guān)的錯(cuò)誤,因而要采取措施使兩進(jìn)
26、程執(zhí)行同步。 分別為P和C進(jìn)程設(shè)置兩個(gè)信號(hào)量(私有還有公有?初值是多少?),用于指示進(jìn)程是否可以執(zhí)行。假設(shè)緩沖區(qū)只能存放一件產(chǎn)品,初始狀態(tài)為空。,生產(chǎn)者,消費(fèi)者,生產(chǎn)者-消費(fèi)者問(wèn)題的解法,Semaphore empty = 1;/生產(chǎn)者的信號(hào)量 Semaphore full = 0;/消費(fèi)者的信號(hào)量,P while (true) 生產(chǎn)一個(gè)產(chǎn)品; P(empty); 送產(chǎn)品到緩沖區(qū); V(full); ,C while (true) P(full); 從緩沖區(qū)取產(chǎn)品; V(empty); 消費(fèi)產(chǎn)品; ,復(fù)習(xí):信號(hào)量,把信號(hào)量s理解一個(gè)非負(fù)的整數(shù) 在互斥問(wèn)題里,把它看成一把鎖,P(s)表示進(jìn)程申請(qǐng)
27、進(jìn)入臨界區(qū),V(s)表示已退出臨界區(qū)。由于臨界區(qū)要擇一而入,所以用于互斥的信號(hào)量初值設(shè)為1,屬于公有信號(hào)量。 在同步問(wèn)題里,我們利用P操作會(huì)引發(fā)等待的效果來(lái)實(shí)現(xiàn)調(diào)節(jié)并發(fā)進(jìn)程執(zhí)行速度的目標(biāo)。為了讓一個(gè)進(jìn)程等待,信號(hào)量的值應(yīng)該為0,一般此種信號(hào)我們稱為私有信號(hào)量。 不作說(shuō)明的情況下我們使用的都是記錄型的信號(hào)量,因?yàn)樗鼪](méi)有忙式等待。 一般而言,我們不要以信號(hào)量是公有還是私有來(lái)決定它的初值,請(qǐng)依題意行事。信號(hào)量表示可用資源的數(shù)量,P(s)表示申請(qǐng)一個(gè)資源,V(s)表示釋放一個(gè)資源。如果你要申請(qǐng)兩個(gè)資源怎么辦?,復(fù)習(xí):信號(hào)量的應(yīng)用,semaphore mutex = 1; Process Pi P(mu
28、tex); 臨界區(qū); V(mutex); /互斥,semaphore s = 0; Process Pi /等著別人來(lái)喚醒他 P(s); Process Pj /叫醒一個(gè)睡覺(jué)的 V(s); /同步 /沒(méi)有睡覺(jué)的咋辦?,semaphore road = 2; Process Pi P(road); /申請(qǐng)資源 P(road); /再來(lái)一個(gè) 使用資源; V(road); V(road); /釋放資源 /同步,Process consumer_j P(full); P(mutex); Product:= Bout; out:=(out+1) mod k; V(mutex); V(empty); 消費(fèi)
29、一個(gè)產(chǎn)品; ,生產(chǎn)者消費(fèi)者問(wèn)題擴(kuò)展(多緩沖),item Bk;/* 緩沖區(qū)*/ semaphore empty = k; /* 可以使用的空緩沖區(qū)數(shù) */ semaphore full = 0; /* 緩沖區(qū)內(nèi)可以使用的產(chǎn)品數(shù) */ semaphore mutex = 1; int in = 0,out = 0; /* 放入/取出緩沖區(qū)指針*/,Process producer_i 生產(chǎn)一個(gè)產(chǎn)品; P(empty); P(mutex); Bin = product; in = (in+1) mod k; V(mutex); V(full); ,信號(hào)量及PV操作使用注意事項(xiàng),PV操作必須成對(duì)出現(xiàn)
30、,有一個(gè)P操作就一定有一個(gè)V操作。 當(dāng)為互斥操作時(shí),它們同處于同一進(jìn)程 當(dāng)為同步操作時(shí),則不在同一進(jìn)程中出現(xiàn) 如果P(full)或P(empty)和P(mutex)兩個(gè)操作在一起,那么P操作的順序至關(guān)重要,一個(gè)同步P操作與一個(gè)互斥P操作在一起時(shí)同步P操作在互斥P操作前,而兩個(gè)V操作無(wú)關(guān)緊要,同步問(wèn)題的分析過(guò)程,有幾個(gè)并發(fā)進(jìn)程,公用緩沖區(qū)的個(gè)數(shù) 分析每個(gè)進(jìn)程的執(zhí)行流程,必要時(shí)畫(huà)出它的流程圖,找出在何時(shí)何處需要等待! 設(shè)置幾個(gè)信號(hào)量?初始狀態(tài)是什么?信號(hào)量初值設(shè)成多少?需要其它變量輔助嗎? 公用緩沖區(qū)是否需要用互斥信號(hào)量保護(hù)?,蘋果桔子問(wèn)題,問(wèn)題描述 桌上有一只盤子,每次只能放入一只水果 爸爸專向
31、盤子中放蘋果(apple),媽媽專向盤子中放桔于(orange) 一個(gè)兒子專等吃盤子中的桔子,一個(gè)女兒專等吃盤子里的蘋果 問(wèn)題分析 盤子緩沖區(qū);爸媽生產(chǎn)者;兒女消費(fèi)者 這是多個(gè)生產(chǎn)/消費(fèi)者,一個(gè)緩沖區(qū),多種產(chǎn)品的問(wèn)題 設(shè)置三個(gè)信號(hào)量 sp用于指示盤子能放幾個(gè)水果,初值=? sg1,sg2分別用于指示桔子和蘋果的個(gè)數(shù),初值=?,semaphore sp = 1; /* 盤子里允許放一個(gè)水果*/ semaphore sg1 = 0; /* 盤子里沒(méi)有桔子 */ semaphore sg2 = 0; /* 盤子里沒(méi)有蘋果*/,Process father 削一個(gè)蘋果; P(sp); 把蘋果放入pla
32、te; V(sg2); Process mother 剝一個(gè)桔子; P(sp); 把桔子放入plate; V(sg1); ,Process son P(sg1); 從plate中取桔子; V(sp); 吃桔子; Process daughter P(sg2); 從plate中取蘋果; V(sp); 吃蘋果; ,蘋果桔子問(wèn)題的解法,讀者寫者問(wèn)題,有兩組并發(fā)進(jìn)程:讀者和寫者,共享一個(gè)文件,要求: 允許多個(gè)讀者同時(shí)執(zhí)行讀操作 任一寫者在完成寫操作之前不允許其它讀者或?qū)懻吖ぷ?寫者執(zhí)行寫操作前,應(yīng)讓已有的寫者和讀者全部退出 簡(jiǎn)單一句話:某一時(shí)刻,允許存在多個(gè)讀者,但僅能有一個(gè)寫者。,讀者寫者問(wèn)題分析,
33、一個(gè)寫者到達(dá)時(shí) 如果發(fā)現(xiàn)有讀者正在讀,則等待;否則開(kāi)始寫 一個(gè)讀者到達(dá)時(shí) 如果有寫者正在寫,則等待;否則開(kāi)始讀 讀者和寫者會(huì)發(fā)生競(jìng)爭(zhēng)問(wèn)題,讀者和讀者可以共存。所以先設(shè)置一個(gè)信號(hào)量W解決讀者和寫者之間的競(jìng)爭(zhēng)。 如何判斷是否有讀者以及讀者離開(kāi)時(shí)是最后一個(gè)? 設(shè)置一個(gè)int變量rc記錄當(dāng)前正在讀文件的讀者數(shù)量。 初值應(yīng)該各設(shè)成多少? semaphore W = ?; int rc = ?;,process Reader P(Mutex); rc = rc + 1; if rc = 1 then P(W); V(Mutex); 讀文件; P(Mutex); rc = rc - 1; if rc = 0
34、 then V(W); V(Mutex); ,讀者寫者問(wèn)題解法(讀者優(yōu)先),semaphore W = 1; int rc = 0; semaphore Mutex = 1; process Writer P(W); 寫文件; V(W); ,理發(fā)師問(wèn)題,理發(fā)店理有一位理發(fā)師、 一把理發(fā)椅和n把供等候 理發(fā)的顧客坐的椅子 如果沒(méi)有顧客,理發(fā)師便 在理發(fā)椅上睡覺(jué) 一個(gè)顧客到來(lái)時(shí),它必須叫醒理發(fā)師 如果理發(fā)師正在理發(fā)時(shí)又有顧客來(lái)到,則如果有空椅子可坐,就坐下來(lái)等待,否則就離開(kāi),int waiting = 0; /*等候理發(fā)的顧客數(shù)*/ int CHAIRS = n; /*為顧客準(zhǔn)備的椅子數(shù)*/ se
35、maphore customers,barbers,mutex; customers = 0; barbers = 1; mutex = 1;,理發(fā)師問(wèn)題解法,barber() while(TRUE) P(customers); P(mutex); waiting = waiting 1; V(mutex); cut_hairs(); V(barbers); ,customer() P(mutex); if waiting CHAIRS waiting = waiting + 1; V(mutex); P(barbers); V(customers); get_haircut(); else
36、V(mutex); leave(); ,練習(xí),把學(xué)生和監(jiān)考老師都看作進(jìn)程,學(xué)生有N人,教師1人。考場(chǎng)門口每次只能進(jìn)出一個(gè)人,進(jìn)考場(chǎng)原則是先來(lái)先進(jìn)。當(dāng)N個(gè)學(xué)生都進(jìn)入考場(chǎng)后,教師才能發(fā)卷子,學(xué)生交卷后可以離開(kāi)考場(chǎng),教師要等收上來(lái)全部卷子并封裝卷子后才能離開(kāi)考場(chǎng)。全部流程如下圖所示,使用給定的信號(hào)量與變量,試用P、V操作解決上述問(wèn)題中的同步和互斥關(guān)系。,入場(chǎng),等待學(xué)生到齊后發(fā)卷,監(jiān)考,收卷,卷子收齊封裝后才能離場(chǎng),教師流程,入場(chǎng),等待發(fā)卷,考試,交卷,離場(chǎng),學(xué)生流程,參考答案,Process teacher P(entrymutex); 進(jìn)考場(chǎng) V(entrymutex); P(waitforstu
37、dent); for (i=1;i=N;i+)/發(fā)卷 V(d_paper); 監(jiān)考 P(g_paper); /等待學(xué)生交齊試卷 收/封試卷 P(entrymutex); 離場(chǎng) V(entrymutex); ,Process student_i /進(jìn)考場(chǎng) P(entrymutex); studentCount+; if (studentCount = N) then V(waitforstudent); V(entrymutex); P(d_paper);/等待發(fā)卷 考試 /交卷離場(chǎng) P(entrymutex); studentCount-; if (studentCount = 0) then
38、 V(g_paper); V(entrymutex); ,Semaphoreentrymutex = 1 ; /入場(chǎng)/互斥 Semaphore waitforstudent = 0 ; /等待學(xué)生全部入場(chǎng) Semaphore d_paper = 0 ; /發(fā)卷信號(hào)量 Semaphore g_paper = 0 ; /收卷信號(hào)量 int studentCount = 0,3.5 進(jìn)程通信,review:學(xué)習(xí)目標(biāo),并發(fā)的進(jìn)程間為何要對(duì)話?(協(xié)作或競(jìng)爭(zhēng)) 并發(fā)的進(jìn)程間的對(duì)話方式(通信方式)有哪些? 信號(hào)量(重點(diǎn)掌握) 共享文件 共享存儲(chǔ)區(qū) 消息傳遞 并發(fā)的進(jìn)程間如果溝通的不好的話會(huì)咋樣? 答:會(huì)死鎖
39、! 掌握如何解決死鎖問(wèn)題,進(jìn)程間通信機(jī)制的方式,低級(jí)通信機(jī)制 信號(hào)(signal)通信機(jī)制 信號(hào)量及其原語(yǔ)操作(PV、鎖、管程)控制的共享存儲(chǔ)區(qū)(shared memory)通信機(jī)制 高級(jí)通信機(jī)制 管道提供的共享文件(shared file)通信機(jī)制 消息傳遞(message passing)通信機(jī)制 socket通信機(jī)制,信號(hào)(signal)通信機(jī)制,也稱軟中斷(p84),通過(guò)發(fā)送一個(gè)指定的信號(hào)來(lái)通知進(jìn)程某個(gè)異常事件發(fā)生,并進(jìn)行適當(dāng)處理。 與中斷類似,信號(hào)被進(jìn)程接收到后也有信號(hào)處理程序,處理完畢可返回原來(lái)斷點(diǎn)繼續(xù)執(zhí)行。 與硬中斷的區(qū)別 軟中斷運(yùn)行在用戶態(tài),反應(yīng)延時(shí)較長(zhǎng) 硬中斷運(yùn)行在核心態(tài),響
40、應(yīng)比較及時(shí) 信號(hào)可以從內(nèi)核發(fā)出,也可以由一個(gè)進(jìn)程發(fā)出。UNIX的系統(tǒng)信號(hào)多達(dá)十幾種,可以使用kill l查看系統(tǒng)中信號(hào)的種類,該命令也用于發(fā)送信號(hào)。 kill s sig_name pid,Linux的信號(hào)處理函數(shù),sigset_t sigmask; /信號(hào)掩碼集 /信號(hào)集合處理函數(shù) int sigaddset(sigset_t* set,int signo); int sigdelset(sigset_t* set,int signo); int sigemptyset(sigset_t* set); /修改進(jìn)程的信號(hào)掩碼 int sigprocmask(int how, /SIG_BLOC
41、K/SIG_UNBLOCK const sigset_t* set, sigset_t* oset); /捕捉信號(hào) int sigaction(int sig, const struct sigaction* act, struct sigaction* oact);,Linux的信號(hào)處理函數(shù)(續(xù)),struct sigaction void (*sa_handler) (int); /函數(shù)指針 sigset_t sa_mask;/處理信號(hào)時(shí)需要阻塞的信號(hào) int sa_flags;/特殊標(biāo)志和選項(xiàng) void (*sa_sigaction) (int,siginfo_t*,void*); ;
42、實(shí)現(xiàn)捕捉異步信號(hào)并自己處理 void catchsigfunc(int signo); int main() struct sigaction act; act.sa_handler = catchsigfunc; act.sa_flags = 0; sigemptyset( ,共享文件(shared file)通信機(jī)制,也稱管道,它是連接兩個(gè)進(jìn)程的一個(gè)特殊的文件,它基于文件系統(tǒng)機(jī)制實(shí)現(xiàn),共有兩個(gè)端口:讀和寫。 一次只能一個(gè)進(jìn)程讀/寫管道 雙方必須知道對(duì)方的存在(僅能用于父子進(jìn)程) 雙方收發(fā)信息要實(shí)現(xiàn)同步 讀進(jìn)程先讀到的是先寫入管道的內(nèi)容(先進(jìn)先出) 命名管道(FIFO)用于更普遍的情況,Li
43、nux的管道相關(guān)函數(shù),int pipe(int fildes2); int main() int fd2; pipe(fd);/創(chuàng)建一個(gè)無(wú)名管道 ssize_t write(int fildes, const void* buf, size_t nbyte);/向一個(gè)文件寫 ssize_t read(int fildes, void* buf, size_t nbyte);/從一個(gè)文件讀,共享存儲(chǔ)區(qū)(sm)通信機(jī)制,相互通信的進(jìn)程間設(shè)有公共內(nèi)存,一組進(jìn)程向該公共內(nèi)存中寫,另一組進(jìn)程從公共內(nèi)存中讀,通過(guò)這種方式實(shí)現(xiàn)兩組進(jìn)程間的信息交換。 Linux下的實(shí)現(xiàn)函數(shù)有: int shmget(key,
44、size_t size,int flags); void *shmat(int shmid, const void* shmaddr, int flags);/將返回一個(gè)共享內(nèi)存地址 int shmdt(const void* shmaddr);/斷開(kāi)與共享內(nèi)存的鏈接 int shmctl(int shmid,int cmd,struct shmid_ds* buf); 使用ipcs m可以查看當(dāng)前系統(tǒng)的shm信息,消息傳遞(mp)通信機(jī)制,一個(gè)進(jìn)程將一組數(shù)據(jù)作為一個(gè)消息發(fā)送給另個(gè)進(jìn)程 原來(lái)的“生產(chǎn)消費(fèi)者”問(wèn)題,除了使用信號(hào)量,還加了一個(gè)有界緩沖實(shí)現(xiàn)的?,F(xiàn)在生產(chǎn)者可以將產(chǎn)品直接發(fā)送給消費(fèi)者,發(fā)
45、送和接收原語(yǔ)已經(jīng)實(shí)現(xiàn)了同步,大大簡(jiǎn)化了編程過(guò)程。故稱這種通信機(jī)制為高級(jí)通信機(jī)制。 消息傳遞方式 直接通信 信息直接傳遞給接收方 間接通信 借助于收發(fā)雙方進(jìn)程之外的共享數(shù)據(jù)結(jié)構(gòu)作為通信中轉(zhuǎn),如消息隊(duì)列。該共享的內(nèi)存稱為信箱。,Linux的消息隊(duì)列函數(shù),int msgget(key_t key,int msgflg); int msgsnd(int msqid,/消息隊(duì)列ID struct msgbuf* msgp,/用戶緩沖 size_t msgsz, int msgflg); int msgrcv(int msqid, struct msgbuf* msgp, size_t msgsz, lo
46、ng msgtyp,int msgflg); int msgctl(int msqid,int cmd,struct msqid_ds* buf); struct msgbuf long mtype;/消息類型 char mtext1;/消息文本 ; 發(fā)送的消息大小 = sizeof(msgbuf)+strlen(mymessage),3.6 死鎖,死鎖的基本概念 死鎖的解決方案 資源分配圖,計(jì)算機(jī)資源,計(jì)算機(jī)資源(硬件資源和軟件資源) CPU時(shí)間,磁盤空間,存儲(chǔ)器, 程序和數(shù)據(jù)等 可剝奪資源 不可剝奪資源 資源可以互斥訪問(wèn),也可以共享訪問(wèn) 文件是典型的共享資源 打印機(jī)同一時(shí)刻僅能為一個(gè)進(jìn)程服
47、務(wù) 資源管理是OS的重要組成部分,饑餓與死鎖,饑餓 vs 死鎖 饑餓:進(jìn)程長(zhǎng)時(shí)間的等待 e.g.低優(yōu)先級(jí)進(jìn)程總是等待高優(yōu)先級(jí)所占有的進(jìn)程 死鎖:循環(huán)等待資源 A和B分別占有打印機(jī)和掃描儀 同時(shí)分別申請(qǐng)掃描儀和打印機(jī) 死鎖 饑餓 (反之不亦然) 饑餓可能終止 如果無(wú)外部干涉,死鎖無(wú)法終止,死鎖的產(chǎn)生條件,PV操作使用不當(dāng)產(chǎn)生的死鎖 進(jìn)程 A進(jìn)程 B P(x);P(y); P(y); P(x); V(y);V(x); V(x);V(y); 死鎖的發(fā)生并不僅和代碼相關(guān),與進(jìn)程的執(zhí)行順序相關(guān) 同類資源分配不當(dāng)引起的死鎖 e.g.一個(gè)系統(tǒng)有兩個(gè)磁盤和兩個(gè)進(jìn)程 一個(gè)進(jìn)程要兩個(gè)磁盤才能執(zhí)行 每個(gè)進(jìn)程都占有一
48、個(gè)磁盤等待另一個(gè) 死鎖與進(jìn)程的推進(jìn)速度、資源的數(shù)量以及資源分配策略有關(guān),典型的死鎖問(wèn)題,交通問(wèn)題 車輛同時(shí)右轉(zhuǎn)發(fā)生死鎖 哲學(xué)家吃通心面問(wèn)題 哲學(xué)家同時(shí)拿起左手的叉子發(fā)生死鎖,產(chǎn)生死鎖的四個(gè)必要條件,互斥使用 一個(gè)時(shí)刻,一個(gè)資源僅能被一個(gè)進(jìn)程占有 不可剝奪 除了資源占有進(jìn)程主動(dòng)釋放資源,其它進(jìn)程都不可搶奪其資源 占有和保持 一個(gè)進(jìn)程請(qǐng)求資源得不到滿足等待時(shí),不釋放已占有資源 循環(huán)等待(上面三個(gè)條件同時(shí)存在產(chǎn)生的結(jié)果) 每一個(gè)進(jìn)程分別等待它前一個(gè)進(jìn)程所占有的資源,死鎖的解決方案,死鎖的防止 (Prevention) 破壞四個(gè)必要條件之一 死鎖的避免 (Avoidance) 允許四個(gè)必要條件同時(shí)存在
49、,在并發(fā)進(jìn)程中做出妥善安排避免死鎖的發(fā)生 死鎖的檢測(cè)和恢復(fù) (Detection & Recovery) 允許死鎖的發(fā)生,系統(tǒng)及時(shí)地檢測(cè)死鎖并解除它,死鎖的防止,破壞“互斥條件” 允許資源可同時(shí)訪問(wèn)而不是互斥訪問(wèn)(不太現(xiàn)實(shí)) 破壞“不可剝奪條件” 允許資源被剝奪,但只適用于CPU和主存資源等有限資源 破壞“占有和等待條件” 一個(gè)進(jìn)程必須在執(zhí)行前申請(qǐng)它所要的全部資源,因而不會(huì)出現(xiàn)等待的情況 破壞“循環(huán)等待條件” 強(qiáng)制進(jìn)程按照某種順序申請(qǐng)資源,消除資源的循環(huán)占用 m個(gè)資源順序是:R1,R2,Rm 申請(qǐng)Rn,必須先占有Ri (in),死鎖的避免,死鎖的防止對(duì)資源的的分配加以諸多限制,降低了進(jìn)程的運(yùn)行
50、和資源使用的效率。 死鎖的避免允許同時(shí)存在四個(gè)必要條件,試圖在系統(tǒng)運(yùn)行過(guò)程中避免死鎖的發(fā)生。 方法:系統(tǒng)對(duì)進(jìn)程每次發(fā)出的資源申請(qǐng)進(jìn)行動(dòng)態(tài)檢查,并根據(jù)檢查結(jié)果決定是否分配資源,若分配后系統(tǒng)可能發(fā)生死鎖,則不予分配,否則予以分配。 安全狀態(tài) 如果存在一個(gè)由系統(tǒng)中所有進(jìn)程構(gòu)成的序列P1,Pn,按照此序列分配資源不會(huì)導(dǎo)致死鎖,則系統(tǒng)處于安全狀態(tài)。(安全序列可能不止一個(gè)) 不安全狀態(tài) 不存在任何一個(gè)安全序列,則系統(tǒng)處于不安全狀態(tài),不安全狀態(tài)會(huì)導(dǎo)致死鎖。,避免死鎖的單種資源銀行家算法,問(wèn)題描述 銀行家(OS)擁有一筆周轉(zhuǎn)資金。 客戶(進(jìn)程)要求分期貸款(資源), 如果客戶能夠得到各期貸款,就一定 能夠歸還
51、貸款,否則就一定不能歸還貸款。 銀行家應(yīng)謹(jǐn)慎的貸款,防止出現(xiàn)壞帳。 對(duì)每個(gè)請(qǐng)求進(jìn)行檢查,是否會(huì)導(dǎo)致不安全狀態(tài)。若是,則不批準(zhǔn)該請(qǐng)求。 檢查狀態(tài)是否安全的方法是,看他是否有足夠的資源滿足一個(gè)距最大需求最近的客戶,如此反復(fù)下去。如果所有投資最終都被收回,則該狀態(tài)是安全的,最初的請(qǐng)求可以批準(zhǔn)。,單種資源的銀行家算法例題,安全,安全,不安全,多種資源的銀行家算法(Dijkstra),總的資源E = 已分配資源P + 剩余資源A,多種資源的銀行家算法描述,Cki :k進(jìn)程總共需要的i資源數(shù)量 Aki :已分配給k進(jìn)程的i資源數(shù)量 Cki Aki :k進(jìn)程還需要的i資源數(shù)量 currentAvail :當(dāng)
52、前系統(tǒng)可用的資源數(shù)量 Allocation :當(dāng)前系統(tǒng)已分配的資源數(shù)量,多種資源的銀行家算法例題,如果系統(tǒng)中共有五個(gè)進(jìn)程和A、B、C三類資源 A類資源共有10個(gè),B類資源共有5個(gè),C類資源共有7個(gè)。T0時(shí)刻系統(tǒng)資源分配情況如下。 process Allocation Claim Available A B C A B C A B C P0 0 1 0 7 5 3 3 3 2 P1 2 0 0 3 2 2 P2 3 0 2 9 0 2 P3 2 1 1 2 2 2 P4 0 0 2 4 3 3,每個(gè)進(jìn)程目前還需資源為Cki-Aki,Cki-Aki process A B C P0 7 4 3 P1 1 2 2 P2 6 0 0 P3 0 1 1 P4 4 3 1,Availabe A B C 3 3 2,T0時(shí)刻系統(tǒng)的安全性,序列 能滿足安全性條件,P2,P0,P3,P4,P1,P3,P4,P2,P0,銀行家算法的優(yōu)缺點(diǎn),優(yōu)點(diǎn):不需要加上種種限制條件 缺乏實(shí)用價(jià)值 進(jìn)程運(yùn)行前就要求知道其所需資源的最大數(shù)量 要求進(jìn)程是無(wú)關(guān)的,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 縱隔占位影像診斷
- 工廠承包貨柜方案簡(jiǎn)單
- 原料檢驗(yàn)面試題及答案
- 醫(yī)院感染病例報(bào)告制度與流程
- 腦卒中康復(fù)面試題及答案
- 貨物類投標(biāo)技術(shù)方案
- 首都機(jī)場(chǎng)考試題庫(kù)及答案
- 機(jī)構(gòu)對(duì)外宣傳方案模板
- 小兒結(jié)核病護(hù)理
- 酒店培訓(xùn)內(nèi)容課件
- 火龍罐綜合灸技術(shù)
- 盤扣式卸料平臺(tái)計(jì)算書(shū)
- 體育訓(xùn)練館維修改造工程鋼結(jié)構(gòu)網(wǎng)架屋面施工組織設(shè)計(jì)
- 廣州市歲以下嬰幼兒照護(hù)服務(wù)工作管理業(yè)務(wù)培訓(xùn)考試試題附有答案
- 電化學(xué)儲(chǔ)能黑啟動(dòng)技術(shù)導(dǎo)則
- 《微電影創(chuàng)作》課程標(biāo)準(zhǔn)(含課程思政)
- 人教版小學(xué)3-6年級(jí)英語(yǔ)單詞表-已A4排版-可直接打印
- 前列腺增生病人的健康宣教
- 美甲課程培訓(xùn)課件模板
- 《最好的鄰居》教學(xué)設(shè)計(jì)
- 樁基鋼筋籠的機(jī)器人化施工技術(shù)研究
評(píng)論
0/150
提交評(píng)論