線程死鎖概念和產生原因

一、死鎖的概念

所謂死鎖,是指多個進程在運行過程中因爭奪資源而照成的一種僵局。當進程處於這種僵持狀態時,若無外力作用,它們都將無法再向前推進。

二、產生死鎖的原因

(1)競爭資源。當系統中供多個進程共享的資源如打印機、公用隊列等,其數目不足以滿足諸進程的需要時,會引起諸進程對資源的競爭而產生死鎖。 
(2)進程間推進順序非法。進程在運行過程中,請求和釋放資源的順序不當,也同樣會產生進程死鎖。 
以下詳細分析產生死鎖的原因

1.競爭資源引起進程死鎖

1)可剝奪和非剝奪性資源 
可把系統中的資源分爲兩類,一類是可剝奪性資源,是指進程在獲得這類資源後,該資源可以再被其它進程或系統剝奪。例如,優先權高的進程可以剝奪優先權低的進程的處理機。又如,內存區可由存儲器管理程序把一個進程從一個存儲區移到另一個存儲區,此即剝奪了該進程原來佔有的存儲區。甚至可以將一個進程從內存調到外存上。可見CPU和主存均屬於可剝奪性資源。另一類資源是不可剝奪性資源,當系統把這類資源分配給某進程後,再不能強行回收,只能在進程用完後自行釋放,如磁帶機、打印機等。 
2)競爭非剝奪性資源 
在系統中所配置的非剝奪性資源,由於它們的數量不能滿足諸進程運行的需要,會使進程在運行過程中,因爭奪這些資源而陷入僵局。例如,例如系統中只有一臺打印機R1和一臺磁帶機R2,可供進程P1和P2共享。假定P1已佔用了打印機R1,P2已佔用了磁帶機R2。此時,若P2繼續要求打印機,P2將阻塞;P1若又要求磁帶機,P1也將阻塞。於是,在P1和P2之間便形成了僵局,兩個進程都在等待對方釋放自己所需的資源。但它們都因不能繼續獲得自己所需的資源而不能繼續推進,從而也不能釋放自己已佔有的資源,以致進入死鎖狀態。爲方便說明,用方塊代表資源,圓圈代表進程給出如下狀態圖: 
這裏寫圖片描述 
當箭頭從進程指向資源時,表示進程請求資源;當箭頭從資源指向進程時,表示該資源已被分配給該進程。從中可以看出,這時在P1、P2及R1和R2之間已經形成了一個環路,說明已進入死鎖狀態。 
3)競爭臨時資源 
上述的打印機資源屬於可順序重複使用型資源,稱爲永久性資源。還有一種是所謂的臨時資源,這是指由一個進程產生,被另一進程使用一短暫時間後便無用的資源,故也稱爲消耗性資源,它也可能引起死鎖。下圖展示了在進程間通信時形成死鎖的情況。 
進程之間通信死鎖 
圖中S1、S2和S3是臨時性資源。進程P1產生消息S1,又要求從P3接收消息S3;進程P3產生消息S3,又要求從P2接收消息S2;進程P2產生消息S2,又要求從P2接收消息S1. 
說明: 
若按下列順序進行無死鎖產生: 
P1:…Release(s1);Request(S3);… 
P2:…Release(s2);Request(S1);… 
P3:…Release(s3);Request(S2);… 
但若按下列順序進行可能產生死鎖: 
P1:… Request(S3); Release(s1); … 
P2:… Request(S1) ; Release(s2);… 
P3:… Request(S2) ; Release(s3);…

2.進程推進順序不當引起死鎖

由於進程在運行中具有異步性特徵,這就可能使上述P1和P2兩個進程按下述兩種順序向前推進。 
1)進程推進順序合法 
我們稱不會引起進程死鎖的推進順序是合法的。 
2)進程推進順序不合法 
我們稱會引起進程死鎖的推進順序是不合法的。

三、產生死鎖的必要條件

(1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。如果此時還有其它進程請求該資源,則請求者只能等待,直至佔有該資源的進程用畢釋放。  (2)請求和保持條件:指進程已經保持了至少一個資源,但又提出了新的資源請求,而該資源又被其它進程佔有,此時請求進程阻塞,但又對自己獲得的其它資源保持不放。  (3)不剝奪條件:指進程已獲得資源,在使用完之前,不能被剝奪,只能在使用完時由自己釋放。  (4)環路等待條件:指在發生死鎖時,必然存在一個進程—資源的環形鏈,即進程集合(P0,P1,P2,…,Pn)中的P0正在等待一個P1佔用的資源;P1正在等待一個P2佔用的資源,……,Pn正在等待已被P0佔用的資源。