1). 死鎖的概念
通俗的講,就是兩個或多個進程無限期的阻塞、相互等待的一種狀態。
2). 死鎖產生的四個必要條件
互斥:至少有一個資源必須屬於非共享模式,即一次只能被一個進程使用;若其他申請使用該資源,那么申請進程必須等到該資源被釋放為止;
占有並等待:一個進程必須占有至少一個資源,並等待另一個資源,而該資源為其他進程所占有;
非搶占:進程不能被搶占,即資源只能被進程在完成任務后自願釋放
循環等待:若干進程之間形成一種頭尾相接的環形等待資源關系
3). 死鎖的處理基本策略和常用方法
解決死鎖的基本方法主要有 預防死鎖、避免死鎖、檢測死鎖、解除死鎖 、鴕鳥策略 等。
(1). 死鎖預防
死鎖預防的基本思想是 只要確保死鎖發生的四個必要條件中至少有一個不成立,就能預防死鎖的發生,具體方法包括:
打破互斥條件:允許進程同時訪問某些資源。但是,有些資源是不能被多個進程所共享的,這是由資源本身屬性所決定的,因此,這種辦法通常並無實用價值。
打破占有並等待條件:可以實行資源預先分配策略(進程在運行前一次性向系統申請它所需要的全部資源,若所需全部資源得不到滿足,則不分配任何資源,此進程暫不運行;只有當系統能滿足當前進程所需的全部資源時,才一次性將所申請資源全部分配給該線程)或者只允許進程在沒有占用資源時才可以申請資源(一個進程可申請一些資源並使用它們,但是在當前進程申請更多資源之前,它必須全部釋放當前所占有的資源)。但是這種策略也存在一些缺點:在很多情況下,無法預知一個進程執行前所需的全部資源,因為進程是動態執行的,不可預知的;同時,會降低資源利用率,導致降低了進程的並發性。
打破非搶占條件:允許進程強行從占有者哪里奪取某些資源。也就是說,但一個進程占有了一部分資源,在其申請新的資源且得不到滿足時,它必須釋放所有占有的資源以便讓其它線程使用。這種預防死鎖的方式實現起來困難,會降低系統性能。
打破循環等待條件:實行資源有序分配策略。對所有資源排序編號,所有進程對資源的請求必須嚴格按資源序號遞增的順序提出,即只有占用了小號資源才能申請大號資源,這樣就不回產生環路,預防死鎖的發生。
(2). 死鎖避免的基本思想
死鎖避免的基本思想是動態地檢測資源分配狀態,以確保循環等待條件不成立,從而確保系統處於安全狀態。所謂安全狀態是指:如果系統能按某個順序為每個進程分配資源(不超過其最大值),那么系統狀態是安全的,換句話說就是,如果存在一個安全序列,那么系統處於安全狀態。資源分配圖算法和銀行家算法是兩種經典的死鎖避免的算法,其可以確保系統始終處於安全狀態。其中,資源分配圖算法應用場景為每種資源類型只有一個實例(申請邊,分配邊,需求邊,不形成環才允許分配),而銀行家算法應用於每種資源類型可以有多個實例的場景。
(3). 死鎖解除
死鎖解除的常用兩種方法為進程終止和資源搶占。所謂進程終止是指簡單地終止一個或多個進程以打破循環等待,包括兩種方式:終止所有死鎖進程和一次只終止一個進程直到取消死鎖循環為止;所謂資源搶占是指從一個或多個死鎖進程那里搶占一個或多個資源,此時必須考慮三個問題:
(I). 選擇一個犧牲品
(II). 回滾:回滾到安全狀態
(III). 飢餓(在代價因素中加上回滾次數,回滾的越多則越不可能繼續被作為犧牲品,避免一個進程總是被回滾)