1. 程式人生 > >什麼是死鎖和如何解決死鎖

什麼是死鎖和如何解決死鎖

資源的分類

系統中有許多不同型別的資源,需要採用互斥訪問方法並且不可被搶佔的資源,也就是臨界資源。

使用次數分類

可重用性資源

每一個可重用資源中的單元只能分配給一個程序使用,不允許多個程序共享。程序是用資源順序,1 請求資源,如果請求失敗程序阻塞或迴圈等待。2 使用資源。3釋放資源。 系統中的可重用資源數目都是相對固定的程式執行時不能增加或刪除。
消耗性資源

他是臨時資源,有程序執行動態建立和消耗的,每一類消耗性資源單元數目都是不斷變化的,通常在生產者程序中建立,在消費者程序中消耗。

能否搶佔分類

可搶佔資源
CPU,主存等可以共享的資源。
不可搶佔資源

印表機,光碟機等不可共享的資源。

死鎖(Deadlock)的形成

打個比方,假設有P1和P2兩個程序,都需要A和B兩個資源,現在P1持有A等待B資源,而P2持有B等待A資源,兩個都等待另一個資源而不肯釋放資源,就這樣無限等待中,這就形成死鎖,這也是死鎖的一種情況。給死鎖下個定義,如果一組程序中每一個程序都在等待僅由該組程序中的其他程序才能引發的事件,那麼該組程序是死鎖的。

競爭不可搶佔資源引起死鎖

也就是我們說的第一種情況,而這都在等待對方佔有的不可搶佔的資源。

競爭可消耗資源引起死鎖

有p1,p2,p3三個程序,p1向p2傳送訊息並接受p3傳送的訊息,p2向p3傳送訊息並接受p2的訊息,p3向p1傳送訊息並接受p2的訊息,如果設定是先接到訊息後傳送訊息,則所有的訊息都不能傳送,這就造成死鎖。

程序推進順序不當引起死鎖

有程序p1,p2,都需要資源A,B,本來可以p1執行A --> p1執行B --> p2執行A --> p2執行B,但是順序換了,p1執行A時p2執行B,容易發生第一種死鎖。互相搶佔資源。

產生死鎖的必要條件

互斥條件

某資源只能被一個程序使用,其他程序請求該資源時,只能等待,知道資源使用完畢後釋放資源。

請求和保持條件

程式已經保持了至少一個資源,但是又提出了新要求,而這個資源被其他程序佔用,自己佔用資源卻保持不放。

不可搶佔條件

程序已獲得的資源沒有使用完,不能被搶佔。

迴圈等待條件

必然存在一個迴圈鏈。

處理死鎖的思路。

預防死鎖

破壞死鎖的四個必要條件中的一個或多個來預防死鎖。

避免死鎖

和預防死鎖的區別就是,在資源動態分配過程中,用某種方式防止系統進入不安全的狀態。

檢測死鎖

執行時出現死鎖,能及時發現死鎖,把程式解脫出來

解除死鎖

發生死鎖後,解脫程序,通常撤銷程序,回收資源,再分配給正處於阻塞狀態的程序。

預防死鎖方法

破壞請求和保持條件

協議1

所有程序開始前,必須一次性地申請所需的所有資源,這樣執行期間就不會再提出資源要求,破壞了請求條件,即使有一種資源不能滿足需求,也不會給它分配正在空閒的資源,這樣它就沒有資源,就破壞了保持條件,從而預防死鎖的發生。 協議2 允許一個程序只獲得初期的資源就開始執行,然後再把執行完的資源釋放出來。然後再請求新的資源。

破壞不可搶佔條件

當一個已經保持了某種不可搶佔資源的程序,提出新資源請求不能被滿足時,它必須釋放已經保持的所有資源,以後需要時再重新申請。

破壞迴圈等待條件

對系統中的所有資源型別進行線性排序,然後規定每個程序必須按序列號遞增的順序請求資源。假如程序請求到了一些序列號較高的資源,然後有請求一個序列較低的資源時,必須先釋放相同和更高序號的資源後才能申請低序號的資源。多個同類資源必須一起請求。

相關推薦

sqlserver 查看錶解決問題

 select   request_session_id   spid,OBJECT_NAME(resource_associated_entity_id) tableName        from   sys.dm_tran_locks where resource_type='OBJECT'     

產生的原因,產生死的必要條件解決的方法

死鎖:指多個程序因競爭共享資源而造成的一種僵局,若無外力作用,這些程序都將永遠不能再 向前推進。 安全狀態與不安全狀態:安全狀態指系統能按某種程序順序來為每個程序分配其所需資源,直至最大需求,使每個程序都可順利完成。若系統不存在這樣一個序列,則稱系統處於不安全狀態。

的定義 產生原因 必要條件 避免解除的方法

                1.死鎖:如果一組程序中的每一個程序都在等待僅由該組程序中的其它程序才能引發的事件,那麼該組程序是

26 python 初學(線程、同步遞歸

線程 容易 daemon python color col 當前 emp oba 參考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 並發:一段時間內做一些事情 並行:同時做多件事情 線程是操作系統能夠進行運算調度的

I2C從機掛分析解決方法

I2C幾乎是嵌入系統中最為通用序列匯流排,MCU周邊的各種器件只要對速度要求不高都可以使用。優點是相容性好(幾乎所有MCU都有I2C主機控制器,沒有也可以用IO模擬),管腳佔用少,晶片實現簡單。I2C協議雖然簡單,實際使用過程中小毛病還不少。今天先來看一個平日最為常見的問

Oracle中查看表是否被如何解的處理方法

objects dba where type 語句 ner term and schema --1、以下幾個為相關表SELECT * FROM v$lock;SELECT * FROM v$sqlarea;SELECT * FROM v$session;SELECT * F

共享(S)排它(X)

獲取數據 from 末尾 del ldl 執行 允許 寫鎖 增加 釋義 共享鎖:(讀取)操作創建的鎖。其他用戶可以並發讀取數據,但任何事物都不能獲取數據上的排它鎖,直到已釋放所有共享鎖。 共享鎖(S鎖)又稱為讀鎖,若事務T對數據對象A加上S鎖,則事務T只能讀A;其他事務只能

AQS實現公平非公平

rac readwrite post 原理 失敗 之前 有一個 class blog https://www.cnblogs.com/chengdabelief/p/7493200.html AQS(AbstractQueuedSynchronizer類)是一個用來構建

多線程學習 公平非公平

ava print anr 控制臺 finall 個數 rac 每一個 count() 公平與非公平鎖:鎖lock分為 公平鎖和非公平鎖,公平鎖表示現場獲取鎖的順序是按照線程加鎖的順序來分配的, 即先來先得的FIFO先進先出順序。而非公平鎖就是一種獲取鎖的搶占機制,是隨

【轉】Java學習---Java的Mysql的機制

tps www. 鎖機制 www http ava mysql href 和數 【原文】https://www.toutiao.com/i6593861446428262916/ Java和數據庫的鎖機制 https://www.toutiao.com/i659386144

對象,synchronized修飾static方法與非static方法的區別

ati nbsp 的區別 一個 靜態方法 範圍 之間 對象 ron 當synchronized修飾一個static方法時,多線程下,獲取的是類鎖(即Class本身,註意:不是實例), 作用範圍是整個靜態方法,作用的對象是這個類的所有對象。 當synchro

python 學習第二十四天(同步遞迴

同步鎖 給一段程式碼加了同步鎖之後,在這段程式碼執行時只能有一個執行緒執行。 import time import threading def addNum(): global num #在每個執行緒中都獲取這個全域性變數 #num-=1

linux中的檔案(勸告性上強制性上)

上午在看UNP卷二這一節的時候及其想睡覺,就草草了事,夜晚沒有事情幹,就來找找部落格看看這兩個鎖到底是怎麼回事吧! 參考文章:https://www.ibm.com/developerworks/cn/linux/l-cn-filelock/index.html 背景知識:在早期的

Java併發程式設計(10)-顯式讀寫的使用

文章目錄 一、顯式鎖 1.1、什麼是顯式鎖 1.2、Lock和ReentrantLock 1.3、如何使用顯示鎖 二、讀寫鎖 2.1、為什麼使用讀寫鎖

JAVA多執行緒 重入讀寫

在java多執行緒中,我們真的可以使用synchronized關鍵字來實現執行緒間的同步互斥工作,那麼其實還有一個更優秀的機制去完成這個“同步互斥”工作,他就是Lock物件,重入鎖和讀寫鎖。他們具有比synchronized更為強大的功能,並且有嗅探鎖定、多路分支等功能。 一、重入鎖

Java中的公平非公平實現詳解

轉載自:https://blog.csdn.net/qyp199312/article/details/70598480#reentrantlock鎖的實現分析   前言 ReentrantLock的可重入性分析 synchronized的可重入性 ReentrantLock的可重

MySQL 中的行級、表級頁級(不看後悔,看了必懂)

行級鎖 行級鎖是 MySQL 中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖分為共享鎖和排他鎖。 特點:加鎖開銷大,會出現死鎖,鎖定粒度最小,發生鎖衝突的概率最低,併發度最高 頁級鎖 頁級鎖是 MySQL 中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。

javad多執行緒的顯示內建

一、內建鎖:Synchronized 1、內建鎖的獲得鎖和釋放鎖是隱式的,進入synchrnozied修飾的程式碼要獲得鎖,走出相應的程式碼要釋放鎖。 2、與synchronized配套使用的執行緒通訊方式:wait() 、notify() 、notifyAll() wait會立刻釋放當

GIL執行緒

GIL鎖(Global Interpreter Lock):CPython才會有(是這種直譯器的歷史遺留問題),Python程式執行前,先獲得GIL鎖,然後每執行100個指令,直譯器就自動釋放GIL鎖,讓別的執行緒執行。所以,多執行緒在Python中只能交替執行,同一時間只有一個執行緒在執行。 Python

後端---Java中的公平非公平實現詳解

Java中的公平鎖和非公平鎖實現詳解   在Java中實現鎖的方式有兩種,一種是使用Java自帶的關鍵字synchronized對相應的類或者方法以及程式碼塊進行加鎖,另一種是ReentrantLock,前者只能是非公平鎖,而後者是預設非公平但可實現公平的一把鎖。 Reentr