2012-02-22 53 views
3

這是一個面試問題。如何檢測並找出程序處於死鎖狀態?

如何檢測並找出程序處於死鎖狀態?

有沒有一些工具可以用來在Linux/Unix上做到這一點?

我的想法:

如果程序不作任何進展,其狀態運行,它是死鎖。

但是,其他原因也可能導致此問題。

開源工具valgrind(halgrind)可以做到這一點。

對不對?

謝謝

回答

2

我建議你看看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成爲陷入僵局。」

4

如果您懷疑死鎖,做一個ps aux | grep <exe name>,如果在輸出時,PROCESS STATE CODED(不間斷睡眠)意味着它是一個僵局。 因爲隨着@daijo解釋,說你有兩個線程T1 & T2,並分別由semaphores S1 & S2然後保護兩個關鍵部分,如果T1獲得S1T2獲得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

+3

不間斷睡眠表示等待任何數量的資源,通常是IO - 你如何使用它來解決死鎖問題? – excalibur 2016-06-06 19:25:46

相關問題