做網(wǎng)站字體格式用銳利嗎即刻搜索引擎入口
什么是死鎖?
死鎖(Deadlock)是指兩個或多個線程/進程在執(zhí)行過程中,由于資源的互相占用和等待,而陷入一種互相等待的僵局,無法繼續(xù)往下執(zhí)行的情況。
產(chǎn)生死鎖的四個必要條件:
(1)互斥條件(Mutual Exclusion):至少有一個資源是非共享的,即在一個時間內(nèi)只由一個線程/進程占用。
(2)占有并等待(Hold and Wait):一個線程/進程已經(jīng)占用了至少一個資源,并且在等待獲取其他資源。
(3)不可剝奪(No Preemption):資源只能被線程/進程自愿釋放,不能被強制剝奪。
(4)循環(huán)等待(Circular Wait):兩個或多個線程/進程之間形成一種頭尾相接的循環(huán)等待資源關系。
一個具體的死鎖場景
如下:
假設有兩個線程T1和T2,各自需要兩個資源A和B。
(1)T1首先申請并獲得了資源A,T2首先申請并獲得了資源B。
(2)之后T1申請資源B,但被阻塞,因為資源B已經(jīng)被T2占用。
(3)同時T2申請資源A,但也被阻塞,因為資源A已經(jīng)被T1占用。
(4)此時雙方都在等待對方釋放資源,形成了死鎖。
這種情況下,T1和T2將永遠阻塞下去,無法繼續(xù)執(zhí)行,除非有外部干預。
因此,避免死鎖的關鍵是要及時發(fā)現(xiàn)并及時打破其中的一個條件。通??梢酝ㄟ^合理的資源申請順序、死鎖檢測和資源搶占等方式來預防和解決死鎖問題。
常見的死鎖場景
- 多個線程/進程占用部分資源,又互相等待其他資源,形成循環(huán)等待。
- 某個線程/進程獲得資源后不及時釋放,造成其他線程/進程無法獲得所需資源。
- 資源分配不合理,導致資源耗盡或分配不均。
- 系統(tǒng)管理不善,未對資源訪問順序等進行合理控制。
如何預防死鎖?
預防和避免死鎖主要有以下幾種常見的方法:
- 合理的資源分配和申請順序
給每個線程/進程分配資源時遵循固定的順序
申請資源時按照固定順序申請,防止循環(huán)等待 - 死鎖檢測和解決
動態(tài)檢測系統(tǒng)中是否存在死鎖
一旦發(fā)現(xiàn)死鎖,通過搶占資源或者回滾等方式打破死鎖 - 資源有限分配
限制系統(tǒng)中資源的總量,防止資源耗盡
合理分配資源,避免某些線程/進程占用太多資源 - 破壞不可搶占條件
允許強制從一個線程/進程中獲取資源
當資源被占用時,可以暫時將其搶占回來 - 利用死鎖避免算法
如銀行家算法等,動態(tài)檢查并拒絕可能導致死鎖的資源分配請求 - 合理的線程/進程執(zhí)行順序
按照一定的調(diào)度策略,合理安排線程/進程的執(zhí)行順序 - 超時檢測和處理
對于長時間阻塞的線程/進程,可以主動超時中止,避免永久阻塞
總之,預防死鎖需要從多個方面著手,既要從設計層面預防,又要在運行時動態(tài)監(jiān)測和處理。只有采取多種措施,才能更好地避免和解決死鎖問題。
銀行家算法?
假設你是一家銀行的銀行家,你負責管理銀行的資金分配。銀行里有很多客戶(相當于進程),每個客戶都有一定的貸款需求(相當于資源需求)。
當一個新客戶來申請貸款時,作為銀行家你需要做以下幾步:
- 先弄清楚每個客戶的最大貸款需求是多少(系統(tǒng)需要提前知道每個進程的最大資源需求)。
- 你要保持一個可用資金池,記錄銀行當前還有多少可用的資金(相當于可用資源向量)。
- 當新客戶來申請貸款時,你要先檢查能否滿足他的需求,如果可以就批準貸款;如果不行,就暫時把他的申請放在等待隊列里(相當于將該請求暫時保存)。
- 你會定期檢查等待隊列里的申請,看看是否能安全地滿足某些申請(相當于檢查等待隊列中的請求)。
- 如果你能找到一個"安全序列",即按照某個順序依次滿足所有客戶的貸款需求,那么說明系統(tǒng)處于安全狀態(tài),你可以批準貸款;否則你就拒絕貸款申請(相當于判斷系統(tǒng)是否處于安全狀態(tài))。
這就是銀行家算法的核心思想。它可以動態(tài)地檢測系統(tǒng)是否處于安全狀態(tài),從而避免發(fā)生"死鎖"(即客戶永遠無法獲得貸款)。這種算法在操作系統(tǒng)、數(shù)據(jù)庫等領域都有廣泛應用。
銀行家算法的基本思想和優(yōu)點?
銀行家算法(Banker’s Algorithm)是一種預防死鎖的常見算法,它是由操作系統(tǒng)先驅(qū)E.W. Dijkstra提出的。
銀行家算法的基本思想是:
- 系統(tǒng)需要提前知道每個進程所需的最大資源需求。
- 系統(tǒng)保持一個可用資源向量,記錄當前系統(tǒng)中可用的各類資源數(shù)量。
- 當進程請求資源時,系統(tǒng)先檢查是否能滿足這個請求,如果可以,則分配資源;如果不可以,則將該請求暫時保存在等待隊列中。
- 系統(tǒng)會周期性地檢查等待隊列中的請求,看是否可以安全地滿足某些請求。
- 如果系統(tǒng)能找到一個安全序列,即能按照這個序列依次滿足所有進程的資源需求,則認為系統(tǒng)處于安全狀態(tài),可以分配資源。否則拒絕分配資源。
銀行家算法的優(yōu)點是:
(1)能夠動態(tài)地檢測系統(tǒng)是否處于安全狀態(tài),防止發(fā)生死鎖。
(2)能夠合理地分配資源,最大化資源利用率。
(3)相對簡單易實現(xiàn),可以應用于多種資源分配場景。