深入淺出理解死鎖(以吃雞遊戲為例)

2021-08-27 18:11:11 字數 2084 閱讀 8580

銀行家演算法

死鎖(英語:deadlock),電腦科學名詞。當兩個以上的運算單元,雙方都在等待對方停止執行,以獲取系統資源,但是沒有一方提前退出時,就稱為死鎖。

舉乙個簡單的例子就很容易理解什麼是死鎖了。

我和女朋友一起玩絕地求生,我撿到了一把98k,女朋友撿到了乙個八倍鏡。我手裡有98k,想要女朋友包裡的八倍鏡。女朋友包裡有八倍鏡,想要我手裡的98k。如果我不把98k給女朋友,女朋友也不把八倍鏡給我。那我們兩個之間就出現了死鎖。(我們假設這個遊戲中只有一把98k和乙個八倍鏡。並且我和女朋友都不會打死對方並搶奪裝備)

在吃雞遊戲中,出現死鎖的前提是滿足了以下幾個條件的:

1、互斥條件:一把98k只能同時被乙個人撿起來,無法被多個人同時撿起來。八倍鏡也一樣。

2、占有且等待:持有98k的人希望拿到八倍鏡,並且不願意放棄手裡的98k。持有八倍鏡的人也一樣。

3、不可強行占有:持有98k和八倍鏡的人不會從對方手裡直接把東西搶過來。

4、迴圈等待條件:兩個人分別持有98k和八倍鏡,並且需要同時擁有98k和八倍鏡才能大殺四方。

以上就是死鎖的四個條件。對映到計算機系統中,分別對應著:

1、互斥條件:乙個資源每次只能被乙個程序使用。

2、占有且等待:乙個程序因請求資源而阻塞時,對已獲得的資源保持不放。

3、不可強行占有:程序已獲得的資源,在末使用完之前,不能強行剝奪。

4、迴圈等待條件:若干程序之間形成一種頭尾相接的迴圈等待資源關係。

這四個條件是死鎖的必要條件,只要系統發生死鎖,這些條件必然成立。

前面提到過死鎖的四個必要條件,也就是說,只有在這四個條件同時滿足的時候才會出現死鎖。

那麼,想要解決死鎖,就想辦法破壞四個條件中的任意乙個就可以了。

比如吃雞遊戲,如果發生了死鎖的話,比較簡單的方式就是其中乙個放棄裝備,讓另外乙個人撿起來就可以了(破壞占有且等待條件)。或者就是其中乙個人把另外乙個人打死,然後舔他的包(破壞不可強行占有條件)。

所以,對於計算機系統中的死鎖,預防方式就是避免以上四個條件同時出現。共有以下四個大類:

允許程序同時訪問某些資源。但是,有的資源是不允許被同時訪問的,這是由資源本身的屬性所決定的。所以,這種辦法並無實用價值。

為預防占有且等待條件,可以要求程序一次性的請求所有需要的資源,並且阻塞這個程序直到所有請求都同時滿足。這個方法比較低效。

還有一種方式,就是如果占有某些資源的乙個程序進行進一步資源請求時被拒絕,則該程序立刻釋放它最初占有的資源。

如果乙個程序請求當前被另乙個程序占有的乙個資源,則作業系統可以搶占另外乙個程序,要求它釋放資源。

實行資源有序分配策略。如果乙個程序已經分配了r類資源,那麼接下來請求的資源只能是那些排在r型別之後的資源型別。

銀行家演算法(banker』s algorithm)是乙個避免死鎖的著名演算法,是由艾茲格·迪傑斯特拉在2023年為t.h.e系統設計的一種避免死鎖產生的演算法。它以銀行借貸系統的分配策略為基礎,判斷並保證系統的安全執行。

在銀行中,客戶申請貸款的數量是有限的,每個客戶在第一次申請貸款時要宣告完成該專案所需的最大資金量,在滿足所有貸款要求時,客戶應及時歸還。銀行家在客戶申請的貸款數量不超過自己擁有的最大值時,都應盡量滿足客戶的需要。在這樣的描述中,銀行家就好比作業系統,資金就是資源,客戶就相當於要申請資源的程序。

我們可以把作業系統看作是銀行家,作業系統管理的資源相當於銀行家管理的資金,程序向作業系統請求分配資源相當於使用者向銀行家貸款。

為保證資金的安全,銀行家規定:

(1) 當乙個顧客對資金的最大需求量不超過銀行家現有的資金時就可接納該顧客;

(2) 顧客可以分期貸款,但貸款的總數不能超過最大需求量;

(3) 當銀行家現有的資金不能滿足顧客尚需的貸款數額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間裡得到貸款;

(4) 當顧客得到所需的全部資金後,一定能在有限的時間裡歸還所有的資金.

作業系統按照銀行家制定的規則為程序分配資源,當程序首次申請資源時,要測試該程序對資源的最大需求量,如果系統現存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當程序在執行中繼續申請資源時,先測試該程序本次申請的資源數是否超過了該資源所剩餘的總量。若超過則拒絕分配資源,若能滿足則按當前的申請量分配資源,否則也要推遲分配。

深入淺出理解索引

一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...

深入淺出理解索引

一 深入淺出理解索引結構 實際上,您可以把索引理解為一種特殊的目錄。sql server提供了兩種索引 聚集索引 clustered index,也稱聚類索引 簇集索引 和非聚集索引 nonclustered index,也稱非聚類索引 非簇集索引 下面,我們舉例來說明一下聚集索引和非聚集索引的區別...

深入淺出理解 COOKIE MAPPING

在網際網路中,我們有著許多標識唯一使用者的技術手段,其中,最為常見的就是 cookie 了 什麼是cookie請參看 分析中的cookie 簡單的多,cookie具備幾個特徵 正因為cookie具備上述幾個特徵,也就衍生出cookie在使用上的一些特點了,我們以dsp.com 廣告購買平台 adx....