一,什麼是死鎖?
在併發環境下,各個進程因爲競爭資源而造成的一種互相等待對方手裏的資源,導致各個進程都堵塞,都無法向前推進的現象,就是死鎖。發送死鎖後無外力干涉,這些進程都無法向前推進
二,進程死鎖,飢餓,死循環的區別
死鎖:各個進程互相等待對方手中的資源,導致各個進程都堵塞無法向前推進的現象
飢餓:由於長期得不到想要的資源,某進程無法向前推進的現象。比如:短進程優先算法中,如果有源源不斷的短進程到來,則長進程就一直得不到處理機,從而發生長進程的飢餓
死循環:某進程執行過程中一直跳不出某個循環的現象。有時候是因爲程序邏輯bug,有時是程序員故意設計的
三,死鎖產生的四個必要條件:
1,互斥條件:只有對必須互斥使用的資源的爭搶纔會導致死鎖(如哲學家的筷子,打印機設備)。像內存,揚聲器這樣可以同時讓多個進程使用的資源不會發生死鎖(因爲進程不需要阻塞等待這種資源)
2,不剝奪條件:進程所獲得的資源在未使用完之前,不能由其他進程強行奪走,只能主動釋放
3,請求和保持條件:進程已經持有了至少一個資源,但右提出了新資源請求,而該資源又被其他進程佔有,此時請求進程被阻塞,但又對自己的資源不放。
4,循環等待條件:存在一種進程資源的循環等待鏈,鏈中的每一個進程已獲得的資源同時被下一個進程請求
5注意:發生死鎖時一定有循環等待,但是發生循環等待時未必是死鎖(循環等待是死鎖的必要不充分條件)。比如哲學家進程中,如果5個哲學家都在等待對方放下筷子二進入了循環等待,此時有一個神祕的第六人,它手上有一根樹枝(可以替代筷子的資源),給其中一個哲學家他們就不會死鎖了,即同類資源數大於1,則及時有循環等待,也未必發生死鎖。如果系統中的沒類資源只有1,那麼循環等待就是死鎖發生的充要條件。
四,什麼時候會發生死鎖
1,對系統資源的競爭:各個進程對不可剝奪的資源(如打印機)的競爭可能引起死鎖,對可剝奪的資源(CPU)的競爭是不會引起死鎖的
2,進程推進順序非法:請求和釋放資源的順序不當,也同樣會導致死鎖。例如,併發執行的進程P1,P2分別申請並佔有資源R1,R2,之後進程P1又緊接着申請資源R2,而進程P2又申請資源R1,兩者會因爲申請的資源被對方佔有二阻塞,從而發生死鎖
3,信號量的使用不當也會造成死鎖:如生產者-消費者進程中,如果實現互斥的P操作在 實現同步的P操作之前,就可能導致死鎖
總之,對不可剝奪資源的不合理分配,可能導致死鎖
五,死鎖的處理策略:
1,預防死鎖:破壞死鎖產生的四個必要條件的一個或幾個
2,避免死鎖:用某種方法防治系統進入不安全狀態,從而避免死鎖(銀行家算法)
3,死鎖的檢測和解除:允許死鎖發生,不過操作系統會負責檢測出死鎖的發生,然後採取某種措施解除死鎖