计算机操作系统——死锁(产生的必要条件与处理死锁的四个关卡)
計算機操作系統——死鎖
前言:死鎖:指多個進程因競爭共享資源而造成的一種僵局,若無外力作用,這些進程都將永遠不能再向前推進。如果死鎖發生,會浪費大量的系統資源,甚至會導致系統崩潰。
關于死鎖的結論:
一、死鎖產生的必要條件
1. 互斥條件
進程對所分配到的資源進行排它性使用,即在一段時間內,某資源只能被一個進程所占用。如果此時還有其他進程請求該資源,則請求進程只能等待,直至占有該資源的進程用完并釋放資源。
2. 請求和保持條件
進程已經保持了至少一個資源,但又提出新的資源請求,而該進程已經被其他進程占有,此時進行請求的進程將被阻塞,進入阻塞隊列,但是對自己已經獲得的資源保持不放。
3. 不可搶占條件
進程已獲得的資源在未使用之前不能被搶占,只能在進程使用完時由自己釋放。
4. 循環等待條件
在發生死鎖時,必然存在一個進程–資源的循環鏈,即進程集合{P0,P1,…,Pn}中的P0正在等待一個P1占用的資源,P1正在等待P2占用的資源,…,Pn正在等待已被P0占用的資源。
二、處理死鎖的方法
1. 預防死鎖
(1)破壞“請求和保持”條件
(2)破壞“不可搶占”條件
可剝奪資源:即當某進程新的資源未滿足,釋放已占有的資源
(3)破壞“循環等待”條件
資源有序分配法:系統給每類資源賦予一個編號,每一個進程按編號遞增的順序請求資源,釋放則相反。
2. 避免死鎖
利用銀行家算法避免死鎖。Dijkstra的銀行家算法,原本是為銀行系統設計的,以確保銀行在發放現金貸款時,不會發生不能滿足所有客戶需要的情況。
為實現銀行家算法,每一個新進程在進系統時,它必須申明在運行過程中,可能需要每種資源類型的最大單元數目,其數目不應超過系統所擁有的資源總量。當進程請求一組資源時,系統必須首先確定是否有足夠的資源分配給該進程。如果有,再進一步運算將資源分配給該進程后,是否會使系統處于不安全狀態。如果不會,才將資源分配給該進程。
銀行家算法中的數據結構:
(1)可利用資源向量Available
代表可利用的資源數目。
(2)最大需求矩陣Max
代表各進程對各類資源的最大需求。
(3)分配矩陣Allocation
代表各進程當前已分配的各類資源數目。
(4)需求矩陣Need 代表各進程尚需要的各類資源數目。最大需求矩陣減去分配矩陣(Need[i,j] = Max[i,j] - Allocation[i,j])
銀行家算法的過程:
銀行家算法例題:
3. 檢測死鎖
為了能對系統中是否發生了死鎖進行檢測,在系統中必須:保存有關資源的請求和分配信息;提供一種算法,它利用這些信息來檢測系統是否已經進入死鎖狀態。
安全性算法:
設置兩個向量
a.工作向量Work:提供給進程繼續運行所需的各類資源數目。它含有m個元素,在安全算法開始時Work = Available
b.Finash:它表示系統是否有足夠的資源分配給進程,使之運行完成。開始時,先令Finish[i] = false;當有足夠資源分配給進程時,再令Finish[i] = true;
4. 解除死鎖
當發現有進程死鎖后,便應立即把它從死鎖狀態中解脫出來,常用的方法:
(1)剝奪(搶占)資源法:從其它進程剝奪足夠數量的資源給死鎖進程,以解除死鎖狀態。
(2)撤銷(終止)進程法:可以直接撤銷死鎖進程或撤銷代價最小的進程,直至有足夠的資源可用,死鎖狀態消除為止;所謂的代價是指優先級、運行代價、進程的重要性和價值等。
(3)進程回退法:需要設置還原點,讓一個或多個死鎖進程回退到足夠避免死鎖的地步。
總結
以上是生活随笔為你收集整理的计算机操作系统——死锁(产生的必要条件与处理死锁的四个关卡)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--字符串压缩
- 下一篇: 第二章 物理层 1 物理层的基本概念 [