日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法

發布時間:2024/7/5 windows 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1 死鎖
        • 1.1 死鎖定義
        • 1.2 死鎖、饑餓、死循環的區別
        • 1.3 死鎖產生的必要條件
        • 1.4 什么時候會發生死鎖
        • 1.5 死鎖的處理策略
        • 1.6 死鎖的概念小結
    • 2 死鎖預防
        • 2.1 破壞互斥條件
        • 2.2 破壞不剝奪條件
        • 2.3 破壞請求和保持條件
        • 2.4 破壞循環等待條件
        • 2.5 預防死鎖小結
    • 3 死鎖避免
        • 3.1 安全序列
        • 3.2 銀行家算法
          • 3.2.1 手動實現銀行家算法
          • 3.2.2 銀行家算法描述
    • 4 死鎖的檢測和解除
        • 4.1 死鎖的檢測
        • 4.2 死鎖的避免
        • 4.3 死鎖的檢測與避免小結

1 死鎖

1.1 死鎖定義

產生條件:每個人都占有一個資源,同時又在等待另一個人手里的資源。發生“死鎖”

在并發環境下,各進程因競爭資源而造成的一種互相等待對方手里的資源,導致各進程都阻塞,都無法向前推進的現象,這就是“死鎖”。發生死鎖后若無外力干涉,這些進程都將無法向前推進。

1.2 死鎖、饑餓、死循環的區別

  • 死鎖:各進程互相等待對方手里的資源,導致各進程都阻塞,無法向前推進的現象。
  • 饑餓:由于長期得不到想要的資源,某進程無法向前推進的現象。比如:在短進程優先(SPF)算法中,若有源源不斷的短進程到來,則長進程將一直得不到處理機,從而發生長進程“饑餓”。
  • 死循環:某進程執行過程中一直跳不出某個循環的現象。有時是因為程序邏輯bug導致的,有時是程序員故意設計的。
  • 1.3 死鎖產生的必要條件

    產生死鎖必須同時滿足一下四個條件,只要其中任一條件不成立,死鎖就不會發生。

  • 互斥條件:只有對必須互斥使用的資源的爭搶才會導致死鎖(如哲學家的筷子、打印機設備)。像內存、揚聲器這樣可以同時讓多個進程使用的資源是不會導致死鎖的(因為進程不用阻塞等待這種資源)。
  • 不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放。
  • 請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他進程占有,此時請求進程被阻塞,但又對自己已有的資源保持不放。
  • 循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程所請求。
  • 注意:

  • 發生死鎖時一定有循環等待,但是發生循環等待時未必死鎖(循環等待是死鎖的必要不充分條件)
  • 如果同類資源數大于1,則即使有循環等待,也未必發生死鎖。但如果系統中每類資源都只有一個,那循環等待就是死鎖的充分必要條件了。
  • 1.4 什么時候會發生死鎖

  • 對系統資源的競爭。
  • 各進程對不可剝奪的資源(如打印機)的競爭可能引起死鎖,對可剝奪的資源(CPU)的競爭是不會引起死鎖的。

  • 進程推進順序非法
  • 請求和釋放資源的順序不當,也會導致死鎖。例如,并發執行的進程P1、P2分別申請并占用了資源R1、R2,之后進程P1又緊接著申請資源R2,而進程P2又申請資源R1,兩者會因為申請的資源被對方占有而阻塞,從而發生死鎖

  • 信號量使用不當
  • 在生產者-消費者問題中,若實現互斥的P操作在實現同步的P操作之前,就有可能導致死鎖。(可以把互斥信號量、同步信號量也看做是一種抽象的系統資源)

    總之,對不可剝奪資源的不合理分配,可能導致死鎖。

    1.5 死鎖的處理策略

  • 預防死鎖。破壞死鎖產生的四個必要條件中的一個或幾個。
  • 避免死鎖。用某種方法防止系統進入不安全狀態,從而避免死鎖(銀行家算法)。
  • 死鎖的檢測和解除。允許死鎖的發生,不過操作系統會負責檢測出死鎖的發生,然后采取某種措施解除死鎖。
  • 1.6 死鎖的概念小結

    2 死鎖預防

    2.1 破壞互斥條件

    互斥條件:只有對必須互斥使用的資源的爭搶才會導致死鎖。

    如果把只能互斥使用的資源改造為允許共享使用,則系統不會進入死鎖狀態。比如:SPOOLing技術。 操作系統可以采用SPOOLing 技術把獨占設備在邏輯上改造成共享設備。比如,用SPOOLing技術將打印機改造為共享設備…

    該策略的缺點:
    并不是所有的資源都可以改造成可共享使用的資源。并且為了系統安全,很多地方還必須保護這種互斥性。因此,很多時候都無法破壞互斥條件。

    2.2 破壞不剝奪條件

    不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放。
    破壞不剝奪條件:

    方案一:當某個進程請求新的資源得不到滿足時,它必須立即釋放保持的所有資源,待以后需要時再重新申請。也就是說,即使某些資源尚未使用完,也需要主動釋放,從而破壞了不可剝奪條件

    方案二:當某個進程需要的資源被其他進程所占有的時候,可以由操作系統協助,將想要的資源強行剝奪。這種方式一般需要考慮各進程的優先級(比如:剝奪調度方式,就是將處理機資源強行剝奪給優先級更高的進程使用)

    該策略的缺點:

  • 實現起來比較復雜。
  • 釋放已獲得的資源可能造成前一階段工作的失效。因此這種方法一般只適用于易保存和恢復狀態的資源,如CPU。
  • 反復地申請和釋放資源會增加系統開銷,降低系統吞吐量。
  • 若采用方案一,意味著只要暫時得不到某個資源,之前獲得的那些資源就都需要放棄,以后再重新申請。如果一直發生這樣的情況,就會導致進程饑餓
  • 2.3 破壞請求和保持條件

    請求和保持條件:進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其他進程占有,此時請求進程被阻塞,但又對自己已有的資源保持不放。

    可以采用靜態分配方法,即進程在運行前一次申請完它所需要的全部資源,在它的資源未滿足前, 不讓它投入運行。一旦投入運行后,這些資源就一直歸它所有,該進程就不會再請求別的任何資源了。

    該策略實現起來簡單,但也有明顯的缺點: 有些資源可能只需要用很短的時間,因此如果進程的整個運行期間都一直保持著所有資源,就會造成嚴重的資源浪費資源利用率極低。另外,該策略也有可能導致某些進程饑餓

    2.4 破壞循環等待條件

    循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程所請求。

    可采用順序資源分配法。首先給系統中的資源編號,規定每個進程必須按編號遞增的順序請求資源, 同類資源(即編號相同的資源)一次申請完。

    原理分析:一個進程只有已占有小編號的資源時,才有資格申請更大編號的資源。按此規則,已持有大編號資源的進程不可能逆向地回來申請小編號的資源,從而就不會產生循環等待的現象。

    該策略的缺點:

  • 不方便增加新的設備,因為可能需要重新分配所有的編號;
  • 進程實際使用資源的順序可能和編號遞增順序不一致,會導致資源浪費;
  • 必須按規定次序申請資源,用戶編程麻煩。
  • 2.5 預防死鎖小結

    3 死鎖避免

    3.1 安全序列

    所謂安全序列,就是指如果系統按照這種序列分配資源,則每個進程都能順利完成。只要能找出一個安全序列,系統就是安全狀態。當然,安全序列可能有多個。

    如果分配了資源之后,系統中找不出任何一個安全序列,系統就進入了不安全狀態。這就意味著之后可能所有進程都無法順利的執行下去。當然,如果有進程提前歸還了一些資源,那系統也有可能重新回到安全狀態,不過我們在分配資源之前總是要考慮到最壞的情況。

    如果系統處于安全狀態,就一定不會發生死鎖,如果系統進入不安全,就可能發生死鎖(處于不安全狀態未必就是發生了死鎖,但發生死鎖時一定是在不安全狀態)
    因此可以在資源分配之前預先判斷這次分配是否會導致系統進入不安全狀態,以此決定是否答應資源分配請求。這也是“銀行家算法”的核心思想。

    3.2 銀行家算法

    核心思想:在進程提出資源申請時,先預判此次分配是否會導致系統進入不安全狀態。如果會進入不安全狀態,就暫時不答應這次請求,讓該進程先阻塞等待。

    思考:在計算機系統中會有多種多樣的資源,如何用銀行家算法多種資源的分配情況呢?

    3.2.1 手動實現銀行家算法

    可以把多種資源拓展為多維的向量。比如:系統中有5個進程PO~P4,3種資源RO~R2,初始數量為(10,5,7),則某一時刻的情況可表示如下:

    進程最大需求已分配
    P0(7,5,3)(0,1,0)
    P1(3,2,2)(2,0,0)
    P2(9,0,2)(3,0,2)
    P3(2,2,2)(2,1,1)
    P4(4,3,3)(0,0,2)

    此時總共已分配(7,2,5),還剩余(3,3,2)
    可把最大需求、已分配的數據看作矩陣,兩矩陣相減,就可算出各進程最多還需要多少資源了

    進程最大需求已分配最多還需要
    P0(7,5,3)(0,1,0)(7,4,3)
    P1(3,2,2)(2,0,0)(1,2,2)
    P2(9,0,2)(3,0,2)(6,0,0)
    P3(2,2,2)(2,1,1)(0,1,1)
    P4(4,3,3)(0,0,2)(4,3,1)

    思考:此時系統是否處于安全狀態?

    思路:嘗試找出一個安全序列…

  • 依次檢查剩余可用資源(3,3,2)是否能滿足各進程的需求:
  • (3,3,2)<(7,4,3),不滿足P0需求,所以將P0阻塞
  • (3,3,2)>(1,2,2),可滿足P1需求,將P1加入安全序列,并更新剩余可用資源值為(2,0,0)+(3,3,2)=(5,3,2)
  • 依次檢查剩余可用資源(5,3,2)是否能滿足剩余進程(不包括已加入安全序列的進程P1)的需求:
  • (5,3,2)<(7,4,3)且(5,3,2)<(6,0,0)所以P0、P2不滿足需求,繼續阻塞
  • (0,1,1)<(5,3,2),P3滿足需求,說明如果優先把資源分配給P3,那P3一定是可以順利執行結束的。等P3結束了就會歸還資源。于是,資源數就可以增加到
    (2,1,1)+(5,3,2)=(7,4,3)
  • 依次檢查剩余可用資源(7,4,3)是否能滿足剩余進程(不包括已加入安全序列P1、P3的進程)的需求:
  • (7,4,3)=(7,4,3),此時P0滿足需求,加入安全序列,等P0結束了就會歸還資源。于是,資源數就可以增加到(0,1,0)+(7,4,3)=(7,5,3)
  • 依次檢查剩余可用資源(7,5,3)是否能滿足剩余進程(不包括已加入安全序列P1、P3、P0的進程)的需求:
  • (7,5,3)>(6,0,0),此時P2滿足需求,加入安全序列,等P2結束了就會歸還資源。于是,資源數就可以增加到(3,0,2)+(7,5,3)=(10,5,5)

  • 依次檢查剩余可用資源(10,5,5)是否能滿足剩余進程(不包括已加入安全序列P1、P3、P0、P2的進程)的需求:
  • (10,5,3)>(4,3,0),此時P4滿足需求,加入安全序列,等P4結束了就會歸還資源。于是,資源數就可以增加到(0,0,2)+(10,5,3)=(10,5,7),恢復到原來初始數量。

    以此類推,共五次循環檢查即可將5個進程都加入安全序列中,最終可得一個安全序列。本次安全系列即:P1、P3、P0、P2、P4。

    該算法稱為安全性算法,可以很方便地用代碼實現以上流程,每一輪檢查都從編號較小的進程開始檢查。


    實際做題時可以更快速的得到安全序列。
    資源總數(10,5,7),剩余可用資源(10,5,7)-(7,2,5)=(3,3,2)

    進程最大需求已分配最多還需要
    P0(7,5,3)(0,1,0)(7,4,3)
    P1(3,2,2)(2,0,0)(1,2,2)
    P2(9,0,2)(3,0,2)(6,0,0)
    P3(2,2,2)(2,1,1)(0,1,1)
    P4(4,3,3)(0,0,2)(4,3,1)

    經對比發現,(3,3,2)可滿足P1、P3,說明無論如何,這兩個進程的資源需求一定是可以依次被滿足的,因此P1、P3一定可以順利的執行完,并歸還資源。可把P1、P3先加入安全序列。
    (2,0,0)+(2,1,1)+(3,3,2)=(7,4,3)

    去除P1、P3,分析PO、P2、P4
    資源總數(10,5,7),剩余可用資源(7,4,3)

    進程最大需求已分配最多還需要
    P0(7,5,3)(0,1,0)(7,4,3)
    P2(9,0,2)(3,0,2)(6,0,0)
    P4(4,3,3)(0,0,2)(4,3,1)

    剩下的PO、P2、P4都可被滿足。同理,這些進程都可以加入安全序列。
    于是,5個進程全部加入安全序列,說明此時系統處于安全狀態,暫不可能發生死鎖。

    3.2.2 銀行家算法描述

    假設系統中有n個進程,m種資源
    每個進程在運行前先聲明對各種資源的最大需求數,則可用一個n*m的矩陣(可用二維數組實現)表示所有進程對各種資源的最大需求數。
    不妨稱為最大需求矩陣Max,Max[i,j]=K表示進程Pi最多需要K個資源Rj。同理,系統可以用一個n*m的分配矩陣Allocation表示對所有進程的資源分配情況。Max-Allocation= Need矩陣,表示各進程最多還需要多少各類資源。
    另外,還要用一個長度為m的一維數組Available表示當前系統中還有多少可用資源。

    某進程Pi向系統申請資源,可用一個長度為m的一維數組Request;表示本次申請的各種資源量。

    可用銀行家算法預判本次分配是否會導致系統進入不安全狀態:

  • 如果Requesti[j]<=c(0<=j<=m),便轉向2,否則認為出錯
  • 如果Requesti[j]<=Availavle(0<=j<=m),便轉向3;否則表示尚無足夠資源,Pi必須等待
  • 系統試探著把資源分配給Pi,并修改響應的數據(并非真的分配,修改只是為了做預判)
  • Availavle=Availavle-Request;Allocation[i,j]=Allocation[i,j]+Request[i,j];Need[i,j]=Need[i,j]-Requesti[j]
  • OS執行安全性算法,檢查此次資源分配后,系統是否處于安全狀態,若安全,才正式分配;否則,恢復相應數據,讓進程阻塞等待
  • 銀行家算法數據結構:

    • 長度為m的一維數組Available表示還有多少可用資源
    • n*m矩陣Max表示各進程對資源的最大需求數
    • n*m矩陣Allocation表示已經給各進程分配了多少資源
    • Max-Allocation=Need矩陣表示各進程最多還需要多少資源
    • 用長度為m的一位數組Request表示進程此次申請的各種資源數

    銀行家算法步驟:

  • 檢查此次申請是否超過了之前聲明的最大需求數
  • 檢查此時系統剩余的可用資源是否還能滿足這次請求
  • 試探著分配,更改各數據結構
  • 用安全性算法檢查此次分配是否會導致系統進入不安全狀態
  • 安全性算法步驟:

  • 檢查當前的剩余可用資源是否能滿足某個進程的最大需求,如果可以,就把該進程加入安全序列,并把該進程持有的資源全部回收。
  • 不斷重復上述過程,看最終是否能讓所有進程都加入安全序列。
  • 系統處于不安全狀態未必死鎖,但死鎖時一定處于不安全狀態。系統處于安全狀態一定不會死鎖。

    4 死鎖的檢測和解除

    4.1 死鎖的檢測

    為了能對系統是否已發生了死鎖進行檢測,必須:

  • 用某種數據結構來保存資源的請求和分配信息;
  • 提供一種算法,利用上述信息來檢測系統是否已進入死鎖狀態。

  • R2資源有2個,R1資源有3個,P1進程請求1個R2資源,P2進程請求1個R1資源,R1給P1分配了兩個資源,R1給P2進程分配了1個資源,R2給P2進程分配了兩個資源

    以下就是圖的表示:

    如何由圖形判斷系統是否處于死鎖狀態?

  • 如果系統中剩余的可用資源數足夠滿足進程的需求,那么這個進程暫時是不會阻塞的,可以順利地執行下去。
  • 上圖中P1進程僅請求1個R2資源,而R2資源只分配出去了1個,而R2資源有2個,所以還有一個空閑可分配給P1,P1進程此次請求可以被滿足,因此不會被阻塞,可以順利執行下去;
    P2進程請求1個R1資源,而R1的3個資源都被分配出去了,無空閑可分配給P2,P1進程此次請求不可以被滿足,因此會被阻塞,無法順利執行下去。

  • 如果這個進程執行結束了把資源歸還系統,就可能使某些正在等待資源的進程被激活,并順利地執行下去。
  • 相應的,這些被激活的進程執行完了之后又會歸還一些資源,這樣可能又會激活另外一些阻塞的進程…
  • P1執行完畢,把所有資源歸還系統,不會在申請資源,可以將P1進程所連的邊抹去

    此時P2可以申請1個R1資源,P2進程被喚醒執行,執行完畢后,歸還系統資源,并且不對任何一種資源提出請求,將P2進程所連的邊抹去

  • 如果按上述過程分析,最終能消除所有邊,就稱這個圖是可完全簡化的 。此時一定沒有發生死鎖(相當于能找到一個安全序列)
  • 如果最終不能消除所有邊,那么此時就是發生了死鎖

    P1要申請2個R2資源,此時R2無空閑可分配,P2要請求1個R1資源,此時R1無空閑可分配,P3可順利執行,執行完畢歸還1個R2,此時R2有1個空閑資源,但P1申請仍然阻塞,同樣P2也被阻塞

    最終還連著邊的那些進程就是處于死鎖狀態的進程。
    所以P3進程不是死鎖進程,P1、P2進程是死鎖進程

    檢測死鎖的算法:

  • 在資源分配圖中,找出既不阻塞又不是孤點(與之至少有1個邊相連)的進程Pi
    (即找出一條有向邊與它相連,且該向邊對應資源的申請數量小于等于系統中已有空閑資源數量。
    如下圖中,R1沒有空閑資源,R2有 1個空閑資源。若所有的連接該進程的邊均滿足上述條件,則這個進程能繼續運行直至完成,然后釋放它所占有的所有資源)。消去它所有的請求邊和分配邊,使之稱為孤立的結點。在下圖中, P1是滿足這一條件的進程結點,于是將P1的所有邊消去。
  • 進程Pi所釋放的資源,可以喚醒某些因等待這些資源而阻塞的進程,原來的阻塞進程可能變為非阻塞進程。在下圖中,P2就滿足這樣的條件。根據1中的方法進行一系列簡化后,若能消去途中所有的邊,則稱該圖是可完全簡化的。
  • 4.2 死鎖的避免

    一旦檢測出死鎖的發生,就應該立即解除死鎖。
    并不是系統中所有的進程都是死鎖狀態,用死鎖檢測算法化簡資源分配圖后,還連著邊的那些進程就是死鎖進程

    解除死鎖的主要方法有:

  • 資源剝奪法。掛起(暫時放到外存上)某些死鎖進程,并搶占它的資源,將這些資源分配給其他的死鎖進程。但是應防止被掛起的進程長時間得不到資源而饑餓。
  • 撤銷進程法(或稱終止進程法)。強制撤銷部分、甚至全部死鎖進程,并剝奪這些進程的資源。這種方式的優點是實現簡單,但所付出的代價可能會很大。因為有些進程可能已經運行了很長時間,已經接近結束了,一旦被終止可謂功虧一簣,以后還得從頭再來。
  • 進程回退法。讓一個或多個死鎖進程回退到足以避免死鎖的地步。這就要求系統要記錄進程的歷史信息,設置還原點。
  • 如何決定對哪一進程實現以上3個方法解除死鎖呢?
    從以下5個角度考慮:

  • 進程優先級
  • 已執行多長時間
  • 還要多久能完成
  • 進程已經使用了多少資源
  • 進程是交互式的還是批處 理式的
  • 4.3 死鎖的檢測與避免小結

    總結

    以上是生活随笔為你收集整理的10 操作系统第二章 进程管理 死锁、死锁的处理策略 银行家算法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。