避免死鎖的一個著名的演算法是
Ⅰ 什麼是銀行家演算法
銀行家演算法是一種最有代表性的避免死鎖的演算法。在避免死鎖方法中允許進程動態地申請資源,但系 銀行家演算法統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。為實現銀行家演算法,系統必須設置若干
Ⅱ 死鎖怎麼解決
處理死鎖的思路如下:
預防死鎖:破壞四個必要條件中的一個或多個來預防死鎖。
避免死鎖:在資源動態分配的過程中,用某種方式防止系統進入不安全的狀態。
檢測死鎖:運行時產生死鎖,及時發現思索,將程序解脫出來。
解除死鎖:發生死鎖後,撤銷進程,回收資源,分配給正在阻塞狀態的進程。
預防死鎖的辦法:
破壞請求和保持條件:
1、一次性的申請所有資源。之後不在申請資源,如果不滿足資源條件則得不到資源分配。
2、只獲得初期資源運行,之後將運行完的資源釋放,請求新的資源。
破壞不可搶占條件:當一個進程獲得某種不可搶占資源,提出新的資源申請,若不能滿足,則釋放所有資源,以後需要,再次重新申請。
破壞循環等待條件:對資源進行排號,按照序號遞增的順序請求資源。若進程獲得序號高的資源想要獲取序號低的資源,就需要先釋放序號高的資源。
(2)避免死鎖的一個著名的演算法是擴展閱讀
形成死鎖的四個必要條件:
(1) 互斥條件:一個資源每次只能被一個進程使用。
(2) 請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
(3) 不剝奪條件:進程已獲得的資源,在末使用完之前,不能強行剝奪。
(4) 循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關系。
如果一組進程中每一個進程都在等待僅由該組進程中的其他進程才能引發的事件,那麼該組進程是死鎖的。
舉例來說:有兩個進程A和B,A持有資源a等待b資源,B持有資源b等待a資源,兩個進程都在等待另一個資源的同時不釋放資源,就形成死鎖。
Ⅲ 產生進程死鎖的原因是什麼如何接觸死鎖
產生死鎖的原因:一是系統提供的資源數量有限,不能滿足每個進程的使用;二是多道程序運行時,進程推進順序不合理。
產生死鎖的必要條件是:1、互斥條件;2、不可剝奪條件(不可搶占);3、部分分配;4、循環等待。
根據產生死鎖的四個必要條件,只要使其中之一不能成立,死鎖就不會出現。為此,可以採取下列三種預防措施:
1、採用資源靜態分配策略,破壞"部分分配"條件;
2、允許進程剝奪使用其他進程佔有的資源,從而破壞"不可剝奪"條件;
3、採用資源有序分配法,破壞"環路"條件。
死鎖的避免不嚴格地限制死鎖的必要條件的存在,而是系統在系統運行過程中小心地避免死鎖的最終發生。最著名的死鎖避免演算法是銀行家演算法。死鎖避免演算法需要很大的系統開銷。
解決死鎖的另一條途徑是死鎖檢測方法,這種方法對資源的分配不加限制,即允許死鎖的發生。但系統定時地運行一個"死鎖檢測"程序,判斷系統是否已發生死鎖,若檢測到死鎖發生則設法加以解除。
解除死鎖常常採用下面兩種方法:1、資源剝奪法;2、撤消進程法
Ⅳ 避免死鎖的方法有哪些
1、避免給一個鎖嵌套上鎖,在持有一個鎖的時候,不要再給這個鎖上鎖。如果使用多個鎖,使用std::lock。
2、在持有鎖時,不要調用別人提供的函數,因為你不清楚別人的代碼怎麼實現的,不知道它是不是在使用鎖。
3、給多個鎖上鎖時,固定順序。如果在給多個所上鎖,並且無法使用std::lock,最好的做法就是在每一個線程中,都按照同樣的順序。
4、分層次來使用鎖,把程序分成幾個層次。區分每個層次中使用的鎖,當一個線程已經持有更低層次的鎖時,不允許使用高層次的鎖。可以在程序運行時給不同的鎖加上層次號,記錄每個線程持有的鎖。
(4)避免死鎖的一個著名的演算法是擴展閱讀:
解決方法
在系統中已經出現死鎖後,應該及時檢測到死鎖的發生,並採取適當的措施來解除死鎖。
死鎖預防。
這是一種較簡單和直觀的事先預防的方法。方法是通過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被廣泛使用。但是由於所施加的限制條件往往太嚴格,可能會導致系統資源利用率和系統吞吐量降低。
死鎖避免。
系統對進程發出的每一個系統能夠滿足的資源申請進行動態檢查,並根據檢查結果決定是否分配資源;如果分配後系統可能發生死鎖,則不予分配,否則予以分配。這是一種保證系統不進入死鎖狀態的動態策略。
死鎖檢測和解除。
先檢測:這種方法並不須事先採取任何限制性措施,也不必檢查系統是否已經進入不安全區,此方法允許系統在運行過程中發生死鎖。但可通過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地確定與死鎖有關的進程和資源。檢測方法包括定時檢測、效率低時檢測、進程等待時檢測等。
然後解除死鎖:採取適當措施,從系統中將已發生的死鎖清除掉。
這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。常用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉為就緒狀態,以繼續運行。死鎖的檢測和解除措施,有可能使系統獲得較好的資源利用率和吞吐量,但在實現上難度也最大。
Ⅳ 銀行家演算法怎麼是預防死鎖
銀行家演算法是最有代表性的避免死鎖演算法,是Dijkstra提出的銀行家演算法。
這是由於該演算法能用於銀行系統現金貸款的發放而得名。 銀行家可以把一定數量的資金供多個用戶周轉使用,為保證資金的安全,銀行家規定: (1)當一個用戶對資金的最大需求量不超
Ⅵ 關於銀行家演算法,下面的說法哪些是對的(多選)
BC
解釋:
銀行家演算法(Banker's Algorithm)是一個避免死鎖(Deadlock)的著名演算法,A錯C對;
在避免死鎖方法中允許進程動態地申請資源,但系統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待,顯然參與系統資源分配,所以B對,D錯。
Ⅶ 銀行家演算法應用在哪些方面
只要是涉及多個獨立個體對某種資源的動態申請和回收就可以應用此演算法。在計算機科學中一般用此演算法檢測進程的推進順序是否是安全隊列,如果不是的話,會因為對資源的爭奪而造成死鎖。
Ⅷ 避免死鎖的一個著名的演算法是
銀行家演算法
Ⅸ 什麼是進程同步和死鎖
進程同步:我們把非同步環境下的一組並發進程因直接制約而互相發送消息而進行互相合作、互相等待,使得各進程按一定的速度執行的過程稱為進程間的同步。具有同步關系的一組並發進程稱為合作進程,合作進程間互相發送的信號稱為消息或事件。
如果我們對一個消息或事件賦以唯一的消息名,則我們可用過程wait
(消息名)表示進程等待合作進程發來的消息,而用過程signal
(消息名)
表示向合作進程發送消息。
進程死鎖:如果多個進程同時佔有對方需要的資源而同時請求對方的資源,而它們在得到請求之前不會釋放所佔有的資源,那麼就會導致死鎖的發生,也就是進程不能實現同步。
Ⅹ 銀行家演算法
簡介
銀行家演算法是一種最有代表性的避免死鎖的演算法。在避免死鎖方法中允許進程動態地申請資源,但系銀行家演算法統在進行資源分配之前,應先計算此次分配資源的安全性,若分配不會導致系統進入不安全狀態,則分配,否則等待。為實現銀行家演算法,系統必須設置若干數據結構。 要解釋銀行家演算法,必須先解釋操作系統安全狀態和不安全狀態。 安全序列是指一個進程序列{P1,…,Pn}是安全的,如果對於每一個進程Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩餘資源量與所有進程Pj (j < i )當前佔有資源量之和。
安全狀態
如果存在一個由系統中所有進程構成的安全序列P1,…,Pn,則系統處於安全狀態。安全狀態一定是沒有死鎖發生。
不安全狀態
不存在一個安全序列。不安全狀態不一定導致死鎖。
[編輯本段]銀行家演算法的數據結構
1)可利用資源向量Available 是個含有m個元素的數組,其中的每一個元素代表一類可利用的資源數目。如果Available〔j〕=K,則表示系統中現有Rj類資源K個。 2)最大需求矩陣Max 這是一個n×m的矩陣,它定義了系統中n個進程中的每一個進程對m類資源的最大需求。如果Max〔i,j〕=K,則表示進程i需要Rj類資源的最大數目為K。 3)分配矩陣Allocation 這也是一個n×m的矩陣,它定義了系統中每一類資源當前已分配給每一進程的資源數。如果Allocation〔i,j〕=K,則表示進程i當前已分得Rj類資源的 數目為K。 4)需求矩陣Need。 這也是一個n×m的矩陣,用以表示每一個進程尚需的各類資源數。如果Need〔i,j〕=K,則表示進程i還需要Rj類資源K個,方能完成其任務。 Need〔i,j〕=Max〔i,j〕-Allocation〔i,j〕
[編輯本段]銀行家演算法原理:
我們可以把操作系統看作是銀行家,操作系統管理的資源相當於銀行家管理的資金,進程向操作系統請求分配資源相當於用戶向銀行家貸款。 為保證資金的安全,銀行家規定: (1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客; (2) 顧客可以分歧貸款,但貸款的總數不能超過最大需求量; (3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款; (4) 當顧客得到所需的全部資金後,一定能在有限的時間里歸還所有的資金. 操作系統按照銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程已佔用的資源數與本次申請的資源數之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統現存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。 運行平台:Windows XP VS2005 編程語言:C#
[編輯本段]演算法的實現
初始化
由用戶輸入數據,分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。
銀行家演算法
在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統性能。在該方法中把系統的狀態分為安全狀態和不安全狀態,只要能使系統始終都處於安全狀態,便可以避免發生死鎖。 銀行家演算法的基本思想是分配資源之前,判斷系統是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的演算法。 設進程cusneed提出請求REQUEST [i],則銀行家演算法按如下規則進行判斷。 (1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],則轉(2);否則,出錯。 (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(3);否則,出錯。 (3)系統試探分配資源,修改相關數據: AVAILABLE[i]-=REQUEST[cusneed][i]; ALLOCATION[cusneed][i]+=REQUEST[cusneed][i]; NEED[cusneed][i]-=REQUEST[cusneed][i]; (4)系統執行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統恢復原狀,進程等待。
安全性檢查演算法
(1)設置兩個工作向量Work=AVAILABLE;FINISH (2)從進程集合中找到一個滿足下述條件的進程, FINISH==false; NEED<=Work; 如找到,執行(3);否則,執行(4) (3)設進程獲得資源,可順利執行,直至完成,從而釋放資源。 Work+=ALLOCATION; Finish=true; GOTO 2 (4)如所有的進程Finish= true,則表示安全;否則系統不安全。
[編輯本段]演算法
/// 資源數 public static int resourceNumber; /// 進程數 public static int processNumber; /// 可用資源數組 public static int[] Available; /// 工作向量 public static int[] work; /// 它表示系統是否有足夠的資源分配給進程 public static bool[] Finish; /// 最大需求矩陣 public static int[][] Max; /// 分配矩陣 public static int[][] Allocation; /// 需求矩陣 public static int[][] Need; /// 安全序列 public static int[] SafeSequence; /// 資源請求向量 public static int[] Request; 演算法思想: 主要是:遞歸+深度優先搜尋+回溯 演算法源代碼如下: /// 深搜+回溯實現銀行家演算法 /// <param name="n">已完成的進程數</param> public void DFS_searchSafeSequence(int n) { if (n == processNumber) { //找到一個安全序列,可以顯示所有安全序列 //顯示在richTextBoxshow.Text上 for (int i = 0; i < processNumber; i++) { richTextBoxshow.Text += SafeSequence[i] + " "; } richTextBoxshow.Text += "\n"; return; } for (int i = 0; i < processNumber; i++) { if (Finish[i] == false)//進程尚未完成 { //判斷現有資源是否可以滿足這個進程 bool isOK = true; for (int j = 0; j < resourceNumber; j++) { if (Need[i][j] > work[j]) { isOK = false; break; } } //可以滿足 if (isOK) { //先試探的將資源分配給這個進程 for (int j = 0; j < resourceNumber; j++) { work[j] += Allocation[i][j]; } //已經完成 Finish[i] = true; //加入安全序列 SafeSequence[n] = i; //繼續搜索 DFS_searchSafeSequence(n+1); //回溯 Finish[i] = false; SafeSequence[n] = -1; for (int j = 0; j < resourceNumber; j++) { work[j] -= Allocation[i][j];