OS- -死锁(二)
生活随笔
收集整理的這篇文章主要介紹了
OS- -死锁(二)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
OS- -死鎖(二)
文章目錄
- OS- -死鎖(二)
- 一、死鎖
- 1.死鎖避免
- 單個(gè)資源的銀行家算法
- 2.破壞死鎖
- 破壞互斥條件
- 破壞保持等待的條件
- 破壞不可搶占條件
- 破壞循環(huán)等待條件
- 3.其他問(wèn)題
- 兩階段加鎖
- 通信死鎖
- 活鎖
- 饑餓
- 4.總結(jié)
一、死鎖
1.死鎖避免
單個(gè)資源的銀行家算法
- 銀行家算法是Dijkstra在1965年提出的一種調(diào)度算法,它本身是一種死鎖的調(diào)度算法。
- 它的模型是基 于一個(gè)城鎮(zhèn)中的銀行家,銀行家向城鎮(zhèn)中的客戶承諾了一定數(shù)量的貸款額度。
- 算法要做的就是判斷請(qǐng)求 是否會(huì)進(jìn)入一種不安全的狀態(tài)。
- 如果是,就拒絕請(qǐng)求,如果請(qǐng)求后系統(tǒng)是安全的,就接受該請(qǐng)求。
- 比如下面的例子,銀行家一共為所有城鎮(zhèn)居民提供了 15單位個(gè)貸款額度,一個(gè)單位表示1k美元,如 下所示:
- 城鎮(zhèn)居民都喜歡做生意,所以就會(huì)涉及到貸款,每個(gè)人能貸款的最大額度不一樣,在某一時(shí)刻, A/B/C/D的貸款金額如下:
- 上面每個(gè)人的貸款總額加起來(lái)是13,馬上接近15,銀行家只能給A和C進(jìn)行放貸,可以拖著B(niǎo)和 D
- 所以,可以讓A和C首先完成,釋放貸款額度,以此來(lái)滿足其他居民的貸款。這是一種安全的狀 態(tài)。
- 如果每個(gè)人的請(qǐng)求導(dǎo)致總額會(huì)超過(guò)甚至接近15 ,就會(huì)處于一種不安全的狀態(tài),如下所示:
- 這樣,每個(gè)人還能貸款至少2個(gè)單位的額度,如果其中有一個(gè)人發(fā)起最大額度的貸款請(qǐng)求,就會(huì)使系統(tǒng) 處于一種死鎖狀態(tài)。
- 這里注意一點(diǎn):不安全狀態(tài)并不一定引起死鎖,由于客戶不一定需要其最大的貸款額度,但是銀 行家不敢抱著這種僥幸心理。
- 銀行家算法就是對(duì)每個(gè)請(qǐng)求進(jìn)行檢查,檢查是否請(qǐng)求會(huì)引起不安全狀態(tài),如果不會(huì)引起,那么就接受該 請(qǐng)求;如果會(huì)引起,那么就推遲該請(qǐng)求。
類(lèi)似的,還有多個(gè)資源的銀行家算法,可以自行了解。
2.破壞死鎖
- 死鎖本質(zhì)上是無(wú)法避免的,因?yàn)樗枰@得未知的資源和請(qǐng)求,但是死鎖是滿足四個(gè)條件后才出現(xiàn)的, 它們分別是
- ?互斥
- ?保持和等待
- ?不可搶占
- ?循環(huán)等待
我們分別對(duì)這四個(gè)條件進(jìn)行討論,按理說(shuō)破壞其中的任意一個(gè)條件就能夠破壞死鎖
破壞互斥條件
- 我們首先考慮的就是 破壞互斥使用條件。如果資源不被一個(gè)進(jìn)程獨(dú)占,那么死鎖肯定不會(huì)產(chǎn)生。
- 如果兩 個(gè)打印機(jī)同時(shí)使用一個(gè)資源會(huì)造成混亂,打印機(jī)的解決方式是使用假脫機(jī)打印機(jī)(spooling printer),這項(xiàng)技術(shù)可以允許多個(gè)進(jìn)程同時(shí)產(chǎn)生輸出
- 在這種模型中,實(shí)際請(qǐng)求打印機(jī)的唯一進(jìn)程是 打印機(jī)守護(hù)進(jìn)程,也稱(chēng)為后臺(tái)進(jìn)程。后臺(tái)進(jìn)程不會(huì)請(qǐng)求其他資源。我們可以消除打印機(jī)的死鎖。
- 后臺(tái)進(jìn)程通常被編寫(xiě)為能夠輸出完整的文件后才能打印,假如兩個(gè)進(jìn)程都占用了假脫機(jī)空間的一半,而 這兩個(gè)進(jìn)程都沒(méi)有完成全部的輸出,就會(huì)導(dǎo)致死鎖。
因此,盡量做到盡可能少的進(jìn)程可以請(qǐng)求資源。
破壞保持等待的條件
- 第二種方式是如果我們能阻止持有資源的進(jìn)程請(qǐng)求其他資源,我們就能夠消除死鎖。
- 一種實(shí)現(xiàn)方式是讓 所有的進(jìn)程開(kāi)始執(zhí)行前請(qǐng)求全部的資源。如果所需的資源可用,進(jìn)程會(huì)完成資源的分配并運(yùn)行到結(jié)束。 如果有任何一個(gè)資源處于頻繁分配的情況,那么沒(méi)有分配到資源的進(jìn)程就會(huì)等待。
- 很多進(jìn)程無(wú)法在執(zhí)行完成前就知道到底需要多少資源,如果知道的話,就可以使用銀行家算法;還有一 個(gè)問(wèn)題是這樣無(wú)法合理有效利用資源。
- 還有一種方式是進(jìn)程在請(qǐng)求其他資源時(shí),先釋放所占用的資源,然后再?lài)L試一次獲取全部的資源。
破壞不可搶占條件
- 破壞不可搶占條件也是可以的。可以通過(guò)虛擬化的方式來(lái)避免這種情況。
破壞循環(huán)等待條件
- 現(xiàn)在就剩最后一個(gè)條件了,循環(huán)等待條件可以通過(guò)多種方法來(lái)破壞。
- 一種方式是制定一個(gè)標(biāo)準(zhǔn),一個(gè)進(jìn) 程在任何時(shí)候只能使用一種資源。如果需要另外一種資源,必須釋放當(dāng)前資源。對(duì)于需要將大文件從磁 帶復(fù)制到打印機(jī)的過(guò)程,此限制是不可接受的。
- 另一種方式是將所有的資源統(tǒng)一編號(hào),如下圖所示
- 進(jìn)程可以在任何時(shí)間提出請(qǐng)求,但是所有的請(qǐng)求都必須按照資源的順序提出。如果按照此分配規(guī)則的 話,那么資源分配之間不會(huì)出現(xiàn)環(huán)。
- 盡管通過(guò)這種方式來(lái)消除死鎖,但是編號(hào)的順序不可能讓每個(gè)進(jìn)程都會(huì)接受。
3.其他問(wèn)題
下面我們來(lái)探討一下其他問(wèn)題,包括通信死鎖、活鎖是什么、饑餓問(wèn)題和兩階段加鎖
兩階段加鎖
- 雖然很多情況下死鎖的避免和預(yù)防都能處理,但是效果并不好。隨著時(shí)間的推移,提出了很多優(yōu)秀的算 法用來(lái)處理死鎖。
- 例如在數(shù)據(jù)庫(kù)系統(tǒng)中,一個(gè)經(jīng)常發(fā)生的操作是請(qǐng)求鎖住一些記錄,然后更新所有鎖定 的記錄。當(dāng)同時(shí)有多個(gè)進(jìn)程運(yùn)行時(shí),就會(huì)有死鎖的風(fēng)險(xiǎn)。
- 一種解決方式是使用兩階段加鎖(two-phase locking) ,顧名思義分為兩個(gè)階段:
- 一階段是進(jìn)程嘗 試一次鎖定它需要的所有記錄。如果成功后,才會(huì)開(kāi)始第二階段
- 第二階段是執(zhí)行更新并釋放鎖。第一 階段并不做真正有意義的工作。
- 如果在第一階段某個(gè)進(jìn)程所需要的記錄已經(jīng)被加鎖,那么該進(jìn)程會(huì)釋放所有鎖定的記錄并重新開(kāi)始第一 階段。
- 從某種意義上來(lái)說(shuō),這種方法類(lèi)似于預(yù)先請(qǐng)求所有必需的資源或者是在進(jìn)行一些不可逆的操作之 前請(qǐng)求所有的資源。
- 不過(guò)在一般的應(yīng)用場(chǎng)景中,兩階段加鎖的策略并不通用。如果一個(gè)進(jìn)程缺少資源就會(huì)半途中斷并重新開(kāi) 始的方式是不可接受的。
通信死鎖
- 我們上面一直討論的是資源死鎖,資源死鎖是一種死鎖類(lèi)型,但并不是唯一類(lèi)型,還有通信死鎖,也就 是兩個(gè)或多個(gè)進(jìn)程在發(fā)送消息時(shí)出現(xiàn)的死鎖。
- 進(jìn)程A給進(jìn)程B發(fā)了一條消息,然后進(jìn)程A阻塞直到進(jìn) 程B返回響應(yīng)。假設(shè)請(qǐng)求消息丟失了,那么進(jìn)程A在一直等著回復(fù),進(jìn)程B也會(huì)阻塞等待請(qǐng)求消息到 來(lái),這時(shí)候就產(chǎn)生死鎖。
- 盡管會(huì)產(chǎn)生死鎖,但是這并不是一個(gè)資源死鎖,因?yàn)锳并沒(méi)有占據(jù)B的資源。事實(shí)上,通信死鎖并沒(méi) 有完全可見(jiàn)的資源。
- 根據(jù)死鎖的定義來(lái)說(shuō):每個(gè)進(jìn)程因?yàn)榈却渌M(jìn)程引起的事件而產(chǎn)生阻塞,這就是 一種死鎖。相較于最常見(jiàn)的通信死鎖,我們把上面這種情況稱(chēng)為通信死鎖(communication deadlock)。
- 通信死鎖不能通過(guò)調(diào)度的方式來(lái)避免,但是可以使用通信中一個(gè)非常重要的概念來(lái)避免:超時(shí) (timeout)
- 在通信過(guò)程中,只要一個(gè)信息被發(fā)出后,發(fā)送者就會(huì)啟動(dòng)一個(gè)定時(shí)器,定時(shí)器會(huì)記錄消 息的超時(shí)時(shí)間,如果超時(shí)時(shí)間到了但是消息還沒(méi)有返回,就會(huì)認(rèn)為消息已經(jīng)丟失并重新發(fā)送,通過(guò)這種 方式,可以避免通信死鎖。
- 但是并非所有網(wǎng)絡(luò)通信發(fā)生的死鎖都是通信死鎖,也存在資源死鎖,下面就是一個(gè)典型的資源死鎖。
- 當(dāng)一個(gè)數(shù)據(jù)包從主機(jī)進(jìn)入路由器時(shí),會(huì)被放入一個(gè)緩沖區(qū),然后再傳輸?shù)搅硗庖粋€(gè)路由器,再到另一 個(gè),以此類(lèi)推直到目的地。緩沖區(qū)都是資源并且數(shù)量有限。
- 如下圖所示,每個(gè)路由器都有10個(gè)緩沖區(qū) (實(shí)際上有很多)。
- 假如路由器A的所有數(shù)據(jù)需要發(fā)送到B , B的所有數(shù)據(jù)包需要發(fā)送到D,然后D的所有數(shù)據(jù)包需要發(fā) 送到A。
- 沒(méi)有數(shù)據(jù)包可以移動(dòng),因?yàn)樵诹硪欢藳](méi)有緩沖區(qū)可用,這就是一個(gè)典型的資源死鎖。
活鎖
- 你會(huì)發(fā)現(xiàn)一個(gè)很有意思的事情,死鎖就跟榆木腦袋一樣,不會(huì)轉(zhuǎn)彎。
- 講個(gè)故事👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏:
- 故事是這樣的:春秋時(shí),魯國(guó)曲阜有個(gè)年輕人名叫尾生,為人正直,樂(lè)于助人,和朋友交往很守信用,受到四鄉(xiāng)八鄰的普遍贊譽(yù)。
- 后來(lái),尾生遷居梁地(今陜西韓城南)。
- 他在那里認(rèn)識(shí)了一位年輕漂亮的姑娘。兩人一見(jiàn)鐘情,君子淑女,私訂終身。
- 但是姑娘的父母嫌棄尾生家境貧寒,堅(jiān)決反對(duì)這門(mén)親事。
- 為了追求愛(ài)情和幸福,姑娘決定背著父母私奔,隨尾生回到曲阜老家去。
- 那一天,兩人約定在韓城外的一座木橋邊會(huì)面,雙雙遠(yuǎn)走高飛。
- 黃昏時(shí)分,尾生提前來(lái)到橋上等候。
- 不料,六月的天氣說(shuō)變就變,突然烏云密布,狂風(fēng)怒吼,雷鳴電閃,滂沱大雨傾盆而下。
- 不久山洪暴發(fā),滾滾江水裹挾泥沙席卷而來(lái),淹沒(méi)了橋面,沒(méi)過(guò)了尾生的膝蓋。
- 城外橋面,不見(jiàn)不散,尾生想起了與姑娘的信誓旦旦;四顧茫茫水世界,不見(jiàn)姑娘蹤影。但他寸步不離,死死抱著橋柱,終于被活活淹死。
- 再說(shuō)姑娘因?yàn)樗奖寄铑^泄露,被父母禁錮家中,不得脫身。后伺機(jī)黃夜逃出家門(mén),冒雨來(lái)到城外橋邊,此時(shí)洪水已漸漸退去。
- 姑娘看到緊抱橋柱而死的尾生,悲慟欲絕。她抱著尾生的尸體號(hào)啕大哭。陰陽(yáng)相 隔,生死一體,哭罷,便相擁縱身投入滾滾江中……?
- 如果說(shuō)死鎖很癡情的話,那么活鎖用一則成語(yǔ)來(lái)表示就是弄巧成拙
- 某些情況下,當(dāng)進(jìn)程意識(shí)到它不能獲取所需要的下一個(gè)鎖時(shí),就會(huì)嘗試禮貌的釋放已經(jīng)獲得的鎖,然后 等待非常短的時(shí)間再次嘗試獲取。
- 可以想像一下這個(gè)場(chǎng)景:當(dāng)兩個(gè)人在狹路相逢的時(shí)候,都想給對(duì)方讓 路,相同的步調(diào)會(huì)導(dǎo)致雙方都無(wú)法前進(jìn)。
- 現(xiàn)在假想有一對(duì)并行的進(jìn)程用到了兩個(gè)資源。它們分別嘗試獲取另一個(gè)鎖失敗后,兩個(gè)進(jìn)程都會(huì)釋放自 己持有的鎖,再次進(jìn)行嘗試,這個(gè)過(guò)程會(huì)一直進(jìn)行重復(fù)
- 很明顯,這個(gè)過(guò)程中沒(méi)有進(jìn)程阻塞,但是進(jìn)程 仍然不會(huì)向下執(zhí)行,這種狀況我們稱(chēng)之為 活鎖(livelock)。
饑餓
- 與死鎖和活鎖的一個(gè)非常相似的問(wèn)題是 饑餓(starvvation)
- 想象一下你什么時(shí)候會(huì)餓?一段時(shí)間不 吃東西是不是會(huì)餓?
- 對(duì)于進(jìn)程來(lái)講,最重要的就是資源,如果一段時(shí)間沒(méi)有獲得資源,那么進(jìn)程會(huì)產(chǎn)生 饑餓,這些進(jìn)程會(huì)永遠(yuǎn)得不到服務(wù)。
- 我們假設(shè)打印機(jī)的分配方案是每次都會(huì)分配給最小文件的進(jìn)程,那么要打印大文件的進(jìn)程會(huì)永遠(yuǎn)得不到 服務(wù),導(dǎo)致進(jìn)程饑餓,進(jìn)程會(huì)無(wú)限制的推后,雖然它沒(méi)有阻塞。
4.總結(jié)
- 死鎖是一類(lèi)通用問(wèn)題,任何操作系統(tǒng)都會(huì)產(chǎn)生死鎖。當(dāng)每一組進(jìn)程中的每個(gè)進(jìn)程都因等待由該組的其他 進(jìn)程所占有的資源而導(dǎo)致阻塞,死鎖就發(fā)生了。這種情況會(huì)使所有的進(jìn)程都處于無(wú)限等待的狀態(tài)。
- 死鎖的檢測(cè)和避免可以通過(guò)安全和不安全狀態(tài)來(lái)判斷,其中一個(gè)檢測(cè)方式就是銀行家算法;當(dāng)然你也可 以使用鴕鳥(niǎo)算法對(duì)死鎖置之不理,但是你肯定會(huì)遭其反噬。
- 也可以在設(shè)計(jì)時(shí)通過(guò)系統(tǒng)結(jié)構(gòu)的角度來(lái)避免死鎖,這樣能夠預(yù)防死鎖;也可以破壞死鎖的四個(gè)條件來(lái)破 壞死鎖。
- 資源死鎖并不是唯一性的死鎖,還有通信間死鎖,可以設(shè)置適當(dāng)?shù)某瑫r(shí)時(shí)間來(lái)完成。
- 活鎖和死鎖的問(wèn)題有些相似,它們都是一種進(jìn)程無(wú)法繼續(xù)向下執(zhí)行的狀態(tài)。
- 由于進(jìn)程調(diào)度策略導(dǎo)致嘗試 獲取進(jìn)程的一方永遠(yuǎn)無(wú)法獲得資源后,進(jìn)程會(huì)導(dǎo)致饑餓的出現(xiàn)。
總結(jié)
以上是生活随笔為你收集整理的OS- -死锁(二)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: OS- -I/O之盘和时钟
- 下一篇: STL中算法锦集(一)