1. 程式人生 > >死鎖的原因,避免及預防

死鎖的原因,避免及預防

我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。
為保證資金的安全,銀行家規定:
(1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;
(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;
(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款;
(4) 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金.

銀行家演算法資料結構

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] 

演算法 的實現

一、初始化

由使用者輸入資料,分別對可利用資源向量矩陣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 ,則表 示安全;否則系統不安全。

作業系統安全狀態和不安全狀態:   

安全序列是指一個程序序列{P1,…,Pn}是安全的,如果對於每一個程序Pi(1≤i≤n),它以後尚需要的資源量不超過系統當前剩餘資源量與所有程序Pj (j < i )當前佔有資源

量之和。
如果存在一個由系統中所有程序構成的安全序列P1,…,Pn,則系統處於安全狀態。安全狀態一定是沒有死鎖發生。
不存在一個安全序列。不安全狀態不一定導致死鎖。

各演算法流程圖

初始化演算法流程圖:

銀行家演算法流程圖:

安全性演算法流程 圖:

 


解除死鎖:方法有:人工方法和死鎖解除演算法(搶佔資源、終止或撤銷程序);

相關推薦

原因避免預防

我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。 為保證資金的安全,銀行家規定: (1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客; (2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量; (3) 當

原因解決避免方法哲學家就餐問題

死鎖的四大條件: 互斥:資源不能共享,只能由一個程序持有 佔有且等待:當一個等待另外程序而阻塞時,資源不主動釋放 不可搶佔:作業系統不能強行搶佔被程序持有的資源 迴圈等待:存在一個封閉的程序鏈,使得每一個程序都至少佔有下個程序所需要的資源。 這個四個資

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

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

的概念產生的主要原因必要條件以及預防與處理策略

一.死鎖的概念 兩個或多個程序被無限的阻塞,相互等待的一種狀態。 二.死鎖產生的原因 1.資源分配不當 2.系統資源不足(程序間就會為了爭奪資源而產生死鎖) 3.程序執行推進順序不當 三.產生死鎖的必

一個多執行緒案例如何避免解決問題?

多執行緒死鎖在java程式設計師筆試的時候時有遇見,死鎖概念在之前的文章有介紹,大家應該也都明白它的概念,不清楚的去翻看歷史文章吧。 下面是一個多執行緒死鎖的例子 輸出 thread1 get lock1 thread2 get lock2 兩個執行緒相互得到鎖1,鎖2,然後

【轉】【MySQL】Mysql併發時經典常見的原因解決方法

https://www.cnblogs.com/zejin2008/p/5262751.html   1.    mysql都有什麼鎖   MySQL有三種鎖的級別:頁級、表級、行級。 表級鎖:開銷小,加鎖快;不會出現死

MySQL資料庫原因解決

      資料庫和作業系統一樣,是一個多使用者使用的共享資源。當多個使用者併發地存取資料 時,在資料庫中就會產生多個事務同時存取同一資料的情況。若對併發操作不加控制就可能會讀取和儲存不正確的資料,破壞資料庫的一致性。加鎖是實現資料庫並 發控制的一個非常重要的技術。在實

Mysql併發時經典常見的原因解決方法

1.    mysql都有什麼鎖 MySQL有三種鎖的級別:頁級、表級、行級。 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低。 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高。 頁面鎖:開

資料庫原因解決辦法

死鎖(Deadlock) 所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源佔用是互斥的,當某個程序提出申請

寫一個例子解決

package com.執行緒間通訊; public class DeadLock { public static void main(String[] args) throws InterruptedException { final DeadLo

sqlserver 原因解決方法

其實所有的死鎖最深層的原因就是一個:資源競爭 表現一:   一個使用者A 訪問表A(鎖住了表A),然後又訪問表B,另一個使用者B 訪問表B(鎖住了表B),然後企圖訪問表A,這時使用者A由於使用者B已經鎖住表B,它必須等待使用者B釋放表B,才能繼續,好了他老人家就只好老老實

Python中的形成示例情況的防止

程序 ast mon error: none args ria 在那 n) 死鎖示例搞多線程的經常會遇到死鎖的問題,學習操作系統的時候會講到死鎖相關的東西,我們用Python直觀的演示一下。死鎖的一個原因是互斥鎖。假設銀行系統中,用戶a試圖轉賬100塊給用戶b,與此同時用戶

MySQL問題例項分析解決方法(主要是SQL語句可能會產生的問題)

from: http://database.51cto.com/art/201108/286325.htm MySQL死鎖問題的相關知識是本文我們主要要介紹的內容,接下來我們就來一一介紹這部分內容,希望能夠對您有所幫助。 1、MySQL常用儲存引擎的鎖機制 MyISAM

哲學家就餐與問題產生的條件以及解決方案

請結合經典案例-哲學家就餐,來談談你對死鎖的理解,以及怎麼預防和解除死鎖? 哲學家就餐 描述:在一張圓桌上,有n個哲學家,n支筷子,他們的生活方式只是交替地進行思考和進餐,飢餓時便試圖取其左、右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐,進餐完畢,放下筷子又繼續思考

解決MySQL事務未提交導致報錯 避免的方法

解決mysql 事務未提交導致死鎖報錯:        當 sessionA 嘗試修改 B 表資料,因為 sessionB 當前為鎖定狀態,而且 sessionB 對 B 表中資料具有鎖定狀態中,則出現死鎖。sessionB 會自動終止嘗試修改 A 表資料事務, 兩個事務操作

java兩種經典例子Lock發生死案列

第一種synchronized方式死鎖:執行緒thread1先獲取鎖locka,然後在同步塊裡巢狀競爭鎖lockb。而執行緒thread2先獲取鎖lockb,然後在同步塊裡巢狀競爭鎖locka(此時已經被執行緒thread1擁有,而thread1在等待lockb,而loc

waveInReset/waveOutReset原因與解決方案

問題背景 錄音播音實際需求 1、隨時終止 2、錄音並非檔案,而是形成rtp傳送 3、播音並非源於檔案,而是源於rtp 因此Waveform audio使用的buffer較小,不斷的裝載/傳送 buffer,終止的時候Reset並且close. 大致如下呼叫的迴圈 錄音

什麼是?如何避免? 以及實現執行緒才程式

死鎖是什麼 所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源佔用是互斥的,當某個程序提出申請資源後,使得有關程序在

面試官:什麼是?怎麼排查?怎麼避免

突然發現我的圖解系統缺了「死鎖」的內容,這就來補下。 在面試過程中,死鎖也是高頻的考點,因為如果線上環境真多發生了死鎖,那真的出大事了。 這次,我們就來系統地聊聊死鎖的問題。 死鎖的概念; 模擬死鎖問題的產生; 利用工具排查死鎖問題; 避免死鎖問題的發生; 死鎖的概念 在多執行緒程式設計中,我們為了防

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

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