先給出概念
死鎖:
一組進程中,每個進程都無限等待被改組進程中另一進程所占有的資源,因而永遠無法得到資源,這種現象稱為進程四艘
,這一組進程稱為死鎖進程
活鎖:
先加鎖,再輪詢(忙等待),進程可以上CPU,時間配額用完后下CPU,既無進展也沒有阻塞
飢餓:
由於資源分配策略問題導致某個進程永遠無法上CPU運行
死鎖產生的必要條件:
互斥使用:
一個資源每次只能給一個進程使用
占有且等待:
或稱為請求和保持,進程在申請新的資源的同時保持對原有資源的占有
不可搶占:
或稱為不可剝奪,資源申請者不能強行從占有者手中奪取資源,只能由占有者自願釋放
循環等待:
存在一個進程等待的隊列,形成一個進程等待環路
死鎖的解決方案:
第一種是不考慮此問題,俗稱鴕鳥算法,鴕鳥在傷害來的時候,直接把頭埋進沙子的做法
第二種是不讓死鎖發生,又分為2種
一種是死鎖預防,通過設計合適的資源分配算法,不讓死鎖發生,這是一種靜態策略
一種是死鎖避免,以不讓死鎖發生為目標,跟蹤並評估資源分配的過程,根據評估結果決策是否分配,這是動態策略
死鎖預防的幾種做法:死鎖發生需要4個必要條件,所以只要破壞其中一種就可以預防死鎖
第1種:互斥使用。做法是獨占資源變為共享資源,如"守護進程/線程"(daemon)
第2種:占有且等待。有2種做法,第(1)種是每個進程運行前必須一次性申請所要求的的所有資源,且資源都滿足時才給予一次性分配,這樣會導
致資源利用率低,以及"飢餓現象";第(2)種是每個進程在申請新的資源不能立即得到滿足而變為等待狀態之前,必須釋放已占有的全部資源,再需
要時則重新申請,這樣也可能導致飢餓現象,且下次申請時,資源的狀態可能已經改變
第3種:不可搶占。這個一般是CPU和內存用到,不講
第4種:循環等待。將系統中的所有資源編號,進程在申請資源時嚴格按照編號遞增的次序進行,否則不予分配,通常按照資源使用的頻繁性,常用
的放在前面
死鎖避免:銀行家算法,最后一個進程申請資源的時候如果將產生死鎖,不予分配
第三種是讓死鎖發生,通過死鎖檢測和解除來解決問題
死鎖檢測是通過操作系統不斷監視系統進展情況來判斷死鎖是否真的發生,一旦發生,接觸死鎖並以最小的代價恢復運行
檢測時機:定時檢測或系統資源利用率下降時檢測死鎖
死鎖檢測算法的簡單實現:首先每個進程,每個資源指定唯一的編號;建立一張資源分配表記錄各進程與其占用的資源的關系;建立一張資源申請表,
記錄各進程與其需要申請的資源的關系,以某個進程開始為起點,查找是否存在一個最終自我等待的環路
解除方案:原則是以最小代價恢復系統的運行,一般有如下方式
撤銷所有死鎖進程(代價大)
進程回退再啟動(Roll back),需要記錄大量中間點,開銷大
按照某種原則逐一撤銷死鎖進程,比如Mysql的最少占用鎖的進程回滾策略
按照某種原則逐一搶占資源
哲學家就餐問題