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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

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

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

文章目錄

    • 1 死鎖
        • 1.1 死鎖定義
        • 1.2 死鎖、饑餓、死循環(huán)的區(qū)別
        • 1.3 死鎖產(chǎn)生的必要條件
        • 1.4 什么時(shí)候會(huì)發(fā)生死鎖
        • 1.5 死鎖的處理策略
        • 1.6 死鎖的概念小結(jié)
    • 2 死鎖預(yù)防
        • 2.1 破壞互斥條件
        • 2.2 破壞不剝奪條件
        • 2.3 破壞請(qǐng)求和保持條件
        • 2.4 破壞循環(huán)等待條件
        • 2.5 預(yù)防死鎖小結(jié)
    • 3 死鎖避免
        • 3.1 安全序列
        • 3.2 銀行家算法
          • 3.2.1 手動(dòng)實(shí)現(xiàn)銀行家算法
          • 3.2.2 銀行家算法描述
    • 4 死鎖的檢測(cè)和解除
        • 4.1 死鎖的檢測(cè)
        • 4.2 死鎖的避免
        • 4.3 死鎖的檢測(cè)與避免小結(jié)

1 死鎖

1.1 死鎖定義

產(chǎn)生條件:每個(gè)人都占有一個(gè)資源,同時(shí)又在等待另一個(gè)人手里的資源。發(fā)生“死鎖”

在并發(fā)環(huán)境下,各進(jìn)程因競(jìng)爭(zhēng)資源而造成的一種互相等待對(duì)方手里的資源,導(dǎo)致各進(jìn)程都阻塞,都無(wú)法向前推進(jìn)的現(xiàn)象,這就是“死鎖”。發(fā)生死鎖后若無(wú)外力干涉,這些進(jìn)程都將無(wú)法向前推進(jìn)。

1.2 死鎖、饑餓、死循環(huán)的區(qū)別

  • 死鎖:各進(jìn)程互相等待對(duì)方手里的資源,導(dǎo)致各進(jìn)程都阻塞,無(wú)法向前推進(jìn)的現(xiàn)象。
  • 饑餓:由于長(zhǎng)期得不到想要的資源,某進(jìn)程無(wú)法向前推進(jìn)的現(xiàn)象。比如:在短進(jìn)程優(yōu)先(SPF)算法中,若有源源不斷的短進(jìn)程到來(lái),則長(zhǎng)進(jìn)程將一直得不到處理機(jī),從而發(fā)生長(zhǎng)進(jìn)程“饑餓”。
  • 死循環(huán):某進(jìn)程執(zhí)行過(guò)程中一直跳不出某個(gè)循環(huán)的現(xiàn)象。有時(shí)是因?yàn)槌绦蜻壿媌ug導(dǎo)致的,有時(shí)是程序員故意設(shè)計(jì)的。
  • 1.3 死鎖產(chǎn)生的必要條件

    產(chǎn)生死鎖必須同時(shí)滿足一下四個(gè)條件,只要其中任一條件不成立,死鎖就不會(huì)發(fā)生。

  • 互斥條件:只有對(duì)必須互斥使用的資源的爭(zhēng)搶才會(huì)導(dǎo)致死鎖(如哲學(xué)家的筷子、打印機(jī)設(shè)備)。像內(nèi)存、揚(yáng)聲器這樣可以同時(shí)讓多個(gè)進(jìn)程使用的資源是不會(huì)導(dǎo)致死鎖的(因?yàn)檫M(jìn)程不用阻塞等待這種資源)。
  • 不剝奪條件:進(jìn)程所獲得的資源在未使用完之前,不能由其他進(jìn)程強(qiáng)行奪走,只能主動(dòng)釋放。
  • 請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源又被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但又對(duì)自己已有的資源保持不放。
  • 循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈,鏈中的每一個(gè)進(jìn)程已獲得的資源同時(shí)被下一個(gè)進(jìn)程所請(qǐng)求。
  • 注意:

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

  • 對(duì)系統(tǒng)資源的競(jìng)爭(zhēng)。
  • 各進(jìn)程對(duì)不可剝奪的資源(如打印機(jī))的競(jìng)爭(zhēng)可能引起死鎖,對(duì)可剝奪的資源(CPU)的競(jìng)爭(zhēng)是不會(huì)引起死鎖的。

  • 進(jìn)程推進(jìn)順序非法
  • 請(qǐng)求和釋放資源的順序不當(dāng),也會(huì)導(dǎo)致死鎖。例如,并發(fā)執(zhí)行的進(jìn)程P1、P2分別申請(qǐng)并占用了資源R1、R2,之后進(jìn)程P1又緊接著申請(qǐng)資源R2,而進(jìn)程P2又申請(qǐng)資源R1,兩者會(huì)因?yàn)樯暾?qǐng)的資源被對(duì)方占有而阻塞,從而發(fā)生死鎖

  • 信號(hào)量使用不當(dāng)
  • 在生產(chǎn)者-消費(fèi)者問題中,若實(shí)現(xiàn)互斥的P操作在實(shí)現(xiàn)同步的P操作之前,就有可能導(dǎo)致死鎖。(可以把互斥信號(hào)量、同步信號(hào)量也看做是一種抽象的系統(tǒng)資源)

    總之,對(duì)不可剝奪資源的不合理分配,可能導(dǎo)致死鎖。

    1.5 死鎖的處理策略

  • 預(yù)防死鎖。破壞死鎖產(chǎn)生的四個(gè)必要條件中的一個(gè)或幾個(gè)。
  • 避免死鎖。用某種方法防止系統(tǒng)進(jìn)入不安全狀態(tài),從而避免死鎖(銀行家算法)。
  • 死鎖的檢測(cè)和解除。允許死鎖的發(fā)生,不過(guò)操作系統(tǒng)會(huì)負(fù)責(zé)檢測(cè)出死鎖的發(fā)生,然后采取某種措施解除死鎖。
  • 1.6 死鎖的概念小結(jié)

    2 死鎖預(yù)防

    2.1 破壞互斥條件

    互斥條件:只有對(duì)必須互斥使用的資源的爭(zhēng)搶才會(huì)導(dǎo)致死鎖。

    如果把只能互斥使用的資源改造為允許共享使用,則系統(tǒng)不會(huì)進(jìn)入死鎖狀態(tài)。比如:SPOOLing技術(shù)。 操作系統(tǒng)可以采用SPOOLing 技術(shù)把獨(dú)占設(shè)備在邏輯上改造成共享設(shè)備。比如,用SPOOLing技術(shù)將打印機(jī)改造為共享設(shè)備…

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

    2.2 破壞不剝奪條件

    不剝奪條件:進(jìn)程所獲得的資源在未使用完之前,不能由其他進(jìn)程強(qiáng)行奪走,只能主動(dòng)釋放。
    破壞不剝奪條件:

    方案一:當(dāng)某個(gè)進(jìn)程請(qǐng)求新的資源得不到滿足時(shí),它必須立即釋放保持的所有資源,待以后需要時(shí)再重新申請(qǐng)。也就是說(shuō),即使某些資源尚未使用完,也需要主動(dòng)釋放,從而破壞了不可剝奪條件

    方案二:當(dāng)某個(gè)進(jìn)程需要的資源被其他進(jìn)程所占有的時(shí)候,可以由操作系統(tǒng)協(xié)助,將想要的資源強(qiáng)行剝奪。這種方式一般需要考慮各進(jìn)程的優(yōu)先級(jí)(比如:剝奪調(diào)度方式,就是將處理機(jī)資源強(qiáng)行剝奪給優(yōu)先級(jí)更高的進(jìn)程使用)

    該策略的缺點(diǎn):

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

    請(qǐng)求和保持條件:進(jìn)程已經(jīng)保持了至少一個(gè)資源,但又提出了新的資源請(qǐng)求,而該資源又被其他進(jìn)程占有,此時(shí)請(qǐng)求進(jìn)程被阻塞,但又對(duì)自己已有的資源保持不放。

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

    該策略實(shí)現(xiàn)起來(lái)簡(jiǎn)單,但也有明顯的缺點(diǎn): 有些資源可能只需要用很短的時(shí)間,因此如果進(jìn)程的整個(gè)運(yùn)行期間都一直保持著所有資源,就會(huì)造成嚴(yán)重的資源浪費(fèi)資源利用率極低。另外,該策略也有可能導(dǎo)致某些進(jìn)程饑餓

    2.4 破壞循環(huán)等待條件

    循環(huán)等待條件:存在一種進(jìn)程資源的循環(huán)等待鏈,鏈中的每一個(gè)進(jìn)程已獲得的資源同時(shí)被下一個(gè)進(jìn)程所請(qǐng)求。

    可采用順序資源分配法。首先給系統(tǒng)中的資源編號(hào),規(guī)定每個(gè)進(jìn)程必須按編號(hào)遞增的順序請(qǐng)求資源, 同類資源(即編號(hào)相同的資源)一次申請(qǐng)完。

    原理分析:一個(gè)進(jìn)程只有已占有小編號(hào)的資源時(shí),才有資格申請(qǐng)更大編號(hào)的資源。按此規(guī)則,已持有大編號(hào)資源的進(jìn)程不可能逆向地回來(lái)申請(qǐng)小編號(hào)的資源,從而就不會(huì)產(chǎn)生循環(huán)等待的現(xiàn)象。

    該策略的缺點(diǎn):

  • 不方便增加新的設(shè)備,因?yàn)榭赡苄枰匦路峙渌械木幪?hào);
  • 進(jìn)程實(shí)際使用資源的順序可能和編號(hào)遞增順序不一致,會(huì)導(dǎo)致資源浪費(fèi);
  • 必須按規(guī)定次序申請(qǐng)資源,用戶編程麻煩。
  • 2.5 預(yù)防死鎖小結(jié)

    3 死鎖避免

    3.1 安全序列

    所謂安全序列,就是指如果系統(tǒng)按照這種序列分配資源,則每個(gè)進(jìn)程都能順利完成。只要能找出一個(gè)安全序列,系統(tǒng)就是安全狀態(tài)。當(dāng)然,安全序列可能有多個(gè)。

    如果分配了資源之后,系統(tǒng)中找不出任何一個(gè)安全序列,系統(tǒng)就進(jìn)入了不安全狀態(tài)。這就意味著之后可能所有進(jìn)程都無(wú)法順利的執(zhí)行下去。當(dāng)然,如果有進(jìn)程提前歸還了一些資源,那系統(tǒng)也有可能重新回到安全狀態(tài),不過(guò)我們?cè)诜峙滟Y源之前總是要考慮到最壞的情況。

    如果系統(tǒng)處于安全狀態(tài),就一定不會(huì)發(fā)生死鎖,如果系統(tǒng)進(jìn)入不安全,就可能發(fā)生死鎖(處于不安全狀態(tài)未必就是發(fā)生了死鎖,但發(fā)生死鎖時(shí)一定是在不安全狀態(tài))
    因此可以在資源分配之前預(yù)先判斷這次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),以此決定是否答應(yīng)資源分配請(qǐng)求。這也是“銀行家算法”的核心思想。

    3.2 銀行家算法

    核心思想:在進(jìn)程提出資源申請(qǐng)時(shí),先預(yù)判此次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài)。如果會(huì)進(jìn)入不安全狀態(tài),就暫時(shí)不答應(yīng)這次請(qǐng)求,讓該進(jìn)程先阻塞等待。

    思考:在計(jì)算機(jī)系統(tǒng)中會(huì)有多種多樣的資源,如何用銀行家算法多種資源的分配情況呢?

    3.2.1 手動(dòng)實(shí)現(xiàn)銀行家算法

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

    進(jìn)程最大需求已分配
    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)

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

    進(jìn)程最大需求已分配最多還需要
    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)

    思考:此時(shí)系統(tǒng)是否處于安全狀態(tài)?

    思路:嘗試找出一個(gè)安全序列…

  • 依次檢查剩余可用資源(3,3,2)是否能滿足各進(jìn)程的需求:
  • (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)是否能滿足剩余進(jìn)程(不包括已加入安全序列的進(jìn)程P1)的需求:
  • (5,3,2)<(7,4,3)且(5,3,2)<(6,0,0)所以P0、P2不滿足需求,繼續(xù)阻塞
  • (0,1,1)<(5,3,2),P3滿足需求,說(shuō)明如果優(yōu)先把資源分配給P3,那P3一定是可以順利執(zhí)行結(jié)束的。等P3結(jié)束了就會(huì)歸還資源。于是,資源數(shù)就可以增加到
    (2,1,1)+(5,3,2)=(7,4,3)
  • 依次檢查剩余可用資源(7,4,3)是否能滿足剩余進(jìn)程(不包括已加入安全序列P1、P3的進(jìn)程)的需求:
  • (7,4,3)=(7,4,3),此時(shí)P0滿足需求,加入安全序列,等P0結(jié)束了就會(huì)歸還資源。于是,資源數(shù)就可以增加到(0,1,0)+(7,4,3)=(7,5,3)
  • 依次檢查剩余可用資源(7,5,3)是否能滿足剩余進(jìn)程(不包括已加入安全序列P1、P3、P0的進(jìn)程)的需求:
  • (7,5,3)>(6,0,0),此時(shí)P2滿足需求,加入安全序列,等P2結(jié)束了就會(huì)歸還資源。于是,資源數(shù)就可以增加到(3,0,2)+(7,5,3)=(10,5,5)

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

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

    該算法稱為安全性算法,可以很方便地用代碼實(shí)現(xiàn)以上流程,每一輪檢查都從編號(hào)較小的進(jìn)程開始檢查。


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

    進(jìn)程最大需求已分配最多還需要
    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)

    經(jīng)對(duì)比發(fā)現(xiàn),(3,3,2)可滿足P1、P3,說(shuō)明無(wú)論如何,這兩個(gè)進(jìn)程的資源需求一定是可以依次被滿足的,因此P1、P3一定可以順利的執(zhí)行完,并歸還資源。可把P1、P3先加入安全序列。
    (2,0,0)+(2,1,1)+(3,3,2)=(7,4,3)

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

    進(jìn)程最大需求已分配最多還需要
    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都可被滿足。同理,這些進(jìn)程都可以加入安全序列。
    于是,5個(gè)進(jìn)程全部加入安全序列,說(shuō)明此時(shí)系統(tǒng)處于安全狀態(tài),暫不可能發(fā)生死鎖。

    3.2.2 銀行家算法描述

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

    某進(jìn)程Pi向系統(tǒng)申請(qǐng)資源,可用一個(gè)長(zhǎng)度為m的一維數(shù)組Request;表示本次申請(qǐng)的各種資源量。

    可用銀行家算法預(yù)判本次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài):

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

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

    銀行家算法步驟:

  • 檢查此次申請(qǐng)是否超過(guò)了之前聲明的最大需求數(shù)
  • 檢查此時(shí)系統(tǒng)剩余的可用資源是否還能滿足這次請(qǐng)求
  • 試探著分配,更改各數(shù)據(jù)結(jié)構(gòu)
  • 用安全性算法檢查此次分配是否會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài)
  • 安全性算法步驟:

  • 檢查當(dāng)前的剩余可用資源是否能滿足某個(gè)進(jìn)程的最大需求,如果可以,就把該進(jìn)程加入安全序列,并把該進(jìn)程持有的資源全部回收。
  • 不斷重復(fù)上述過(guò)程,看最終是否能讓所有進(jìn)程都加入安全序列。
  • 系統(tǒng)處于不安全狀態(tài)未必死鎖,但死鎖時(shí)一定處于不安全狀態(tài)。系統(tǒng)處于安全狀態(tài)一定不會(huì)死鎖。

    4 死鎖的檢測(cè)和解除

    4.1 死鎖的檢測(cè)

    為了能對(duì)系統(tǒng)是否已發(fā)生了死鎖進(jìn)行檢測(cè),必須:

  • 用某種數(shù)據(jù)結(jié)構(gòu)來(lái)保存資源的請(qǐng)求和分配信息;
  • 提供一種算法,利用上述信息來(lái)檢測(cè)系統(tǒng)是否已進(jìn)入死鎖狀態(tài)。

  • R2資源有2個(gè),R1資源有3個(gè),P1進(jìn)程請(qǐng)求1個(gè)R2資源,P2進(jìn)程請(qǐng)求1個(gè)R1資源,R1給P1分配了兩個(gè)資源,R1給P2進(jìn)程分配了1個(gè)資源,R2給P2進(jìn)程分配了兩個(gè)資源

    以下就是圖的表示:

    如何由圖形判斷系統(tǒng)是否處于死鎖狀態(tài)?

  • 如果系統(tǒng)中剩余的可用資源數(shù)足夠滿足進(jìn)程的需求,那么這個(gè)進(jìn)程暫時(shí)是不會(huì)阻塞的,可以順利地執(zhí)行下去。
  • 上圖中P1進(jìn)程僅請(qǐng)求1個(gè)R2資源,而R2資源只分配出去了1個(gè),而R2資源有2個(gè),所以還有一個(gè)空閑可分配給P1,P1進(jìn)程此次請(qǐng)求可以被滿足,因此不會(huì)被阻塞,可以順利執(zhí)行下去;
    P2進(jìn)程請(qǐng)求1個(gè)R1資源,而R1的3個(gè)資源都被分配出去了,無(wú)空閑可分配給P2,P1進(jìn)程此次請(qǐng)求不可以被滿足,因此會(huì)被阻塞,無(wú)法順利執(zhí)行下去。

  • 如果這個(gè)進(jìn)程執(zhí)行結(jié)束了把資源歸還系統(tǒng),就可能使某些正在等待資源的進(jìn)程被激活,并順利地執(zhí)行下去。
  • 相應(yīng)的,這些被激活的進(jìn)程執(zhí)行完了之后又會(huì)歸還一些資源,這樣可能又會(huì)激活另外一些阻塞的進(jìn)程…
  • P1執(zhí)行完畢,把所有資源歸還系統(tǒng),不會(huì)在申請(qǐng)資源,可以將P1進(jìn)程所連的邊抹去

    此時(shí)P2可以申請(qǐng)1個(gè)R1資源,P2進(jìn)程被喚醒執(zhí)行,執(zhí)行完畢后,歸還系統(tǒng)資源,并且不對(duì)任何一種資源提出請(qǐng)求,將P2進(jìn)程所連的邊抹去

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

    P1要申請(qǐng)2個(gè)R2資源,此時(shí)R2無(wú)空閑可分配,P2要請(qǐng)求1個(gè)R1資源,此時(shí)R1無(wú)空閑可分配,P3可順利執(zhí)行,執(zhí)行完畢歸還1個(gè)R2,此時(shí)R2有1個(gè)空閑資源,但P1申請(qǐng)仍然阻塞,同樣P2也被阻塞

    最終還連著邊的那些進(jìn)程就是處于死鎖狀態(tài)的進(jìn)程。
    所以P3進(jìn)程不是死鎖進(jìn)程,P1、P2進(jìn)程是死鎖進(jìn)程

    檢測(cè)死鎖的算法:

  • 在資源分配圖中,找出既不阻塞又不是孤點(diǎn)(與之至少有1個(gè)邊相連)的進(jìn)程Pi
    (即找出一條有向邊與它相連,且該向邊對(duì)應(yīng)資源的申請(qǐng)數(shù)量小于等于系統(tǒng)中已有空閑資源數(shù)量。
    如下圖中,R1沒有空閑資源,R2有 1個(gè)空閑資源。若所有的連接該進(jìn)程的邊均滿足上述條件,則這個(gè)進(jìn)程能繼續(xù)運(yùn)行直至完成,然后釋放它所占有的所有資源)。消去它所有的請(qǐng)求邊和分配邊,使之稱為孤立的結(jié)點(diǎn)。在下圖中, P1是滿足這一條件的進(jìn)程結(jié)點(diǎn),于是將P1的所有邊消去。
  • 進(jìn)程Pi所釋放的資源,可以喚醒某些因等待這些資源而阻塞的進(jìn)程,原來(lái)的阻塞進(jìn)程可能變?yōu)榉亲枞M(jìn)程。在下圖中,P2就滿足這樣的條件。根據(jù)1中的方法進(jìn)行一系列簡(jiǎn)化后,若能消去途中所有的邊,則稱該圖是可完全簡(jiǎn)化的。
  • 4.2 死鎖的避免

    一旦檢測(cè)出死鎖的發(fā)生,就應(yīng)該立即解除死鎖。
    并不是系統(tǒng)中所有的進(jìn)程都是死鎖狀態(tài),用死鎖檢測(cè)算法化簡(jiǎn)資源分配圖后,還連著邊的那些進(jìn)程就是死鎖進(jìn)程

    解除死鎖的主要方法有:

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

  • 進(jìn)程優(yōu)先級(jí)
  • 已執(zhí)行多長(zhǎng)時(shí)間
  • 還要多久能完成
  • 進(jìn)程已經(jīng)使用了多少資源
  • 進(jìn)程是交互式的還是批處 理式的
  • 4.3 死鎖的檢測(cè)與避免小結(jié)

    總結(jié)

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

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。