死鎖核心概念
1.什麼是死鎖
在多個併發進程中,互相佔用對方資源,
死鎖是指兩個或兩個以上的進程在執行過程中,由於競爭資源或者由於彼此通信而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的進程稱爲死鎖進程
產生條件
如果在一個系統中以下四個條件同時成立,那麼就能引起死鎖:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
我們強調所有四個條件必須同時成立纔會出現死鎖。循環等待條件意味着佔有並等待條件,這樣四個條件並不完全獨立。
解決死鎖的策略
- 採用靜態資源分配方法 -----預防死鎖
- 採用有控資源分配方法 -----避免死鎖
- 死鎖的檢測與忽略
處理死鎖的思路如下:
預防死鎖:破壞四個必要條件中的一個或多個來預防死鎖
避免死鎖:在資源動態分配的過程中,用某種方式防止系統進入不安全的狀態。
檢測死鎖:運行時產生死鎖,及時發現死鎖,將程序解脫出來。
解除死鎖:發生死鎖後,撤銷進程,回收資源,分配給正在阻塞狀態的進程。
預防死鎖的辦法:
破壞請求和保持條件:1.一次性的申請所有資源。之後不在申請資源,如果不滿足資源條件則得不到資源分配。2.只獲得初期資源運行,之後將運行完的資源釋放,請求新的資源。
破壞不可搶佔條件:當一個進程獲得某種不可搶佔資源,提出新的資源申請,若不能滿足,則釋放所有資源,以後需要,再次重新申請。
破壞循環等待條件:對資源進行排號,按照序號遞增的順序請求資源。若進程獲得序號高的資源想要獲取序號低的資源,就需要先釋放序號高的資源。
死鎖的解除辦法:
1、搶佔資源。從一個或多個進程中搶佔足夠數量的資源,分配給死鎖進程,以解除死鎖狀態。
2、終止(撤銷)進程:將一個或多個死鎖進程終止(撤銷),直至打破循環環路,使系統從死鎖狀態解脫
銀行家算法
爲銀行發放現金貸款時不會發生不能滿足客戶需要的情況,後續用在操作系統中避免死鎖
核心思想:
如果進程提出資源申請時,這次分配會導致系統不安全,就暫時不答應,讓它先等着
一共10個資源
進程 | 已佔用 | 還需 | 可分配 |
---|---|---|---|
p1 | 4 | 4 | X |
p2 | 2 | 2 | √ |
p3 | 2 | 7 | X |
因爲如果剩下兩個資源不分配給p2,也是不足緩解p1和p3的壓力和貪心,還是會導致線程阻塞,
所以先給滿足的,而且安全的人,然後它用完就會歸還
這時候歸還了,系統資源剩4個
進程 | 已佔用 | 還需 | 可分配 |
---|---|---|---|
p1 | 4 | 4 | √ |
p2 | 0 | 0 | 無需分配 |
p3 | 2 | 7 | X |
這樣就分配給p1 4個資源,再歸還,就有8個資源,完全滿足p3的需要
這個有點像貪心的分支,誰滿足就給誰,然後繼續算剩下的
ps:每一輪都是從序號小的進程開始檢查分配**