計算機操作系統-【死鎖】

文章目錄

  • 一、什么是死鎖?
    • 死鎖產生的原因?
    • 死鎖產生的必要條件?
      • 互斥條件
      • 請求并保持
      • 不可剝奪
      • 環路等待
  • 二、處理死鎖的基本方法
    • 死鎖的預防
      • 摒棄請求和保持條件
      • 摒棄不可剝奪條件
      • 摒棄環路等待條件
    • 死鎖的避免
      • 銀行家算法案例


提示:以下是本篇文章正文內容,下面案例可供參考

一、什么是死鎖?

由于多個進程(兩個及以上)競爭共享資源而引起進程不能向前推進的僵死狀態被稱為死鎖。

死鎖產生的原因?

進程訪問資源按照申請資源、訪問資源、釋放資源的順序來執行,如果出現競爭共享資源且分配資源的順序不當時,則可能會產生死鎖。

死鎖產生的必要條件?

互斥條件

當一個進程訪問某個共享資源時,其他進程不能訪問該共享資源。如果當前某個共享資源正在被進程訪問,則其他進程想要對該共享資源進行訪問時,必須要把請求該共享資源的進程阻塞起來,直到資源被當前所擁有進程釋放。

請求并保持

進程已經保持擁有了至少一個資源,又提出了申請新資源的要求,而新申請的資源已經被其他進程所占用,此時進程就會陷入阻塞狀態,但又對自己所擁有的資源保持不釋放,使得其他進行無法訪問該進程所保持的資源。

不可剝奪

進程已經獲取的資源不能被其他進程所剝奪,只能由自己釋放。

環路等待

在發生死鎖時,必然存在一個進程申請資源的環形鏈,即進程集合{p0,p1,p2,p3…}中,p0等待獲取p1占用的一個資源,p1等待獲取p2占用的一個資源,p2等待p3…,最總pn等到獲取p0所占用資源,此時形成一個環形閉環。


二、處理死鎖的基本方法

處理死鎖的基本方法有預防死鎖、避免死鎖、檢測并解除死鎖、忽略死鎖問題等。為確保不發生死鎖,操作系統可以采用死鎖預防和死鎖避免方案。


死鎖的預防

死鎖的預防是根據死鎖的必要條件來進行處理,即當不滿足死鎖成立的四個必要條件(互斥條件、請求并保持、不可剝奪、環形等待)中的一個,即死鎖無法形成。需要明確的是在操作系統中,無法預知進程是否訪問某個臨界資源,所以通常不能采用擯棄互斥條件來預防死鎖的發生,因此死鎖的預防可以從剩下來的三個條件入手。

摒棄請求和保持條件

可以通過摒棄請求和保持條件來預防死鎖。摒棄請求和保持條件的一種方法即:

系統要求所有進程一次性地申請在整個運行過程中所需要的全部資源,如果其中存在一個資源申請不成功,則其他資源也不分配給該進程,該進程進入阻塞狀態。也就是在運行前將所有需要資源一次性進行申請鎖定,后續運行過程中將不再像外部申請其他資源。

摒棄不可剝奪條件

可以通過摒棄不可剝奪條件來預防死鎖。摒棄不可剝奪條件即:

一個已保持某些資源的進程,當它再次提出申請新的資源時,如果不能立刻得到滿足,必須釋放自身所擁有的所有資源。這種方法的缺點是實現復雜、代價高。

摒棄環路等待條件

摒棄環路等待條件即:

進程必須按照規定的順序申請資源,對所有不同類型的資源進行排序,要求每個進程按照規定順序申請資源。
缺點:
1.系統為資源分配的順序可能與進程實際使用資源的順序不同。
2.在編碼實現復雜


死鎖的避免

銀行家算法是一種避免死鎖的資源分配和調度算法,由Edsger Dijkstra 在 1965 年提出。用于操作系統中資源的管理,確保系統不會進入死鎖狀態。基本思想是通過模擬資源預分配,確保系統在任何時候都能滿足至少一個進程所需的最大資源,從而避免死鎖。 銀行家算法主要包括以下幾個步驟:

  • 初始資源類型以及數量,并初始化每個進程所需最大資源數量,當前分配資源數量、當前資源可用剩余量。
  • 安全性檢查:檢查當前系統是否存于安全性狀態。
  • 資源請求:當一個進程請求資源時,首先檢查進程請求資源是否超出該進程最大資源數量,如果請求的某個資源大于該進程所需該資源的最大數量,則拒絕請求。否則系統嘗試為該進程分配資源,并更新狀態是否安全。

銀行家算法案例

假設當前存在5個進程,同個需要申請三種不同類型的資源A\B\C,資源A一共有10個,資源B共有5個,資源C共有7個。

  • 假設p0進程對資源A\B\C最大需求為7,5,3,當前已經分配A\B\C資源為0,1,0,因此p0進程還需要分配A\B\C資源個數為7,4,3。
  • 假設p1進程對資源A\B\C最大需求為3,2,2,當前已經分配A\B\C資源為2,0,0,因此p1進程還需要分配A\B\C資源個數為1,2,2。
  • 假設p2進程對資源A\B\C最大需求為9,0,2,當前已經分配A\B\C資源為3,0,2,因此p2進程還需要分配A\B\C資源個數為6,0,0。
  • 假設p3進程對資源A\B\C最大需求為2,2,2,當前已經分配A\B\C資源為2,1,1,因此p3進程還需要分配A\B\C資源個數為0,1,1。
  • 假設p4進程對資源A\B\C最大需求為4,3,3,當前已經分配A\B\C資源為0,0,2,因此p4進程還需要分配A\B\C資源個數為4,3,1。

這里要記住公式: Need(需求)= Max(所需最大)-Alloc(已經分配);Avail(可用數量)= 總數-Alloc(已經分配)
各資源總數A:10, B:5,C:7.

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p12 0 03 2 21 2 2
p23 0 29 0 26 0 0
p32 1 12 2 20 1 1
p40 0 24 3 34 3 1

通過Alloc已分配的A、B、C資源進行總和,可以計算出當前A資源已經分配了7個,B類資源已經分配了2個,C類資源已經分配了5個,因此A、B、C資源剩余可分配數量分別為3:3:2。Avail(可用數量)= 總數-Alloc(已經分配)

因此我們可以從p0~p4進行匹配,可以發現p0還需要資源分別為7:4:3,而現在剩余資源3:3:2并不滿足條件,因此拒絕向p0分配資源。而p1所需資源1:2:2可以被剩余可分配資源滿足,因此嘗試將資源分配給進程p1,分配圖更新后如下:

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p13 2 23 2 20 0 02 1 0
p23 0 29 0 26 0 0
p32 1 12 2 20 1 1
p40 0 24 3 34 3 1

當可剩余資源分配給p1進程運行完成后,p1將會把所擁有資源釋放,因此A、B、C資源的數量變為 5:3:2。

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p1(執行完成)0 0 03 2 20 0 05 3 2
p23 0 29 0 26 0 0
p32 1 12 2 20 1 1
p40 0 24 3 34 3 1

現在再次嘗試進行新的一輪分配,p0、p2進程所需資源大于當前可分配資源,因此拒絕分配;而p3進程滿足條件,因此嘗試將資源分配給進程p3,分配圖更新后如下:

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p1(執行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p32 2 22 2 20 0 05 2 1
p40 0 24 3 34 3 1

當可剩余資源分配給p3進程運行完成后,p3將會把所擁有資源釋放,因此A、B、C資源的數量變為 7:4:3。

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p00 1 07 5 37 4 3
p1(執行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p3(執行完成)0 0 02 2 20 0 07 4 3
p40 0 24 3 34 3 1

現在再次嘗試進行新的一輪分配,p0進程所需資源恰好等于當前可分配資源,因此嘗試將資源分配給進程p0,分配圖更新后如下:

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p07 5 37 5 37 4 30 0 0
p1(執行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p3(執行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

當可剩余資源分配給p0進程運行完成后,p0將會把所擁有資源釋放,因此A、B、C資源的數量變為 7:5:3。

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(執行完成)0 0 07 5 30 0 07 5 3
p1(執行完成)0 0 03 2 20 0 0
p23 0 29 0 26 0 0
p3(執行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

現在再次嘗試進行新的一輪分配,當前可分配資源滿足p2進程所需資源,因此嘗試將資源分配給進程p2,分配圖更新后如下:

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(執行完成)0 0 07 5 30 0 0
p1(執行完成)0 0 03 2 20 0 0
p29 0 29 0 20 0 01 5 3
p3(執行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

當可剩余資源分配給p2進程運行完成后,p2將會把所擁有資源釋放,因此A、B、C資源的數量變為 10:5:5。

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(執行完成)0 0 07 5 30 0 0
p1(執行完成)0 0 03 2 20 0 0
p2(執行完成)0 0 09 0 20 0 010 5 5
p3(執行完成)0 0 02 2 20 0 0
p40 0 24 3 34 3 1

現在再次嘗試進行新的一輪分配,當前可分配資源滿足p4進程所需資源,因此嘗試將資源分配給進程p4,分配圖更新后如下:

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(執行完成)0 0 07 5 30 0 0
p1(執行完成)0 0 03 2 20 0 0
p2(執行完成)0 0 09 0 20 0 0
p3(執行完成)0 0 02 2 20 0 0
p44 3 34 3 30 0 06 2 4

當可剩余資源分配給p4進程運行完成后,p4將會把所擁有資源釋放,因此A、B、C資源的數量變為 10:5:7。

進程名稱Alloc(A B C)Max(A B C)Need(A B CC)Avail(A B C)
p0(執行完成)0 0 07 5 30 0 0
p1(執行完成)0 0 03 2 20 0 0
p2(執行完成)0 0 09 0 20 0 0
p3(執行完成)0 0 02 2 20 0 0
p4(執行完成)0 0 04 3 30 0 010 5 7

因此資源分配進程順序可以是P1->P3->P0->P2->P4。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76514.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76514.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76514.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue拓撲圖組件

vue拓撲圖組件 介紹技術棧功能特性快速開始安裝依賴開發調試構建部署 使用示例演示截圖組件源碼 介紹 一個基于 Vue3 的拓撲圖組件,具有以下特點: 1.基于 vue-flow 實現,提供流暢的拓撲圖展示體驗 2.支持傳入 JSON 對象自動生成拓撲結構 3.自…

go 通過匯編分析函數傳參與返回值機制

文章目錄 概要一、前置知識二、匯編分析2.1、示例2.2、匯編2.2.1、 寄存器傳值的匯編2.2.2、 棧內存傳值的匯編 三、拓展3.1 了解go中的Duff’s Device3.2 go tool compile3.2 call 0x46dc70 & call 0x46dfda 概要 在上一篇文章中,我們研究了go函數調用時的棧布…

python-1. 找單獨的數

問題描述 在一個班級中,每位同學都拿到了一張卡片,上面有一個整數。有趣的是,除了一個數字之外,所有的數字都恰好出現了兩次。現在需要你幫助班長小C快速找到那個拿了獨特數字卡片的同學手上的數字是什么。 要求: 設…

算法學習C++需注意的基本知識

文章目錄 01_算法中C需注意的基本知識cmath頭文件一些計算符ASCII碼表數據類型長度運算符cout固定輸出格式浮點數的比較max排序自定義類型字符的大小寫轉換與判斷判斷字符是數字還是字母 02_數據結構需要注意的內容1.stringgetline函數的使用string::findsubstr截取字符串strin…

從零開始寫android 的智能指針

Android中定義了兩種智能指針類型,一種是強指針sp(strong pointer),源碼中的位置在system/core/include/utils/StrongPointer.h。另外一種是弱指針(weak pointer)。其實稱之為強引用和弱引用更合適一些。強…

【leetcode hot 100 152】乘積最大子數組

錯誤解法:db[i]表示以i結尾的最大的非空連續,動態規劃:dp[i] Math.max(nums[i], nums[i] * dp[i - 1]); class Solution {public int maxProduct(int[] nums) {int n nums.length;int[] dp new int[n]; // db[i]表示以i結尾的最大的非空連…

圖論整理復習

回溯: 模板: void backtracking(參數) {if (終止條件) {存放結果;return;}for (選擇:本層集合中元素(樹中節點孩子的數量就是集合的大小)) {處理節點;backtracking(路徑,選擇列表); // 遞歸回溯&#xff…

uniapp離線打包提示未添加videoplayer模塊

uniapp中使用到video標簽,但是離線打包放到安卓工程中,運行到真機中時提示如下: 解決方案: 1、把media-release.aar、weex_videoplayer-release.aar放到工程的libs目錄下; 文檔:https://nativesupport.dcloud.net.cn/…

打包構建替換App名稱

方案適用背景 一套代碼出多個安裝包,且安裝包的應用名稱、圖標都不一樣考慮三語名稱問題 通過 Gradle 腳本實現 gradle.properties 里面定義標識來區分應用,如下文里的 APP_TYPEAAA 、APP_TYPEBBB// 定義 groovy 替換方法 def replaceAppName(String …

DrissionPage移動端自動化:從H5到原生App的跨界測試

一、移動端自動化測試的挑戰與機遇 移動端測試面臨多維度挑戰: 設備碎片化:Android/iOS版本、屏幕分辨率差異 混合應用架構:H5頁面與原生組件的深度耦合 交互復雜性:多點觸控、手勢操作、傳感器模擬 性能監控:內存…

達夢數據庫用函數實現身份證合法校驗

達夢數據庫用函數實現身份證合法校驗 拿走不謝~ CREATE OR REPLACE FUNCTION CHECK_IDCARD(A_SFZ IN VARCHAR2) RETURN VARCHAR2 IS TYPE WEIGHT_TAB IS VARRAY(17) OF NUMBER; TYPE CHECK_TAB IS VARRAY(11) OF CHAR; WEIGHT_FACTOR WEIGHT_TAB : WEIGHT_TAB(7,9,10,5,8,4,…

3dmax的python通過普通的攝像頭動捕表情

1、安裝python 進入cdm,打python要能顯示版本號 >>>(進入python提示符模式) import sys sys.path顯示python的安裝路徑, 進入到python.exe的路徑 在python目錄中安裝(ctrlz退出python交互模式) 2、pip install mediapipe…

國產Linux統信安裝mysql8教程步驟

系統環境 uname -a Linux FlencherHU-PC 6.12.9-amd64-desktop-rolling #23.01.01.18 SMP PREEMPT_DYNAMIC Fri Jan 10 18:29:31 CST 2025 x86_64 GNU/Linux下載離線安裝包 瀏覽器下載https://downloads.mysql.com/archives/get/p/23/file/mysql-test-8.0.33-linux-glibc2.28…

Vite 權限繞過導致任意文件讀取(CVE-2025-32395)(附腳本)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 前言…

poi-tl

官網地址 Poi-tl Documentationword模板引擎https://deepoove.com/poi-tl github 地址 https://github.com/Sayi/poi-tl/tree/master gitcode 加速地址 GitCode - 全球開發者的開源社區,開源代碼托管平臺GitCode是面向全球開發者的開源社區,包括原創博客,開源代碼托管,代碼…

操作系統 4.1-I/O與顯示器

外設工作起來 操作系統讓外設工作的基本原理和過程,具體來說,它概括了以下幾個關鍵步驟: 發出指令:操作系統通過向控制器中的寄存器發送指令來啟動外設的工作。這些指令通常是通過I/O指令(如out指令)來實現…

琥珀掃描 2.0.5.0 | 文檔處理全能助手,支持掃描、文字提取及表格識別

琥珀掃描是一款功能強大的文檔處理應用程序。它不僅僅支持基本的文檔掃描功能,還涵蓋了文字提取、證件掃描、表格識別等多種實用功能。無論是學生、職員還是教師,都能從中找到適合自己的功能。該應用支持拍照生成電子件,并能自動矯正文檔邊緣…

jQuery UI 小部件方法調用詳解

jQuery UI 小部件方法調用詳解 引言 jQuery UI 是一個基于 jQuery 的用戶界面和交互庫,它提供了一系列小部件,如按鈕、對話框、進度條等,這些小部件極大地豐富了網頁的交互性和用戶體驗。本文將詳細介紹 jQuery UI 中小部件的方法調用,幫助開發者更好地理解和應用這些小部…

浮點數比較在Eigen數學庫中的處理方法

浮點數比較在Eigen數學庫中的處理方法 在Eigen數學庫中進行浮點數比較時,由于浮點數的精度問題,直接使用運算符通常不是推薦的做法。Eigen提供了幾種更安全的方法來進行浮點數比較: 1. 近似相等比較 使用isApprox()函數進行近似比較&#…

Linux-----驅動

一、內核驅動與啟動流程 1. Linux內核驅動 Nor Flash: 可線性訪問,有專門的數據及地址總線(與內存訪問方式相同)。 Nand Flash: 不可線性訪問,訪問需要控制邏輯(軟件)。 2. Linux啟動流程 ARM架構: IRAM…