這是一個面試問題。如何檢測並找出程序處於死鎖狀態?
如何檢測並找出程序處於死鎖狀態?
有沒有一些工具可以用來在Linux/Unix上做到這一點?
我的想法:
如果程序不作任何進展,其狀態運行,它是死鎖。
但是,其他原因也可能導致此問題。
開源工具valgrind(halgrind)可以做到這一點。
對不對?
謝謝
這是一個面試問題。如何檢測並找出程序處於死鎖狀態?
如何檢測並找出程序處於死鎖狀態?
有沒有一些工具可以用來在Linux/Unix上做到這一點?
我的想法:
如果程序不作任何進展,其狀態運行,它是死鎖。
但是,其他原因也可能導致此問題。
開源工具valgrind(halgrind)可以做到這一點。
對不對?
謝謝
我建議你看看Helgrind: a thread error detector。
這種問題最簡單的例子如下。設想一下共享資源R,它由於某種原因被兩個鎖L1和L2所保護,這兩個鎖在訪問R時必須同時存在。
假設一個線程獲取L1,然後是L2,並繼續訪問R.這意味着程序中的所有線程必須按照L1和L2的順序獲取兩個鎖。不這樣做可能會造成僵局。
如果兩個線程(稱爲T1和T2)都要訪問R,則會發生死鎖。假設T1先獲取L1,然後T2首先獲取L2。然後T1嘗試獲取L2,T2嘗試獲取L1,但這些鎖都已經被佔用。因此,T1和T2成爲陷入僵局。」
如果您懷疑死鎖,做一個ps aux | grep <exe name>
,如果在輸出時,PROCESS STATE CODE
是D
(不間斷睡眠)意味着它是一個僵局。 因爲隨着@daijo解釋,說你有兩個線程T1
& T2
,並分別由semaphores S1 & S2
然後保護兩個關鍵部分,如果T1
獲得S1
和T2
獲得S2
,之後他們嘗試放棄已經通過其持有人之前獲取其他鎖,這將導致死鎖和在做ps aux | grep <exe name>
,process state code
將是D
(即不間斷睡眠)。
工具:
Valgrind的,Lockdep(linux內核實用程序)
檢查類型的死鎖,以及如何避免他們該鏈接: http://cmdlinelinux.blogspot.com/2014/01/linux-kernel-deadlocks-and-how-to-avoid.html
不間斷睡眠表示等待任何數量的資源,通常是IO - 你如何使用它來解決死鎖問題? – excalibur 2016-06-06 19:25:46