操作系統3-處理機調度與死鎖(死鎖)

操作系統-處理機調度與死鎖3(死鎖)

7.死鎖問題

死鎖是指多個進程等待其它進程佔有的資源,因而無限期等待下去的局面。

系統發生死鎖時,一定具備以下四個條件:

  • 互斥條件。對於一個排他性資源,某一時刻最多允許一個進程佔有。
  • 佔有且申請條件。進程至少已佔有一個資源,又要申請新的資源。此時該進程阻塞,且在等待過程中不釋放已經佔有的資源。
  • 不可搶佔條件。進程獲得的資源在未使用之前,其他進程不得搶佔該資源。
  • 環路條件。若干個進程相互要佔有彼此的資源,形成一個環路。

8.死鎖的避免

要避免死鎖,分為靜態策略和動態策略。靜態策略主要是實現避免形成四個必要條件。而動態策略則是為進程安排一個安全的推進順序,而不限制限制進程使用資源的命令。在進程申請資源時,系統需要計算資源分配的安全性,若此次分配不會導致死鎖,則將資源分配給進程。

9.用銀行家算法避免死鎖

9.1 銀行家算法的數據結構

  1. 可利用的資源向量Available

    可利用資源向量是一個含有m個元素的數組,若Available[j] = K,表示系統中第\(R_j\)類資源還有K個。

  2. 最大需求矩陣Max

    最大需求矩陣Max是一個\(n\times m\)的矩陣,它定義了系統的n個進程對於m類資源的最大需求。

  3. 分配矩陣Allocation

    分配矩陣也是一個\(n\times m\)的矩陣,它定義了系統中每一進程已佔有的每一類資源數。

  4. 需求矩陣Need

    Need矩陣表示系統中n類進程對於m類資源需要的數量。

9.2 銀行家算法的實現

  1. 進程申請資源的情況

    設\(Requests_i\)是進程\(P_i\)的請求向量,根據\(Requests_i[i]與Need[i]\)的關係,可以分為以下三種情況:進程資源需求超過系統最大值出錯、進程一次性對其所需的資源全部申請完成、進程申請部分資源。

  2. 銀行家算法的描述

    進程\(P_i\)發出資源請求,系統請求的步驟為:

    1. 如果\(Requests_i[i] \leq Need[i]\),便轉向步驟b,否則顯示出錯。
    2. 如果\(Requests_i[i] \leq Available\),便轉向步驟c,否則表示暫無足夠資源,進程需等待。
    3. 假設系統將資源分配給P,則需修改數據結構的值如下:
      Available = Available - Requests_i;
      Allocation[i] = Allocation[i] + Requests_i;
      Need[i] = Need[i] - Requests_i;
    4. 系統執行安全性算法,如果顯示安全,則正式將資源分配給該進程,否則之前的試探分配作廢,數據解放恢復到原有的值。
  3. 安全性算法

    從上面的銀行家算法的描述可知,安全性算法是整個銀行家算法的關鍵所在。

    工作向量work表示在算法執行過程中,系統可以提供給進程繼續運行所需的各類資源數目,含有m個元素,安全算法開始時,work = Available。

    完成向量finish表示系統能否運行完成,若finish[i] = true,表示第i個進程可以運行完成。初始時,finish的各個值均為false,當有足夠的資源分配給進程i時,finish[i] = true。

    安全算法的步驟如下:

    1. 設置兩個工作向量。設置工作向量work,完成向量finish,並賦初值。
    2. 進行安全性檢查。在進程集合中尋找這樣的一個進程:

      \(finish[i] = false; Need[i] \leq work;\)

      若找得到則執行步驟c,否則執行步驟d。

    3. work = work + Allocation[i]; //這裡之所以是用“+”是因為當該進程滿足安全性時,系統直接默認該進程已經執行完成,釋放該進程的所有資源,再模擬接下來要進行的情況。同樣,在真正的分配資源,進程也要按照這個順序來執行以避免死鎖。

      finish[i] = true;

      返回步驟b。

    4. 若所有進程的finish[i] = true都滿足,則表示系統處於安全狀態,正式分配資源。否則不會進行資源分配。

    例:某系統有同類資源m個,有n個並發進程可共享該資源。則每個進程最多可申請多少個該類臨界資源才能保證不發送死鎖?

    ? 答:要保證不發生死鎖,則要求在最壞的情況下也不能發生死鎖,即n個進程同時請求最大數量的臨街資源時至少有一個進程能夠得到滿足,這樣才不會發生死鎖。

    設最大請求資源數量為x。則在最壞的情況下有:

    \[ n(x - 1) + 1 \leq m \]

10.死鎖的檢測與解除

10.1 死鎖檢測的時機

  1. 在發生資源請求時進行檢測,但是在沒有死鎖時會造成非常大的CPU開銷。
  2. 每隔一段時間,週期性的進程檢測。檢測CPU的使用率,當死鎖出現時,各進程均進入阻塞狀態,無法進入CPU執行,所以CPU的使用率下降。檢測CPU的使用率可以有效檢測到死鎖。

10.2 死鎖的檢測

  1. 資源分配圖

    系統對資源的分配可以用有向圖來表示,該圖由結對組成G = (V,E)。其中V是頂點的集合,E是有向邊的集合。頂點集合可分為進程集合P={p1,p2,p3...}和資源集合R = {r1,r2,r3....}。

    在邊集合E中,由有序結對(\(p_i,r_j\))和\((r_j,p_i)\)組成。

    \((p_i,r_j)\)叫申請邊,是進程\(p_i\)指向\(r_j\)的有向邊,表示進程\(p_i\)申請一個\(r_j\)資源單位,當前\(p_i\)正在等待

    \((r_j,p_i)\)叫賦給邊,表示有一個資源\(r_j\)已經賦給了進程\(p_i\)。

  2. 死鎖定理

    通過資源分配圖易知,當圖中出現環路時,就表示出現了死鎖。不存在則沒有死鎖。

  3. 死鎖檢測的算法
    1. 置初值,work = Available

      將不需要也不佔用資源的進程放入表L中。

    2. 從進程集合中尋找這樣的進程:

      \(requests_i \leq work\),且該進程不在表L中。

      若能找到,則將其放入L中,增加工作量:

      work = work + Allocation[i];

      返回步驟b。

    3. 若不能將所有的進程都放入L中,則發生了死鎖。需要執行死鎖的恢復策略。

10.3 死鎖的解除

一般採用兩種方式來解除死鎖:終止一個或多個進程的執行來破壞循環;搶佔參與死鎖的進程的資源。

如果經常從一個進程搶佔資源,則該進程就會經常因為資源不足而無法運行。因此一般情況下總是從執行時間短的進程搶佔資源。

在學習完死鎖後,會發現死鎖中的搶佔資源和安全的執行序列等會影響到前面講過的調度算法。在實際進程的執行過程中,需要同時考慮到這些方面。因此如果想要寫一個實際的操作系統內核的話,這一方面的內容還要繼續深入學習。

原文地址:https://www.cnblogs.com/lunar-ubuntu/p/12242969.html

时间: 2024-10-08 19:59:24

操作系統3-處理機調度與死鎖(死鎖)的相关文章

操作系統3-內存管理(分區存儲和頁式存儲)

操作系統3-內存管理(分區存儲和頁式存儲) 2. 分區存儲管理方式 分區管理的基本思想是:將內存空間氛圍一個或若干個連續的區域,稱為分區.每個分區可以存放一個獨立的用戶程序.分區的特點是一個程序可以連續地加載內存. 分區可以分為:單一分區.固定分區.可變分區和重定位分區. 2.1 單道程序的連續分配 單道程序的連續分配方式將內存分為系統區和用戶區,只能用於單用戶.單任務的操作系統. 系統區 系統區僅供操作系統使用,一般駐留在內存的低地址區,其中包括中斷向量.中斷向量是操作系統的核心功能模塊加載內

操作系統3-內存管理(頁面置換算法)

操作系統3-內存管理(頁面置換算法) 7. 頁面置換算法 在上一節講過, 換入換出頁面要根據特定的算法來執行, 這種算法就是頁面置換算法. 不合適的算法可能會使系統發生抖動,所謂抖動即指剛剛換出的頁面又要換回來,換回來不久又要換出去,這樣就導致系統的大部分工作時間都花在了頁面調度上,導致效率不高. 下面是幾種常見的頁面置換算法: 7.1 先入先出頁面置換算法 顧名思義,根據隊列的數據結構的思想,總是將內存存在最久的頁面先換出. 7.2 最近最久未使用頁面置換算法(Least Recently U

操作系統-進程管理4(線程)

操作系统-进程管理(线程) 线程 线程的基本概念 线程是比进程更小的.能够独立运行的基本单位,线程比进程能更好地提高程序的并行执行速度,充分利用多处理机的优越性.引用线程主要是为了提高系统的处理效率,减少处理机的空转时间和进行调度时因保护CPU现场浪费的时间. 线程是进程中执行运算的最小单位,即执行处理机调度的基本单位.在引入线程的操作系统中,可以在一个进程内部进行线程的切换. 进程是资源分配的基本单位,同一进程的所有线程共享该进程的所有资源.线程是分配处理机的基本单位,真正在处理机上运行的是线

操作系統-進程管理2(進程的互斥與同步)

操作系统-进程管理2(进程的同步与互斥) 进程的同步与互斥 两个或两个以上的进程不能同时使用的资源称为临界资源.临界资源的存在带来了进程之间的互斥访问的问题. 进程互斥:逻辑上完全独立.毫无关系的两个进程因为竞争同一块资源而相互制约,称为进程互斥. 进程同步:有协作关系的进程不断调整它们之间的相对速度或执行过程,以保证临界资源的合理利用和进程的顺利执行.一般借由中间媒体实现:如信号量操作.加锁操作等.同步机制应遵循的规则: 空闲让进 忙则等待 有限等待:进程等待进入临界区的时间必须是有限的,避免

幾個步驟輕鬆在windows操作系統上搭建GO語言開發環境

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流

数据库问题6-將系統資料表對應至系統檢視

(转帖)http://technet.microsoft.com/zh-tw/library/ms187997.aspx 將系統資料表對應至系統檢視 (Transact-SQL) 這個主題顯示系統資料表和函數與系統檢視和函數之間的對應. 下表將 SQL Server 2000 中 master 資料庫的系統資料表對應到 SQL Server 2008 中對應的系統檢視或函數. 系統資料表 系統檢視或函數 檢視或函數的類型 sysaltfiles sys.master_files 目錄檢視 sys

第四章 進程調度

可以參考<深入Linux內核架構>第二章閱讀筆記. 1. 調度程序的職責 負責決定那個進程投入運行,何時運行以及運行多長時間 在一組處於可運行狀態的進程中選擇一個來執行,這是調度程序的基本工作 2. 多任務操作系統就是能同時併發地交互執行多個進程的操作系統 3. 多任務系統分類 非搶佔式多任務:除非進程自己主動停止運行,否則它會一直執行.進程主動掛起自己的操作稱爲讓步(yielding). 搶佔式多任務:Linux採用了這種.搶佔的含義:由調度程序來決定什麼時候停止一個進程運行,以便其他進程能

使用 NIO.2 操作檔案系統

Java 一直到 JDK 1.3 為止,都是使用 java.io 下的類別進行 I/O 的處理,對這有興趣的鄉民,可以參考「Java I/O」,那是我 13 年前整理的 ... XD.JDK 1.4 之後提供了 NIO,到了 JDK 1.7 又加上些新的功能,稱為 NIO.2,這些類別都被放在 java.nio 下,一般來說,使用 java.nio 類別操作檔案系統,會比使用 java.io 效率來的高且方便. 在進入主題前,各位不妨先看一下我之前整理的「Working with the Pat

第五章 系統調用

1. 系統調用的作用 爲用戶空間提供了一種硬件的抽象接口.如Linux的“萬物皆文件”的思想,APP讀取文件不用關心磁盤或者文件系統的類型 保證系統的穩定和安全.因爲內核是作爲Hardware跟APP之間的中間人,可以避免APP不正確地使用Hardware,竊取其他進程的資源,或其他危害系統的事情. 實現多任務和虛擬內存的需要 2. 在Linux中,系統調用是除了異常和陷入之外,用戶空間訪問kernel的唯一手段. 3. 系統調用在出現錯誤的時候C庫會把錯誤碼寫入errno全局變量.通過調用pe