一、靜態策略:預防死鎖
1)破壞互斥條件
互斥條件:只有對必須互斥使用的資源的爭搶纔會導致死鎖
破壞互斥條件:
如果把只能互斥使用的資源改造成允許共享使用,則系統不會進入死鎖狀態。
比如SPOOLing技術可以把獨佔設備在邏輯上改造成共享設備。
該策略的缺點:並不是所有的資源都可以改造成可以共享使用的資源。並且爲了系統安全,很多地方還必須保護這種互斥性。因此,很多時候無法破壞互斥條件
2)破壞不剝奪條件
不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放
破壞不剝奪條件:
方案一:當某個進程請求新資源得不到滿足時,它必須立即釋放保持的所有資源,待以後需要時再重新申請。也就是說,即使某些資源還沒有使用完,也需要主動釋放,從而破壞了不可剝奪條件
方案二:當某個進程需要的資源被其它進程所佔有時,可以由操作系統協助,將想要的資源強行剝奪。這種方式一般需要考慮各個進程的優先級(比如:剝奪調度方式,就是將處理機資源強行剝奪給優先級更高的進程使用)
缺點:
1、實現起來比較複雜,
2、釋放已經獲得的資源可能造成前一段工作的失效。因此這種方法一般只使用於易保存和恢復狀態的資源,如CPU。
3、反覆的申請和釋放資源會增加系統開銷,降低系統吞吐量。
4、如果採用方案一,只要暫時得不到某個資源,之前獲得的那些資源都需要放棄,以後在重新申請。如果一直髮生這樣的情況,就會導致進程飢餓。
3)破壞請求和保持條件
請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其它進程佔有,此時請求進程被阻塞,但又對自己已有的資源保持不放
可以採用靜態分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前,不讓它投入運行。一旦投入運行後,這些資源就一直歸它所有,該進程不會再請求任何資源了
該策略實現簡單,但也有明顯的缺點:
有些資源可能只需要很短的時間,因此如果進程整個運行期間都一直保持所有資源,就會造成嚴重的資源浪費,資源利用率低。另外,該策略也有可能導致某些進程飢餓
4)破壞循環等待條件
循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程所請求
可以採用順序資源分配法:首先給系統中資源編號,規定每個進程必須按編號遞增的順序請求資源,同類資源(編號相同的資源)一次申請完
原理分析:一個進程只有已佔有小編號的資源時,纔有資格申請更大編號的資源。按此規則,已經持有大編號的資源不可能逆向地回來申請小編號的資源,從而就不會產生循環等待現象
缺點:
1、不方便增加新的設備,因爲可能需要重新分配所有的編號;
2、進程實際使用資源的順序可能和編號遞增順序不一致,會導致資源浪費;
3、必須按規定申請資源,用戶編程麻煩