1. 程式人生 > >死鎖、死鎖的四個必要條件、死鎖預防、死鎖避免和銀行家演算法及解題過程

死鎖、死鎖的四個必要條件、死鎖預防、死鎖避免和銀行家演算法及解題過程

死鎖:

死鎖是指多個程序因競爭資源而造成的一種僵局(互相等待),每個程序都在等待某個事件發生,而只有這組程序中的其他程序才能觸發該事件,這就稱這組程序發生了死鎖。若無外力作用,這些程序都將無法向前推進。

如,在某一個計算機系統中只有一臺印表機和一臺輸入 裝置,程序P1正佔用輸入裝置,同時又提出使用印表機的請求,但此時印表機正被程序P2 所佔用,而P2在未釋放印表機之前,又提出請求使用正被P1佔用著的輸入裝置。這樣兩個程序相互無休止地等待下去,均無法繼續執行,此時兩個程序陷入死鎖狀態。

死鎖產生的原因:

系統資源的競爭;程序執行推進順序不合適。

產生死鎖的四個必要條件:

互斥條件:

一個資源每次只能被一個程序使用,即在一段時間內某 資源僅為一個程序所佔有。此時若有其他程序請求該資源,則請求程序只能等待。

請求與保持條件:

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

不可剝奪條件:

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

迴圈等待條件: 

若干程序間形成首尾相接迴圈等待資源的關係

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立,而只要上述條件之一不滿足,就不會發生死鎖。

死鎖預防(確保系統永遠不會進入死鎖狀態):

只要這四個條件中至少有一個條件得不到滿足,就不可能發生死鎖了。由於互斥條件是非共享資源所必須的,不僅不能改變,還應加以保證,所以,我們只能破壞產生死鎖的其他三個條件。

破壞“佔有且等待”條件:

方法1:所有的程序在開始執行之前,必須一次性地申請其在整個執行過程中所需要的全部資源。

優點:簡單易實施且安全。

缺點:因為某項資源不滿足,程序無法啟動,而其他已經滿足了的資源也不會得到利用,嚴重降低了資源的利用率,造成資源浪費。

方法2:該方法是對第一種方法的改進,允許程序只獲得執行初期需要的資源,便開始執行,在執行過程中逐步釋放掉分配到的已經使用完畢的資源,然後再去請求新的資源。這樣的話,資源的利用率會得到提高,也會減少程序的飢餓問題。

破壞“不可搶佔”條件:

當一個已經持有了一些資源的程序在提出新的資源請求沒有得到滿足時,它必須釋放已經保持的所有資源,待以後需要使用的時候再重新申請。這就意味著程序已佔有的資源會被短暫地釋放或者說是被搶佔了。

該種方法實現起來比較複雜,且代價也比較大。釋放已經保持的資源很有可能會導致程序之前的工作實效等,反覆的申請和釋放資源會導致程序的執行被無限的推遲,這不僅會延長程序的週轉週期,還會影響系統的吞吐量。

破壞“迴圈等待”條件:

可以通過定義資源型別的線性順序來預防,可將每個資源編號,當一個程序佔有編號為i的資源時,那麼它下一次申請資源只能申請編號大於i的資源。如圖所示:

這樣雖然避免了迴圈等待,但是這種方法是比較低效的,資源的執行速度回變慢,並且可能在沒有必要的情況下拒絕資源的訪問,比如說,程序c想要申請資源1,如果資源1並沒有被其他程序佔有,此時將它分配個程序c是沒有問題的,但是為了避免產生迴圈等待,該申請會被拒絕,這樣就降低了資源的利用率。

死鎖避免(在使用資源前進行判斷,只允許不會產生死鎖的程序申請資源):

系統對程序發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源,如果分配後系統可能發生死鎖,則不予分配,否則予以分配,這是一種保證系統不進入死鎖狀態的動態策略。如果作業系統能保證所有程序在有限時間內得到需要的全部資源,則系統處於安全狀態,否則系統是不安全的。

安全狀態:

如果系統存在 由所有的安全序列{P1,P2,…Pn},則系統處於安全狀態。一個程序序列是安全的,如果對其中每一個程序Pi(i >=1 && i <= n)他以後尚需要的資源不超過系統當前剩餘資源量與所有程序Pj(j < i)當前佔有資源量之和,系統處於安全狀態則不會發生死鎖。

不安全狀態

如果不存在任何一個安全序列,則系統處於不安全狀態。

銀行家演算法:

銀行家演算法通過對程序需求、佔有和系統擁有資源的實時統計,確保系統在分配給程序資源不會造成死鎖才會給與分配。

可利用資源向量Available:

用於表示系統裡邊各種資源剩餘的數目。由於系統裡邊擁有的資源通常都是有很多種(假設有m種),所以,我們用一個有m個元素的陣列來表示各種資源。陣列元素的初始值為系統裡邊所配置的該類全部可用資源的數目,其數值隨著該類資源的分配與回收動態地改變。

最大需求矩陣Max:

用於表示各個程序對各種資源的額最大需求量。程序可能會有很多個(假設為n個),那麼,我們就可以用一個nxm的矩陣來表示各個程序多各種資源的最大需求量

分配矩陣Allocation:

就是用於表示已經分配給各個程序的各種資源的數目。也是一個nxm的矩陣。

需求矩陣Need:

用於表示程序仍然需要的資源數目,用一個nxm的矩陣表示。程序的最大需求Max減去已經分配給程序的數目Allocation,就得到了程序仍然需要的資源數目了。

題目解題過程舉例:

有5個程序從p0到p4,有3個資源型別A(共10個),B(共5個),C(共7個)

在T0時刻有:


答案分析:

初始時,Work:= Available,Need:=Max-Allocation。

然後看P2不滿足Work>=Need,P3滿足條件Work>=Need,P1行求得(藍色)。以此類推,P4也可以求出。之後又從頭開始遍歷,依次完成P0,P2。開始時Work=Available=(3,3,2)我們可以看到Need P1 P3 資源可以滿足 Work>=Need,從演算法遍歷執行的順序可知,先P1行求得(紅字),work=(5,3,2)

當完成後,finish都為true表示,系統處於安全狀態。如下圖:

最終銀行家演算法的算出的安全序列為 <P1,P3,P4,P0,P2>。系統處於安全狀態。

相關推薦

必要條件預防避免銀行家演算法解題過程

死鎖: 死鎖是指多個程序因競爭資源而造成的一種僵局(互相等待),每個程序都在等待某個事件發生,而只有這組程序中的其他程序才能觸發該事件,這就稱這組程序發生了死鎖。若無外力作用,這些程序都將無法向前推進。 如,在某一個計算機系統中只有一臺印表機和一臺輸入 裝置,程序P1正佔

必要條件預防檢測避免解除

死鎖: 我們先來思考一個問題:我們加鎖以後,再次進行加鎖,這樣會發生什麼? 當我們第二次申請鎖的時候,這個時候鎖已經被佔用了,該執行緒就會被掛起,但是剛好這個執行緒就是擁有鎖的執行緒了,那麼這個執行緒就永遠掛起等待了,這個我們就叫死鎖。 1.死鎖發生的情形: (1)一個執

9.的概念導致的原因,導致必要條件預防的方法避免的方法

死鎖避免策略      銀行家演算法:首先需要定義狀態和安全狀態的概念。系統的狀態是當前給程序分配的資源情況。因此,狀態包含兩個向量Resource(系統中每種資源的總量)和Available(未分配給程序的每種資源的總量)及兩個矩陣Claim(表示程序對資源的需求)和Allocation(表示當前分配給程

什麽是,簡述發生的必要條件,如何避免預防

競爭 時間 鎖死 分配 獲得 進程 發生 未使用 例如 什麽是死鎖 死鎖是指多個進程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。例如,在某一個計算機系統中只有一臺打印機和一臺輸入 設備,進程P1正占用輸入設備,同時又提出使用打印機的請求,

產生的原因必要條件

一. 什麼是死鎖?      如果一個程序集合裡面的每個程序都在等待這個集合中的其他一個程序(包括自身)才能繼續往下執行,若無外力他們將無法推進,這種情況就是死鎖,處於死鎖狀態的程序稱為死鎖程序 二. 死鎖產生的原因? 1.因競爭資源發生死鎖 現象:系統中供多個程序

什麼是,簡述發生的必要條件,如何避免預防

什麼是死鎖 死鎖是指多個程序因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些程序都將無法向前推進。例如,在某一個計算機系統中只有一臺印表機和一臺輸入 裝置,程序P1正佔用輸入裝置,同時又提出使用印表機的請求,但此時印表機正被程序P2 所佔用,而P

必要條件解決辦法

這樣雖然避免了迴圈等待,但是這種方法是比較低效的,資源的執行速度回變慢,並且可能在沒有必要的情況下拒絕資源的訪問,比如說,程序c想要申請資源1,如果資源1並沒有被其他程序佔有,此時將它分配個程序c是沒有問題的,但是為了避免產生迴圈等待,該申請會被拒絕,這樣就降低了資源的利用率

產生的原因必要條件(2017騰訊實習生題目)

產生死鎖的原因主要是:(1) 因為系統資源不足。(2) 程序執行推進的順序不合適。(3) 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則 就會因爭奪有限的

程式的原因必要條件

產生死鎖的原因主要是:(1) 因為系統資源不足。(2) 程序執行推進的順序不合適。(3) 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。產生死鎖的

產生死必要條件

互斥條件:程序對所分配到的資源進行排他性使用,即在一段時間內某資源只有一個程序佔用。 請求和保持條件:程序已經保持了至少一個資源但又提出了新的資源請求,若得不到滿足則阻塞該程序,但其保持已獲得的資源不釋放。 不剝奪條件:程序已獲得的資源,在未使用完之前,不能被剝奪,只能在使用完時由自己釋放。 環路等待條

作業系統-程序(7)銀行家演算法

允許多個程序併發執行共享系統資源時,系統必須提供同步機制和程序通訊機制。然而,對這種機制使用不當的話,可能會出現程序永遠被阻塞的現象。例如,兩個程序分別等待對方佔有的一個資源,於是兩者都不能執行而處於永遠等待,這種現象稱為死鎖。 死鎖產生的四個必要條件: 互斥條件: 程序應互斥使用資源,任一時刻一個資源僅

程序條件銀行家演算法

1、死鎖:在計算機系統中有許多互斥資源(如印表機)或軟體資源(如臨界區),若兩個程序同時使用印表機,或者同時進入臨界區必然會出現問題。所謂死鎖,是指兩個以上的程序互相都要求對方已經佔有的資源導致無法繼續執行下去的現象。 2、死鎖產生的必要條件: (1)互斥條件:即一個資源每次只能被一個程序使用,在作業

避免銀行家演算法

概念 Dijksta提出(1965): 仿照銀行家發放貸款時採取的控制方式而設計的一種死鎖避免演算法。 應用條件 固定數量的程序中共享數量固定額資源 每個程序預先制定完成工作所需的最大資源

Mysql數據庫四大特性事物的隔離基本MySQL語句獨立表空間

mysql數據庫四大特性、事物的四個隔離、基本mysql語句、獨立表空間Mysql數據庫四大特性、事物的四個隔離、基本MySQL語句、獨立表空間 本人學習mysql的時候感覺筆記有點散所以自己做了一個整合,而且有些概念介紹的太官方了,所以自己根據理解總結了一下。(有不對的請指點!) mysql:sql:關系型

淺談JavaScriptjQueryAJAXJSON 這之間的關系

quest sig 出現 情況 put 自己 工具庫 mis ava 1. JavaScript JavaScript(簡稱js)是一種主要運行於瀏覽器中的弱類型的動態腳本語言,可以用來實現網頁上的一些高級功能,如數據驗證處理、頁面動態效果、定時任務、與用戶交互、發送/接收

人機猜拳 (玩家電腦遊戲測試)類寫法

猜拳 har play system.in 寫法 code ext imp com 第一個類,玩家類: import java.util.Scanner; /** * 創建玩家類 */ public class Person { Scanner input =

MySQL InnoDB事務級別 與 髒讀不重複讀幻讀

1、MySQL InnoDB事務隔離級別髒讀、可重複讀、幻讀 MySQL InnoDB事務的隔離級別有四級,預設是“可重複讀”(REPEATABLE READ)。 ·        1).未提交讀(READUNCOMMITTED)。另一個事務修改了資料,但尚未提交,而本事

事務事務的特性

  現實生活中,我們往往經常會進行轉賬操作,轉賬操作可以分為兩部分來完成,轉入和轉出。只有這兩部分都完成了才可以認為是轉賬成功。在資料庫中,這個過程是使用兩條語句來完成的,如果其中任意一條語句出現了異常沒有執行,則會導致兩個賬號的金額不同步,造成錯誤。  為了防止上面可能出現的情況,MySQL引入了事務,所謂

執行緒順序控制:執行緒ABCD向檔案寫入資料。要求A執行緒只寫入A,B執行緒只寫入B……

四個執行緒A、B、C、D向四個檔案寫入資料。要求A執行緒只寫入A,B執行緒只寫入B…… 最終達到的效果: A.txt內容為: A    B     C    D  &nbs

JavaScriptjQueryAJAXJSON 這之間的關係?

感謝於江水授權我將此文章釋出到公眾號。 有一天,你們人類不滿足網頁只是一些文字和圖片的展示,希望頁面上可以有更多功能。比如點選一個按鈕,彈一個視窗或者改變頁面上某些內容。為了實現這種功能,就創造了一門指令碼語言,逐步升級演化成了 JavaScript 這門語言。