操作系統對死鎖的描述如下:
所謂死鎖:是指兩個或兩個以上的進程在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。
那麼爲什麼會產生死鎖呢?
1.因爲系統資源不足。
2.進程運行推進的順序不合適。
3.資源分配不當。
而產生死鎖的條件有四個:
1.互斥條件:所謂互斥就是進程在某一時間內獨佔資源。
2.請求與保持條件:一個進程因請求資源而阻塞時,對已獲得的資源保持不放。
3.不剝奪條件:進程已獲得資源,在末使用完之前,不能強行剝奪。
4.循環等待條件:若干進程之間形成一種頭尾相接的循環等待資源關係。
1) 先用!locks查看所有的線程佔用的鎖
這裏可以看到有三個線程正在等待三個鎖,第一個線程等待的鎖是0043a620,但被5e4這條線程佔用,第二個線程等待的鎖是0043a844,但被5dc線程佔用,
第三個線程等待的鎖是031d40d4,也被5e4線程佔用。
2)接着,我們需要查看5e4線程和5dc線程的id,具體可以通過查看工具欄中Processes and Threads,如下圖所示,5e4的線程的id爲53,5dc線程的id爲51。
3)分別輸入~53kb和~51kb查看這個兩個線程的調用棧,結果如下圖所示
由數據可知,5e4線程正在等待一把0043a844的鎖,而5dc線程也正在等待鎖0043a620。
4)結合第一步獲取的信息可知,5e4線程要去獲取已經被5dc佔用的鎖0043a844,而5dc又要去獲取已經被5e4佔用的鎖0043a620,如此形成環路,就產生了死鎖
以上幾步就是分析死鎖的幾個關鍵步驟