死鎖的概念:安全
若是一組進程中的每個進程都在等待僅由改組進程中的其餘進程才能引起的事件,那麼改組進程是死鎖的。併發
產生死鎖的緣由:異步
一、競爭資源引起進程死鎖 ide
1)可剝奪資源和不可剝奪資源spa
系統中的資源能夠分爲兩類,一類是可剝奪資源,是指某進程在得到這類資源後,該資源能夠再被其餘進程或系統剝奪。例如,優先權高的進程能夠剝奪優先權低的進程的處理機。又如,內存區可由存儲器管理程序,把一個進程從一個存儲區移到另外一個存儲區,此即剝奪了該進程原來佔有的存儲區,甚至可將一進程從內存調到外存上,可見,CPU和主存均屬於可剝奪性資源。另外一類資源是不可剝奪資源,當系統把這類資源分配給某進程後,再不能強行收回,只能在進程用完後自行釋放,如磁帶機、打印機等。orm
2)競爭不可剝奪資源xml
在系統中所配置的不可剝奪資源,因爲它們的數量不能知足諸進程運行的須要,會使進程在運行過程當中,因爭奪這些資源而陷於僵局。例如,系統中只有一臺打印機R1和一臺磁帶機R2,可供進程P1和P2共享。假定PI已佔用了打印機R1,P2已佔用了磁帶機R2,若P2繼續要求打印機R1,P2將阻塞;P1若又要求磁帶機,P1也將阻塞。因而,在P1和P2之間就造成了僵局,兩個進程都在等待對方釋放本身所須要的資源,可是它們又都因不能繼續得到本身所須要的資源而不能繼續推動,從而也不能釋放本身所佔有的資源,以至進入死鎖狀態。htm
3)競爭臨時資源進程
上面所說的打印機資源屬於可順序重複使用型資源,稱爲永久資源。還有一種所謂的臨時資源,這是指由一個進程產生,被另外一個進程使用,短期後便無用的資源,故也稱爲消耗性資源,如硬件中斷、信號、消息、緩衝區內的消息等,它也可能引發死鎖。例如,SI,S2,S3是臨時性資源,進程P1產生消息S1,又要求從P3接收消息S3;進程P3產生消息S3,又要求從進程P2處接收消息S2;進程P2產生消息S2,又要求從P1處接收產生的消息S1。若是消息通訊按以下順序進行:事件
P1: ···Relese(S1);Request(S3); ···
P2: ···Relese(S2);Request(S1); ···
P3: ···Relese(S3);Request(S2); ···
並不可能發生死鎖。但若改爲下述的運行順序:
P1: ···Request(S3);Relese(S1);···
P2: ···Request(S1);Relese(S2); ···
P3: ···Request(S2);Relese(S3); ···
則可能發生死鎖。
二、進程推動順序不當引發死鎖
因爲進程在運行中具備異步性特徵,這可能使P1和P2兩個進程按下述兩種順序向前推動。
1) 進程推動順序合法
當進程P1和P2併發執行時,若是按照下述順序推動:P1:Request(R1); P1:Request(R2); P1: Relese(R1);P1: Relese(R2); P2:Request(R2); P2:Request(R1); P2: Relese(R2);P2: Relese(R1);這兩個進程即可順利完成,這種不會引發進程死鎖的推動順序是合法的。
2) 進程推動順序非法
若P1保持了資源R1,P2保持了資源R2,系統處於不安全狀態,由於這兩個進程再向前推動,即可能發生死鎖。例如,當P1運行到P1:Request(R2)時,將因R2已被P2佔用而阻塞;當P2運行到P2:Request(R1)時,也將因R1已被P1佔用而阻塞,因而發生進程死鎖。
死鎖產生的必要條件:
1)互斥條件:指進程對所分配到的資源進行排它性使用,即在一段時間內某資源只由一個進程佔用。若是此時還有其它進程請求資源,則請求者只能等待,直至佔有資源的進程用畢釋放。
2)請求和保持條件:指進程已經保持至少一個資源,但又提出了新的資源請求,而該資源已被其它進程佔有,此時請求進程阻塞,但又對本身已得到的其它資源保持不放。
3)不可搶佔條件:指進程已得到的資源,在未使用完以前,不能被搶佔,只能在使用完時由本身釋放。
4)循環等待序列:指在發生死鎖時,必然存在一個進程——資源的環形鏈,即進程集合{P0,P1,P2,···,Pn}中的P0正在等待一個P1佔用的資源;P1正在等待P2佔用的資源,……,Pn正在等待已被P0佔用的資源。
解除死鎖的方法:
1)終止(或撤銷)進程。終止(或撤銷)系統中的一個或多個死鎖進程,直至打破循環環路,使系統從死鎖狀態中解除出來。
2)搶佔資源。從一個或多個進程中搶佔足夠數量的資源,分配給死鎖進程,以打破死鎖狀態。
處理死鎖的方法:
1) 預防死鎖
這是一種較簡單和直觀的事先預防的方法。方法是經過設置某些限制條件,去破壞產生死鎖的四個必要條件中的一個或者幾個,來預防發生死鎖。預防死鎖是一種較易實現的方法,已被普遍使用。可是因爲所施加的限制條件每每太嚴格,可能會致使系統資源利用率和系統吞吐量下降。
2) 避免死鎖
該方法一樣是屬於事先預防的策略,但它並不須事先採起各類限制措施去破壞產生死鎖的的四個必要條件,而是在資源的動態分配過程當中,用某種方法去防止系統進入不安全狀態,從而避免發生死鎖。
3) 檢測死鎖
這種方法並不須事先採起任何限制性措施,也沒必要檢查系統是否已經進入不安全區,此方法容許系統在運行過程當中發生死鎖。但可經過系統所設置的檢測機構,及時地檢測出死鎖的發生,並精確地肯定與死鎖有關的進程和資源,而後採起適當措施,從系統中將已發生的死鎖清除掉。
4) 解除死鎖
這是與檢測死鎖相配套的一種措施。當檢測到系統中已發生死鎖時,須將進程從死鎖狀態中解脫出來。經常使用的實施方法是撤銷或掛起一些進程,以便回收一些資源,再將這些資源分配給已處於阻塞狀態的進程,使之轉爲就緒狀態,以繼續運行。死鎖的檢測和解除措施,有可能使系統得到較好的資源利用率和吞吐量,但在實現上難度也最大。