死鎖,死鎖產生的原因,產生死鎖的必要條件和解決死鎖的方法
死鎖:指多個程序因競爭共享資源而造成的一種僵局,若無外力作用,這些程序都將永遠不能再 向前推進。
安全狀態與不安全狀態:安全狀態指系統能按某種程序順序來為每個程序分配其所需資源,直至最大需求,使每個程序都可順利完成。若系統不存在這樣一個序列,則稱系統處於不安全狀態。
產生死鎖的原因:(1)競爭系統資源 (2)程序的推進順序不當
產生死鎖的必要條件:
互斥條件:程序要求對所分配的資源進行排它性控制,即在一段時間內某資源僅為一程序所佔用。
請求和保持條件:當程序因請求資源而阻塞時,對已獲得的資源保持不放。
不剝奪條件:程序已獲得的資源在未使用完之前,不能剝奪,只能在使用完時由自己釋放。
環路等待條件:在發生死鎖時,必然存在一個程序--資源的環形鏈。
解決死鎖的基本方法:
預防死鎖:
資源一次性分配:一次性分配所有資源,這樣就不會再有請求了:(破壞請求條件)
只要有一個資源得不到分配,也不給這個程序分配其他的資源:(破壞請保持條件)
可剝奪資源:即當某程序獲得了部分資源,但得不到其它資源,則釋放已佔有的資源(破壞不可剝奪條件)
資源有序分配法:系統給每類資源賦予一個編號,每一個程序按編號遞增的順序請求資源,釋放則相反(破壞環路等待條件)
避免死鎖:
預防死鎖的幾種策略,會嚴重地損害系統性能。因此在避免死鎖時,要施加較弱的限制,從而獲得 較滿意的系統性能。由於在避免死鎖的策略中,允許程序動態地申請資源。因而,系統在進行資源分配之前預先計算資源分配的安全性。若此次分配不會導致系統進入不安全的狀態,則將資源分配給程序;否則,程序等待。其中最具有代表性的避免死鎖演算法是銀行家演算法。
檢測死鎖
首先為每個程序和每個資源指定一個唯一的號碼;
然後建立資源分配表和程序等待表。
解除死鎖:
當發現有程序死鎖後,便應立即把它從死鎖狀態中解脫出來,常採用的方法有:
剝奪資源:從其它程序剝奪足夠數量的資源給死鎖程序,以解除死鎖狀態;
撤消程序:可以直接撤消死鎖程序或撤消代價最小的程序,直至有足夠的資源可用,死鎖狀態.消除為止;所謂代價是指優先順序、執行代價、程序的重要性和價值等。
thanks: http://blog.csdn.net/bxyill/article/details/8237339
相關推薦
死鎖,死鎖產生的原因,產生死鎖的必要條件和解決死鎖的方法
死鎖:指多個程序因競爭共享資源而造成的一種僵局,若無外力作用,這些程序都將永遠不能再 向前推進。 安全狀態與不安全狀態:安全狀態指系統能按某種程序順序來為每個程序分配其所需資源,直至最大需求,使每個程序都可順利完成。若系統不存在這樣一個序列,則稱系統處於不安全狀態。
什麼是死鎖及死鎖的必要條件和解決方法
一、要點提示 二、內容簡介 在計算機系統中有很多一次只能由一個程序使用的資源,如印表機,磁帶機,一個檔案的I節點等。在多道程式設計環境中,若干程序往往要共享這類資源,而且一個程序所需要的資源不止一個。這樣,就會出現若干程序競爭有限資源,又推進順序不當,從而構成無限期迴圈等待的局面。
死鎖的四個必要條件和解決辦法
這樣雖然避免了迴圈等待,但是這種方法是比較低效的,資源的執行速度回變慢,並且可能在沒有必要的情況下拒絕資源的訪問,比如說,程序c想要申請資源1,如果資源1並沒有被其他程序佔有,此時將它分配個程序c是沒有問題的,但是為了避免產生迴圈等待,該申請會被拒絕,這樣就降低了資源的利用率
什麼是死鎖及死鎖的必要條件和解決方法【轉】
一、要點提示 (1) 掌握死鎖的概念和產生死鎖的根本原因。 (2) 理解產生死鎖的必要條件–以下四個條件同時具備:互斥條件、不可搶佔條件、佔有且申請條件、迴圈等待條件。 (3) 記住解決死鎖的一般方法,掌握死鎖的預防和死鎖的避免二者的基本思想。 (4) 掌握死鎖
網易面試題之 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含了從1到n的n個數,但是因為一些原因, * 其中有一些位置(不超過 10 個)看不清了,但是牛牛記得這個數列順序對的數量是 k,
package wangyi; /** * Created by Administrator on 2016/12/7. * 牛牛的作業薄上有一個長度為 n 的排列 A,這個排列包含了從1到n的n個數,但是因為一些原因, * 其中有一些位置(不超過 10 個)看不清
昨天,游標能夠跟隨了,不過系統呼叫不能正常工作,還沒找到原因,暫時也搞不懂,就這樣吧
/************************************************************************/ /* Macros Declaration
iOS webView載入網頁失敗,瀏覽器成功的原因,以及讀取cookie
開發過程中,使用UIWebView載入電腦版網頁,登入出錯, 請求頭有誤,webView請求頭為: User-Agent: Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHT
sqlserver 查看錶鎖和解決表鎖問題
select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT'
死鎖的概念,產生的主要原因,必要條件以及預防與處理策略
一.死鎖的概念 兩個或多個程序被無限的阻塞,相互等待的一種狀態。 二.死鎖產生的原因 1.資源分配不當 2.系統資源不足(程序間就會為了爭奪資源而產生死鎖) 3.程序執行推進順序不當 三.產生死鎖的必
Oracle中發生表加鎖、死鎖的原因,檢視,與解決方法
一.表加鎖、死鎖出現的現象 1.對資料庫操作update,insert,delete時候,資料庫無法更新,操作等待時長,操作結果不發生改變 2.在程式中,底層(資料訪問層)操作時候,不成功,資料庫連線超時,無法操作,或者操作等待時長等現象 【加鎖的原理】:比如一個操作在進行修改一表,它
什麼是死鎖、導致死鎖的原因,活鎖、飢餓又是什麼?
死鎖 是指兩個或兩個以上的程序(或執行緒)在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。 一個執行緒先獲取from鎖,另一個
死鎖原因,解決,避免方法及哲學家就餐問題
死鎖的四大條件: 互斥:資源不能共享,只能由一個程序持有 佔有且等待:當一個等待另外程序而阻塞時,資源不主動釋放 不可搶佔:作業系統不能強行搶佔被程序持有的資源 迴圈等待:存在一個封閉的程序鏈,使得每一個程序都至少佔有下個程序所需要的資源。 這個四個資
死鎖面試題(什麼是死鎖,產生死鎖的原因及必要條件)
什麼是死鎖? 所謂死鎖,是指多個程序在執行過程中因爭奪資源而造成的一種僵局,當程序處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。 產生死鎖的原因? 可歸結為如下兩點: a. 競爭資源 系統中的資源可以分為兩類: 1.
什麼是死鎖,發生原因是什麼,如何解決和避免產生死鎖?
一、什麼是死鎖? 死鎖是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。是作業系統層面的一個錯誤,是程序死
死鎖的原因,避免及預防
我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。 為保證資金的安全,銀行家規定: (1) 當一個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客; (2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量; (3) 當
9.死鎖的概念、導致死鎖的原因,導致死鎖的四個必要條件,預防死鎖的方法、避免死鎖的方法
死鎖避免策略 銀行家演算法:首先需要定義狀態和安全狀態的概念。系統的狀態是當前給程序分配的資源情況。因此,狀態包含兩個向量Resource(系統中每種資源的總量)和Available(未分配給程序的每種資源的總量)及兩個矩陣Claim(表示程序對資源的需求)和Allocation(表示當前分配給程
java面試題之死鎖產生的條件,以及如何避免死鎖,銀行家算法,產生死鎖後如何解決(阿裏面試題)
需求量 info 強行 進程 spa tro 否則 破壞 阻塞 死鎖產生的四個必要條件: 互斥:一個資源每次只能被一個進程使用(資源獨立) 請求與保持:一個進程因請求資源而阻塞時,對已獲得的資源保持不放(不釋放鎖) 不剝奪:進程已獲得的資源,在未使用之前,
死鎖的原因,和一般的解決方案
死鎖的條件 一般來說,要出現死鎖問題需要滿足以下條件: 1. 互斥條件:一個資源每次只能被一個執行緒使用。 2. 請求與保
java多執行緒:執行緒同步synchronized(不同步的問題、佇列與鎖),死鎖的產生和解決
# 0、不同步的問題 併發的執行緒不安全問題: 多個執行緒同時操作同一個物件,如果控制不好,就會產生問題,叫做執行緒不安全。 我們來看三個比較經典的案例來說明**執行緒不安全的問題**。 ## 0.1 訂票問題 例如前面說過的黃牛訂票問題,可能出現負數或相同。 [執行緒建立方式&&黃牛訂票
java 線程問題,寫一個死鎖(原理:只有互相都等待對方放棄資源才會產生死鎖)
() ati ron args start print println class log package com.swift; public class DeadLock implements Runnable { private boolean flag;