1. 死鎖的概念
死鎖是程序死鎖的簡稱,是由dijkstra於2023年研究銀行家演算法時首先提出來的。它是計算機作業系統乃至併發程式設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統中存在,在我們日常生活中它也廣泛存在。
我們先看看這樣乙個生活中的例子:在一條河上有一座橋,橋面較窄,只能容納一輛汽車通過,無法讓兩輛汽車並行。如果有兩輛汽車a和b分別由橋的兩端駛上該橋,則對於a車來說,它走過橋面左面的一段路(即占有了橋的一部分資源),要想過橋還須等待b車讓出右邊的橋面,此時a車不能前進;對於b車來說,它走過橋面右邊的一段路(即占有了橋的一部分資源),要想過橋還須等待a車讓出左邊的橋面,此時b車也不能前進。兩邊的車都不倒車,結果造成互相等待對方讓出橋面,但是誰也不讓路,就會無休止地等下去。這種現象就是死鎖。如果把汽車比做程序,橋面作為資源,那麼上述問題就描述為:程序a占有資源r1,等待程序b占有的資源rr;程序b占有資源rr,等待程序a占有的資源r1。而且資源r1和rr只允許乙個程序占用,即:不允許兩個程序同時占用。結果,兩個程序都不能繼續執行,若不採取其它措施,這種迴圈等待狀況會無限期持續下去,就發生了程序死鎖。
在計算機系統中,涉及軟體,硬體資源都可能發生死鎖。例如:系統中只有一台cd-rom驅動器和一台印表機,某乙個程序占有了cd-rom驅動器,又申請印表機;另一程序占有了印表機,還申請cd-rom。結果,兩個程序都被阻塞,永遠也不能自行解除。
所謂死鎖,是指多個程序迴圈等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個程序都將永遠處於封鎖狀態。從上面的例子可以看出,計算機系統產生死鎖的根本原因就是資源有限且操作不當。即:一種原因是系統提供的資源太少了,遠不能滿足併發程序對資源的需求。這種競爭資源引起的死鎖是我們要討論的核心。例如:訊息是一種臨時性資源。某一時刻,程序a等待程序b發來的訊息,程序b等待程序c發來的訊息,而程序c又等待程序a發來的訊息。訊息未到,a,b,c三個程序均無法向前推進,也會發生程序通訊上的死鎖。另一種原因是由於程序推進順序不合適引發的死鎖。資源少也未必一定產生死鎖。就如同兩個人過獨木橋,如果兩個人都要先過,在獨木橋上僵持不肯後退,必然會應競爭資源產生死鎖;但是,如果兩個人上橋前先看一看有無對方的人在橋上,當無對方的人在橋上時自己才上橋,那麼問題就解決了。所以,如果程式設計得不合理,造成程序推進的順序不當,也會出現死鎖。
2. 產生死鎖的必要條件
從以上分析可見,如果在計算機系統中同時具備下面四個必要條件時,那麼會發生死鎖。換句話說,只要下面四個條件有乙個不具備,系統就不會出現死鎖。
〈1〉互斥條件。即某個資源在一段時間內只能由乙個程序占有,不能同時被兩個或兩個以上的程序占有。這種獨佔資源如cd-rom驅動器,印表機等等,必須在占有該資源的程序主動釋放它之後,其它程序才能占有該資源。這是由資源本身的屬性所決定的。如獨木橋就是一種獨佔資源,兩方的人不能同時過橋。
〈2〉不可搶占條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源,而只能由該資源的佔有者程序自行釋放。如過獨木橋的人不能強迫對方後退,也不能非法地將對方推下橋,必須是橋上的人自己過橋後空出橋面(即主動釋放占有資源),對方的人才能過橋。
〈3〉占有且申請條件。程序至少已經占有乙個資源,但又申請新的資源;由於該資源已被另外程序占有,此時該程序阻塞;但是,它在等待新資源之時,仍繼續占用已占有的資源。還以過獨木橋為例,甲乙兩人在橋上相遇。甲走過一段橋面(即占有了一些資源),還需要走其餘的橋面(申請新的資源),但那部分橋面被乙占有(乙走過一段橋面)。甲過不去,前進不能,又不後退;乙也處於同樣的狀況。
〈4〉迴圈等待條件。存在乙個程序等待序列,其中p1等待p2所占有的某一資源,p2等待p3所占有的某一源,......,而pn等待p1所占有的的某一資源,形成乙個程序迴圈等待環。就像前面的過獨木橋問題,甲等待乙占有的橋面,而乙又等待甲占有的橋面,從而彼此迴圈等待。
上面我們提到的這四個條件在死鎖時會同時發生。也就是說,只要有乙個必要條件不滿足,則死鎖就可以排除。
3. 死鎖的預防
8.2 死鎖的預防
前面介紹了死鎖發生時的四個必要條件,只要破壞這四個必要條件中的任意乙個條件,死鎖就不會發生。這就為我們解決死鎖問題提供了可能。一般地,解決死鎖的方法分為死鎖的預防,避免,檢測與恢復三種(注意:死鎖的檢測與恢復是乙個方法)。我們將在下面分別加以介紹。
死鎖的預防是保證系統不進入死鎖狀態的一種策略。它的基本思想是要求程序申請資源時遵循某種協議,從而打破產生死鎖的四個必要條件中的乙個或幾個,保證系統不會進入死鎖狀態。
〈1〉打破互斥條件。即允許程序同時訪問某些資源。但是,有的資源是不允許被同時訪問的,像印表機等等,這是由資源本身的屬性所決定的。所以,這種辦法並無實用價值。
〈2〉打破不可搶占條件。即允許程序強行從佔有者那裡奪取某些資源。就是說,當乙個程序已占有了某些資源,它又申請新的資源,但不能立即被滿足時,它必須釋放所占有的全部資源,以後再重新申請。它所釋放的資源可以分配給其它程序。這就相當於該程序占有的資源被隱蔽地強佔了。這種預防死鎖的方法實現起來困難,會降低系統效能。
〈3〉打破占有且申請條件。可以實行資源預先分配策略。即程序在執行前一次性地向系統申請它所需要的全部資源。如果某個程序所需的全部資源得不到滿足,則不分配任何資源,此程序暫不執行。只有當系統能夠滿足當前程序的全部資源需求時,才一次性地將所申請的資源全部分配給該程序。由於執行的程序已占有了它所需的全部資源,所以不會發生占有資源又申請資源的現象,因此不會發生死鎖。但是,這種策略也有如下缺點:
(1)在許多情況下,乙個程序在執行之前不可能知道它所需要的全部資源。這是由於程序在執行時是動態的,不可**的;
(2)資源利用率低。無論所分資源何時用到,乙個程序只有在占有所需的全部資源後才能執行。即使有些資源最後才被該程序用到一次,但該程序在生存期間卻一直占有它們,造成長期佔著不用的狀況。這顯然是一種極大的資源浪費;
(3)降低了程序的併發性。因為資源有限,又加上存在浪費,能分配到所需全部資源的程序個數就必然少了。
(4)打破迴圈等待條件,實行資源有序分配策略。採用這種策略,即把資源事先分類編號,按號分配,使程序在申請,占用資源時不會形成環路。所有程序對資源的請求必須嚴格按資源序號遞增的順序提出。程序占用了小號資源,才能申請大號資源,就不會產生環路,從而預防了死鎖。這種策略與前面的策略相比,資源的利用率和系統吞吐量都有很大提高,但是也存在以下缺點:
(1)限制了程序對資源的請求,同時給系統中所有資源合理編號也是件困難事,並增加了系統開銷;
(2)為了遵循按編號申請的次序,暫不使用的資源也需要提前申請,從而增加了程序對資源的占用時間。
4. 資料庫中的鎖
篇幅限制,貼乙個網頁吧,這個網頁有資料庫裡面經常用的鎖概念的比較詳細的介紹,目前考試中遇到過的就是樂觀鎖和悲觀鎖的概念。
資料庫死鎖
資料庫在進行insert,update,delete這些更新操作的時候為了保證資料一致性都會使用排他鎖。乙個事務裡進行update操作,在事務結束之前 commit or rollback 排他鎖不會被釋放。因此在乙個事務裡update多條資料的時候執行順序就尤為重要,兩個併發事務中更新操作的執行順...
資料庫死鎖
死鎖 所謂死鎖 是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去.此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序 由於資源占用是互斥的,當某個程序提出申請資源後,使得有關程序在無外力協助下,永遠分配不到必需的...
資料庫死鎖
如果需要 修改 一條資料,首先資料庫管理系統會在上面加鎖,以保證在同一時間只有乙個事務能進行修改操作。鎖定 locking 發生在當乙個事務獲得對某一資源的 鎖 時,這時,其他的事務就不能更改這個資源了,這種機制的存在是為了保證資料一致性。每個使用 關係型資料庫的程式都可能遇到資料死鎖 1 的情況。...