死鎖

来源:http://www.cnblogs.com/lenomirei/archive/2016/07/14/5669962.html
-Advertisement-
Play Games

死鎖的定義:如果一組進程中的每一個進程都在等待僅由該組進程中的其他進程才能引發的時間,那麼該組進程是死鎖的。 產生死鎖的必要條件:(產生死鎖必須同時具備下麵四個必要條件) 互斥條件:簡單的說就是進程搶奪的資源必須是臨界資源,一段時間內,該資源只能同時被一個進程所占有 請求和保持條件:當一個進程持有了 ...


死鎖的定義:如果一組進程中的每一個進程都在等待僅由該組進程中的其他進程才能引發的時間,那麼該組進程是死鎖的。

產生死鎖的必要條件:(產生死鎖必須同時具備下麵四個必要條件

  • 互斥條件:簡單的說就是進程搶奪的資源必須是臨界資源,一段時間內,該資源只能同時被一個進程所占有
  • 請求和保持條件:當一個進程持有了一個(或者更多)資源,申請另外的資源的時候發現申請的資源被其他進程所持有,當前進程阻塞,但不會是放自己所持有的資源
  • 不可搶占條件:進程已經獲得的資源在未使用完畢的情況下不可被其他進程所搶占
  • 迴圈等待條件:發生死鎖的時候,必然存在一個進程—資源的迴圈鏈

這裡所說的資源不僅包括硬體資源或者其他的資源,還包括鎖,鎖也是一種資源,鎖的爭用也會導致死鎖

  • 死鎖的幾個例子(為了好描述,這裡用鎖作為資源來描述死鎖,這裡的鎖換成資源完全沒問題)

自死鎖,簡單的說一個進程持有了一個鎖之後,在臨界區內又去申請該鎖,它將不得不等待該鎖被釋放,但因為它本身在等待申請該鎖,所以永遠不會有機會釋放鎖並得到鎖,最終結果就是死鎖。因為很多鎖都不是可遞歸鎖,所以不要嘗試在一個線程內多次申請同一個鎖。

ABBA死鎖(該死鎖常發生於多個進程多個鎖),簡單的說就是每個進程都持有其他進程想要獲得的鎖,上圖

 

 

這個最經典的例子當屬,哲學家用餐問題(不再多說,基本原理就是上圖和上面所說的ABBA死鎖,可以百度一下)

死鎖的處理方法又分為好幾大類

  • 預防死鎖

預防死鎖的辦法就是破壞死鎖的四個必要條件,只要破壞了條件,死鎖自然就不會產生了,簡單的描述一下破壞四個條件的思想

破壞請求和保持條件:1.所有進程在開始運行之前,必須一次性獲得所有資源,如果無法獲得完全,釋放已經獲得的資源,等待;2.所有進程在開始運行之前,只獲得初始運行所需要的資源,然後在運行過程中不斷請求新的資源,同時釋放自己已經用完的資源。    相比第一種而言,第二種方式要更加節省資源,不會浪費(因為第一種可能出現一種資源只在進程結束用那麼一小下,但卻從頭到尾都被占用,使用效率極低),而且,減少了進程饑餓的情況。

破壞不可搶占條件:說起來簡單,只要當一個進程申請一個資源,然而卻申請不到的時候,必須釋放已經申請到的所有資源。但是做起來很複雜,需要付出很大的代價,加入該進程已經持有了類似印表機(或者其他的有必要連續工作的)這樣的設備,申請其他資源的時候失敗了,必須釋放印表機資源,但是人家用印表機已經用過一段時間了,此時釋放印表機資源很可能造成之後再次是用印表機時兩次運行的信息不連續(得不到正確的結果)

破壞迴圈等待條件:設立一個規則,讓進程獲取資源的時候按照一定的順序依次申請,不能違背這個順序的規則。必須按照順序申請和釋放,想要申請後面的資源必須先把該資源之前的資源全部申請,想要申請前面的資源必須先把該資源之後的資源(前提是已獲得)全部釋放

破壞互斥條件:沒法破壞,是資源本身的性質所引起的

  • 避免死鎖

最常聽到的演算法來襲!銀行家演算法來了!!

銀行家演算法需要的數據結構:1.可利用資源向量(Available);2.最大需求矩陣(Max);3.分配矩陣(Allocation);4.需求矩陣(Need)。

上述三個矩陣存在如下關係  Need[i,j]=Max[i,j]-Allocation[i,j];

說的看似很難懂的樣子,下麵詳解一下就很好理解了。

 

 

可利用資源向量(Available):這麼說吧,比如當前有三種資源A,B,C,可利用資源向量就是一個數組(為了在程式中使用),我們理解的話就說ABC各有多少個資源,例子

A  B  C

7  2  5     這裡7,2,5三個資源的數目組合起來就是一個數組(向量)

 

最大需求矩陣(Max):說是矩陣完全是為了在編程時使用方便(就是一個二維數組),我們理解的話就說是進程工作需要的每個資源的總數目,例子

       A   B   C

P1    1   1    1   這樣一看就明白了,進程P1需要三種資源各一個(這個不是二維數組啊,是一維的?怎麼可能只有一個進程這是一對進程思死鎖的解決辦法!),多加幾個進程就二維數組了

分配矩陣(Allocation):和需求矩陣類似,只是數值的含義變成了,目前已經給進程某某(行值i),分配了多少的某某(列值j)資源

需求矩陣(Need):根據上面的公式就可以看出,這個是進程目前還需要多少資源才可以運行,和最大需求不一樣,最大需求是一共需要的數目。

有了這些我們使用銀行家演算法就夠了,我們使用該演算法的目的是什麼?是避免死鎖,避免死鎖的意思就是我們使用這些數據結構來推斷如果按某種順序執行進程隊列,是否是安全的(是否會造成死鎖)

 

上圖是一個簡單的圖實例,為了電腦程式運行方便,我們一般假設從P0進程開始運行,那麼就要給P0分配足夠運行的資源(就是把NEED都給了,前提是當前Available資源數目足夠該進程的Need),然後計算Available(new)=Available(old)+Allocation(P),其中Allocation就是執行的進程之前已經分配的資源執行完成之後自然要會收到Available里。

題目一般都會給上圖的表,然後讓你寫出安全序列,用當前的Available看滿足哪個進程的Need然後就先執行它,執行完後回收(加到Available中)該進程的Allocation就可以了,這樣一步一步算到最後如果Available一直算下來沒有虧損不夠的情況證明這個序列就是一個安全隊列了~!

 

  • 死鎖的檢測和解除

使用類似銀行家演算法的方式就可以簡單的檢測死鎖

死鎖解除:1.終止進程(簡單粗暴),就是字面上的,你們死鎖了,我就把你們一起殺掉,缺點就是如果一個進程跑了很長時間,但是被殺了,還得從頭來。

2.逐個終止進程,按照某種順序,挨個殺死進程,每殺一個進程就去看看死鎖解除了沒有(每殺一個進程都會釋放一些資源,如果釋放好粗來的資源解決了死鎖問題,就沒必要再濫殺無辜了),沒解除就繼續殺。

第二種方式顯然人性化了許多,但是按照某種順序顯得很朦朧,這裡的某種順序就是指死鎖解除演算法,有很多,這裡不再贅述。

 

 

推薦書籍:《電腦操作系統(第四版)》第三章第五節,P104


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如果需要進行SQl Server下的SQL性能優化,需要準備以下內容: 一、SQL查詢分析器設置: 1、開啟實際執行計劃跟蹤。 2、每次執行需優化SQL前,帶上清除緩存的設置SQL。 平常在進行SQL Server性能優化時,為了確保真實還原性能問題,我們需要關閉SQL Server自身的執行計劃及 ...
  • 今天剛好需要刪除redis里的db2里的數據,我找了一下,發現這篇內容幫助我解決了問題,記錄一下。 Redis 中有刪除單個 Key 的指令 DEL,但好像沒有批量刪除 Key 的指令,不過我們可以藉助 Linux 的 xargs 指令來完成這個動作。 代碼如下: redis-cli keys “* ...
  • SQL 不同於與其他編程語言的最明顯特征是處理代碼的順序。在大數編程語言中,代碼按編碼順序被處理,但是在SQL語言中,第一個被處理的子句是FROM子句,儘管SELECT語句第一個出現,但是幾乎總是最後被處理。 每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用 ...
  • 其中tablename為表的名稱,num為要設置的新的自動遞增值,此時再Insert一條數據,自動遞增值即為num,不過num必須要大於等於現在已有的自動遞增值,否則SQL語句會執行成功,但是實際上不起作用。 ...
  • 1. 決定壓縮哪些對象 通過sp_estimate_data_compression_savings 評估在ROW和PAGE壓縮時分別節省的空間量。 表包含如下數據模式時,會有較好的壓縮效果: 數字類型的列和固定長度的字元類型數據,但兩者的大多數值都不會用到此類型的所有位元組。如INT列的值大多數少於 ...
  • 在Linux中無論是管理系統還是在Linux環境下編程,內嵌的手冊man都是一個很好用的工具,“Linux下不懂得就找man”(man是manual的意思)。本文將介紹我所知道的所有關於man的知識(這麼說也是為了後續如果有所補充的話,能夠更加完備)。 一、man手冊的組成 man涉及的內容廣泛,另 ...
  • 最近剛接觸Linux,整理了一些常用的命令和快捷鍵 Tab補全命令 當命令記不清了,輸入記得的前幾個用Tab就可以將該命令自動補全。 啟動tomcat服務用$startup.sh 停止tomcat服務通$shtdown.sh,請註意,$符一般已有的,只需要$後面的命令行就可以啦。 查看埠使用狀態n ...
  • 最近根據夢織未來論壇的驅動教程學習了一下Windows下的驅動編程,做個筆記備忘。這是第03課《驅動的編程規範》。驅動部分包括基本的驅動卸載函數、驅動打開關閉讀取寫入操作最簡單的分發常式。代碼如下: 1 //CreateDevice.c 2 //2016.07.14 3 4 #include "nt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...