關於死鎖的一些知識點總結

2021-08-01 22:27:27 字數 2007 閱讀 2837

死鎖產生的原因

系統資源的競爭。

通常系統中擁有的不可剝奪資源,其數量不足以滿足多個程序執行的需要,使得程序在 執行過程中,會因爭奪資源而陷入僵局,如磁帶機、印表機等。只有對不可剝奪資源的競爭 才可能產生死鎖,對可剝奪資源的競爭是不會引起死鎖的

程序推進順序非法。

程序在執行過程中,請求和釋放資源的順序不當,也同樣會導致死鎖。例如,併發程序 p1、p2分別保持了資源r1、r2,而程序p1申請資源r2,程序p2申請資源r1時,兩者都 會因為所需資源被占用而阻塞。

訊號量使用不當也會造成死鎖。程序間彼此相互等待對方發來的訊息,結果也會使得這 些程序間無法繼續向前推進。例如,程序a等待程序b發的訊息,程序b又在等待程序a 發的訊息,可以看出程序a和b不是因為競爭同一資源,而是在等待對方的資源導致死鎖。

資源分配不當等。

5.

死鎖產生的必要條件

互斥條件:程序要求對所分配的資源(如印表機)進行排他性控制,即在一段時間內某 資源僅為乙個程序所占有。此時若有其他程序請求該資源,則請求程序只能等待。

不剝奪條件:程序所獲得的資源在未使用完畢之前,不能被其他程序強行奪走,即只能 由獲得該資源的程序自己來釋放(只能是主動釋放)。

請求和保持條件:程序已經保持了至少乙個資源,但又提出了新的資源請求,而該資源 已被其他程序占有,此時請求程序被阻塞,但對自己已獲得的資源保持不放。

迴圈等待條件:存在一種程序資源的迴圈等待鏈,鏈中每乙個程序已獲得的資源同時被 鏈中下乙個程序所請求。即存在乙個處於等待狀態的程序集合,其中pi等 待的資源被p(i+1)占有(i=0, 1, …, n-1),pn等待的資源被p0占有

死鎖預防

防止死鎖的發生只需破壞死鎖產生的四個必要條件之一即可。

死鎖避免

避免死鎖同樣是屬於事先預防的策略,但並不是事先釆取某種限制措施破壞死鎖的必要條件,而是在資源動態分配過程中,防止系統進入不安全狀態,以避免發生死鎖。這種方法所施加的限制條件較弱,可以獲得較好的系統效能。包括(系統安全檢測,銀行家演算法)。

死鎖檢測

系統死鎖,可利用資源分配圖來描述。如下圖所示,用圓圈代表乙個程序,用框代表一類資源。由於一種型別的資源可能有多個,用框中的乙個點代表一類資源中的乙個資源。從程序到資源的有向邊叫請求邊,表示該程序申請乙個單位的該類資源;從資源到程序的邊叫分配邊,表示該類資源已經有乙個資源被分配給了該程序。在下圖所示的資源分配圖中,程序p1已經分得了兩個r1資源,並又請求乙個r2 資源;程序p2分得了乙個r1和乙個r2資源,並又請求乙個r1資源。

可以通過將資源分配圖簡化的方法來檢測系統狀態s是否為死鎖狀態。簡化方法如下:

1) 在資源分配圖中,找出既不阻塞又不是孤點的程序pi(即找出一條有向邊與它相連,且該有向邊對應資源的申請數量小於等於系統中已有空閒資源數量。若所有的連線該程序的邊均滿足上述條件,則這個程序能繼續執行直至完成,然後釋放它所占有的所有資源)。消去它所有的請求邊和分配邊,使之成為孤立的結點。在圖(a)中,p1是滿足這一條件的程序結點,將p1的所有邊消去,便得到圖(b)所示的情況。

2) 程序pi所釋放的資源,可以喚醒某些因等待這些資源而阻塞的程序,原來的阻塞程序可能變為非阻塞程序。在圖2-17中,程序p2就滿足這樣的條件。根據第1) 條中的方法進行一系列簡化後,若能消去圖中所有的邊,則稱該圖是可完全簡化的,如圖(c)所示。

s為死鎖的條件是當且僅當s狀態的資源分配圖是不可完全簡化的,該條件為死鎖定理。

死鎖的解除

一旦檢測出死鎖,就應立即釆取相應的措施,以解除死鎖。死鎖解除的主要方法有:

1) 資源剝奪法。掛起某些死鎖程序,並搶占它的資源,將這些資源分配給其他的死鎖程序。但應防止被掛起的程序長時間得不到資源,而處於資源匱乏的狀態。

2) 撤銷程序法。強制撤銷部分、甚至全部死鎖程序並剝奪這些程序的資源。撤銷的原則可以按程序優先順序和撤銷程序代價的高低進行。

一些知識點總結

mysql資料庫中varchar和char的區別 1 varchar的長度是可變的,char的長度不可變。2 儲存時,char型別的資料要比varchar型別的資料速度更快,因為其長度固定,方便儲存於查詢。3 從儲存空間的角度講,因為插入型別資料的長度固定,有時候需要用空格進行佔位,所以儲存資料時占...

一些js知識點總結

1.函式宣告與函式表示式 解析器在像執行環境中載入資料時,會先讀取函式宣告,並使其在執行任何 之前都可以訪問,對於函式表示式,必須等到解析器執行到它所在的 行,才會真正被執行。例 alert sum 10,10 function sum n,m 以上 可以正常執行,因為解析器通過函式宣告提公升的過程...

關於演算法的一些知識點

set 不能用來計數,只能用來判斷是否存在這個string。include setstr 新增數值 str.insert str new set 預設是從小到大排序 兩個int插入用法,按照第乙個數值排序。set s 訪問第乙個值 s.begin 如果是雙int int start,end star...