什麼是死鎖及死鎖產生條件和解決辦法

2021-12-29 22:45:46 字數 3017 閱讀 6570

什麼是死鎖及死鎖產生條件和解決辦法

1.死鎖的概念

死鎖是程序死鎖的簡稱,是由dijkstra於2023年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。

2.什麼是死鎖

我們先看看這樣乙個生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車通過,無法讓兩輛汽車並行。如果有兩輛汽車a和b分別由橋的兩端駛上該橋,則對於a車來說,它走過橋面左面的一段路(即占有了橋的一部分資源),要想過橋還須等待b車讓出右邊的橋面,此時a車不能前進;對於b車來說,它走過橋面右邊的一段路(即占有了橋的一部分資源),要想過橋還須等待a車讓出左邊的橋面,此時b車也不能前進。兩邊的車都不倒車,結果造成互相等待對方讓出橋面,但是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。如果把汽車比做程序,橋面作為資源,那麼上述問題就描述為:程序a占有資源r1,等待程序b占有的資源rr;程序b占有資源rr,等待程序a占有的資源r1。而且資源r1和rr只允許乙個程序占用,即:不允許兩個程序同時占用。結果,兩個程序都不能繼續執行,若不採取其它措施,這種迴圈等待狀況會無限期持續下去,就發生了程序死鎖。

所謂死鎖,是指多個程序迴圈等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個程序都將永遠處於封鎖狀態。

3.產生死鎖的必要條件

從以上分析可見,如果在計算機系統中同時具備下面四個必要條件時,那麼會發生死鎖。換句話說,只要下面四個條件有乙個不具備,系統就不會出現死鎖。

〈1〉互斥條件。即某個資源在一段時間內只能由乙個程序占有,不能同時被兩個或兩個以上的程序占有。這種獨佔資源如cd-rom驅動器,印表機等等,必須在占有該資源的程序主動釋放它之後,其它程序才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨佔資源,兩方的人不能同時過橋。

〈2〉不可搶占條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者程序自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放占有資源),對方的人才能過橋。

〈3〉占有且申請條件。程序至少已經占有乙個資源,但又申請新的資源;由於該資源已被另外程序占有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續占用已占有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過一段橋面(即占有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙占有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。

〈4〉迴圈等待條件。存在乙個程序等待序列,其中p1等待p2所占有的某一資源,p2等待p3所占有的某一源,......,而pn等待p1所占有的的某一資源,形成乙個程序迴圈等待環。就像前面的過獨木橋問題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,從而彼此迴圈等待。

上面我們提到的這四個條件在死鎖時會同時發生。也就是說,只要有乙個必要條件不滿足,則死鎖就可以排除。

4.死鎖的預防

前面介紹了死鎖發生時的四個必要條件,只要破壞這四個必要條件中的任意乙個條件,死鎖就不會發生。這就為我們解決死鎖問題提供了可能。一般地,解決死鎖的方法分為死鎖的預防,避免,檢測與恢復三種(注意:死鎖的檢測與恢復是乙個方法)。我們將在下面分別加以介紹。

死鎖的預防是保證系統不進入死鎖狀態的一種策略。它的基本思想是要求程序申請資源時遵循某種協議,從而打破產生死鎖的四個必要條件中的乙個或幾個,保證系統不會進入死鎖狀態。

〈1〉打破互斥條件。即允許程序同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像印表機等等,這是由資源本身的屬性所決定的。所以,這種辦法並無實用價值。

〈 2〉打破不可搶占條件。即允許程序強行從佔有者那裡奪取某些資源。就是說,當乙個程序已占有了某些資源,它又申請新的資源,但不能立即被滿足時,它必須釋放所占有的全部資源,以後再重新申請。它所釋放的資源可以分配給其它程序。這就相當於該程序占有的資源被隱蔽地強佔了。這種預防死鎖的方法實現起來困難,會降低系統效能。

〈3〉打破占有且申請條件。可以實行資源預先分配策略。即程序在執行前一次性地向系統申請它所需要的全部資源。如果某個程序所需的全部資源得不到滿足,則不分配任何資源,此程序暫不執行。只有當系統能夠滿足當前程序的全部資源需求時,才一次性地將所申請的資源全部分配給該程序。由於執行的程序已占有了它所需的全部資源,所以不會發生占有資源又申請資源的現象,因此不會發生死鎖。但是,這種策略也有如下缺點:

(1)在許多情況下,乙個程序在執行之前不可能知道它所需要的全部資源。這是由於程序在執行時是動態的,不可**的;

(2)資源利用率低。無論所分資源何時用到,乙個程序只有在占有所需的全部資源後才能執行。即使有些資源最後才被該程序用到一次,但該程序在生存期間卻一直占有它們,造成長期佔著不用的狀況。這顯然是一種極大的資源浪費;

(3)降低了程序的併發性。因為資源有限,又加上存在浪費,能分配到所需全部資源的程序個數就必然少了。

(4)打破迴圈等待條件,實行資源有序分配策略。採用這種策略,即把資源事先分類編號,按號分配,使程序在申請,占用資源時不會形成環路。所有程序對資源的請求必須嚴格按資源序號遞增的順序提出。程序占用了小號資源,才能申請大號資源,就不會產生環路,從而預防了死鎖。這種策略與前面的策略相比,資源的利用率和系統吞吐量都有很大提高,但是也存在以下缺點:

(1)限制了程序對資源的請求,同時給系統中所有資源合理編號也是件困難事,並增加了系統開銷;

(2)為了遵循按編號申請的次序,暫不使用的資源也需要提前申請,從而增加了程序對資源的占用時間。

死鎖的檢測與恢復

一般來說,由於作業系統有併發,共享以及隨機性等特點,通過預防和避免的手段達到排除死鎖的目的是很困難的。這需要較大的系統開銷,而且不能充分利用資源。為此,一種簡便的方法是系統為程序分配資源時,不採取任何限制性措施,但是提供了檢測和解脫死鎖的手段:能發現死鎖並從死鎖狀態中恢復出來。因此,在實際的作業系統中往往採用死鎖的檢測與恢復方法來排除死鎖。

死鎖檢測與恢復是指系統設有專門的機構,當死鎖發生時,該機構能夠檢測到死鎖發生的位置和原因,並能通過外力破壞死鎖發生的必要條件,從而使得併發程序從死鎖狀態中恢復出來。

死鎖及死鎖產生原因條件

作業系統中有若干程序併發執行,它們不斷申請 使用 釋放系統資源,雖然系統的進 程協調 通訊機構會對它們進行控制,但也可能出現若干程序都相互等待對方釋放資源才能 繼續執行,否則就阻塞的情況。此時,若不借助外界因素,誰也不能釋放資源,誰也不能解 除阻塞狀態。根據這樣的情況,作業系統中的死鎖被定義為系統中...

死鎖的產生 條件 和解鎖

所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等竺的程序稱為死鎖程序.由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的資源而...

死鎖原因,條件和解決

死鎖是指多個程序迴圈等待彼此占有的資源而無限期的僵持等待下去的局面。原因是 為使系統不發生死鎖,必須設法破壞產生死鎖的四個必要條件之一,或者允許死鎖產生,但當死鎖發生時能檢測出思索,並有能力實現恢復。一般有死鎖的預防 死鎖避免 死鎖的檢測與恢復三種方法。允許程序動態的申請資源,但系統在進行資源分配前...