操作系统之死锁
死鎖的概念以及產(chǎn)生死鎖的原因
一組進程中,每個進程都無限等待被該組進程中另一進程所占有的資源,因而永遠無法得到的資源,這種現(xiàn)象稱為進程死鎖,這一組進程就稱為死鎖進程,如果死鎖發(fā)生,會浪費大量系統(tǒng)資源,甚至導致系統(tǒng)崩潰。
死鎖產(chǎn)生的必要條件
產(chǎn)生死鎖必須同時滿足以下四個條件,只要其中任一條件不成立,死鎖就不會發(fā)生。
- 互斥條件:進程要求對所分配的資源(如打印機)進行排他性控制,即在一段時間內(nèi)某 資源僅為一個進程所占有。此時若有其他進程請求該資源,則請求進程只能等待。
- 不剝奪條件:進程所獲得的資源在未使用完畢之前,不能被其他進程強行奪走,即只能 由獲得該資源的進程自己來釋放(只能是主動釋放)。
- 請求和保持條件:進程已經(jīng)保持了至少一個資源,但又提出了新的資源請求,而該資源 已被其他進程占有,此時請求進程被阻塞,但對自己已獲得的資源保持不放。
- 循環(huán)等待條件:存在一種進程資源的循環(huán)等待鏈,鏈中每一個進程已獲得的資源同時被 鏈中下一個進程所請求
解決死鎖的方法
死鎖預防和死鎖避免
死鎖預防
防止死鎖的發(fā)生只需破壞死鎖產(chǎn)生的四個必要條件之一即可。
1) 破壞互斥條件
如果允許系統(tǒng)資源都能共享使用,則系統(tǒng)不會進入死鎖狀態(tài)。但有些資源根本不能同時訪問,如打印機等臨界資源只能互斥使用。所以,破壞互斥條件而預防死鎖的方法不太可行,而且在有的場合應該保護這種互斥性。
2) 破壞不剝奪條件
當一個已保持了某些不可剝奪資源的進程,請求新的資源而得不到滿足時,它必須釋放已經(jīng)保持的所有資源,待以后需要時再重新申請。這意味著,一個進程已占有的資源會被暫時釋放,或者說是被剝奪了,或從而破壞了不可剝奪條件。
該策略實現(xiàn)起來比較復雜,釋放已獲得的資源可能造成前一階段工作的失效,反復地申請和釋放資源會增加系統(tǒng)開銷,降低系統(tǒng)吞吐量。這種方法常用于狀態(tài)易于保存和恢復的資源,如CPU的寄存器及內(nèi)存資源,一般不能用于打印機之類的資源。
3) 破壞請求和保持條件
釆用預先靜態(tài)分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前,不把它投入運行。一旦投入運行后,這些資源就一直歸它所有,也不再提出其他資源請求,這樣就可以保證系統(tǒng)不會發(fā)生死鎖。
這種方式實現(xiàn)簡單,但缺點也顯而易見,系統(tǒng)資源被嚴重浪費,其中有些資源可能僅在運行初期或運行快結束時才使用,甚至根本不使用。而且還會導致“饑餓”現(xiàn)象,當由于個別資源長期被其他進程占用時,將致使等待該資源的進程遲遲不能開始運行。
4) 破壞循環(huán)等待條件
為了破壞循環(huán)等待條件,可釆用順序資源分配法。首先給系統(tǒng)中的資源編號,規(guī)定每個進程,必須按編號遞增的順序請求資源,同類資源一次申請完。也就是說,只要進程提出申請分配資源Ri,則該進程在以后的資源申請中,只能申請編號大于Ri的資源。
這種方法存在的問題是,編號必須相對穩(wěn)定,這就限制了新類型設備的增加;盡管在為資源編號時已考慮到大多數(shù)作業(yè)實際使用這些資源的順序,但也經(jīng)常會發(fā)生作業(yè)使甩資源的順序與系統(tǒng)規(guī)定順序不同的情況,造成資源的浪費;此外,這種按規(guī)定次序申請資源的方法,也必然會給用戶的編程帶來麻煩。
死鎖避免
避免死鎖同樣是屬于事先預防的策略,但并不是事先釆取某種限制措施破壞死鎖的必要條件,而是在資源動態(tài)分配過程中,防止系統(tǒng)進入不安全狀態(tài),以避免發(fā)生死鎖。這種方法所施加的限制條件較弱,可以獲得較好的系統(tǒng)性能。
1. 系統(tǒng)安全狀態(tài)
避免死鎖的方法中,允許進程動態(tài)地申請資源,但系統(tǒng)在進行資源分配之前,應先計算此次資源分配的安全性。若此次分配不會導致系統(tǒng)進入不安全狀態(tài),則將資源分配給進程; 否則,讓進程等待。
所謂安全狀態(tài),是指系統(tǒng)能按某種進程推進順序( P1, P2, …, Pn),為每個進程Pi分配其所需資源,直至滿足每個進程對資源的最大需求,使每個進程都可順序地完成。此時稱 P1, P2, …, Pn 為安全序列。如果系統(tǒng)無法找到一個安全序列,則稱系統(tǒng)處于不安全狀態(tài)。
假設系統(tǒng)中有三個進程P1、P2和P3,共有12 臺磁帶機。進程P1總共需要10臺磁帶機,P2和P3 分別需要4臺和9臺。假設在T0時刻,進程P1、P2 和P3已分別獲得5合、2臺和2臺,尚有3臺未分配,見表2-15。
則在T0時刻是安全的,因為存在一個安全序列P2、Pl、P3,即只要系統(tǒng)按此進程序列分配資源,則每個進程都能順利完成。若在T0時刻后,系統(tǒng)分配1臺磁帶機給P3,則此時系統(tǒng)便進入不安全狀態(tài),因為此時已無法再找到一個安全序列。
并非所有的不安全狀態(tài)都是死鎖狀態(tài),但當系統(tǒng)進入不安全狀態(tài)后,便可能進入死鎖狀態(tài);反之,只要系統(tǒng)處于安全狀態(tài),系統(tǒng)便可以避免進入死鎖狀態(tài)。
2. 銀行家算法
銀行家算法是最著名的死鎖避免算法。它提出的思想是:把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。
死鎖的檢測和解除
總結
- 上一篇: 吴恩达斯坦福大学机器学习 CS229 课
- 下一篇: Android之多线程断点下载