2012-06-19 59 views
8

這是在Linux操作系統上。應用程序是用C++和ACE庫編寫的。如何檢測由於操作系統調度而導致線程或進程是否餓死

我懷疑過程中的某個線程有時候會被阻塞很長時間(5到40秒)。該應用程序大部分時間運行良好,除了每天有幾次它有這個問題。還有其他類似的5個應用程序在盒子上運行,由於套接字數據量過大,I/O也受到限制。

我想知道是否有任何事情可以通過編程方式來查看線程/進程是否正在獲取其時間片。

回答

3

如果一個過程餓死了,那麼這個過程的自我監控就不會那麼有效。但是,如果您只是希望該流程注意到該流程尚未運行一段時間,則可以定期呼叫times,並比較流逝時間的相對差異與預定用戶時間的相對差異(您可以將tms_utimetms_cutime字段如果您希望將等待孩子的時間視爲生產時間,並且如果您將代表您花費的內核時間計爲生產時間,則您將在tms_stimetms_cstime字段中求和)。對於線程時間,我知道的唯一方法是參考/proc文件系統。

高優先級的外部進程或高優先級線程可以通過讀取進程的適當的/proc/<pid>/stat條目(和線程的/proc/<pid>/task/<tid>/stat)從外部監控感興趣的進程(和線程)。用戶時間位於stat文件的第14和第16個字段中。系統時間位於第15和第17個字段中。 (字段位置對於我的Linux 2.6內核是準確的。)

在兩個時間點之間,您確定已經過去的時間量(監視進程或線程通常會定期喚醒)。然後,在這些時間點的累積處理時間之間的差異表示感興趣的線程在那段時間內運行了多少時間。處理時間與經過時間的比率將代表時間片。

信息的

最後一個位:在Linux上,我使用以下方法來獲得當前線程的tid/proc/<pid>/task/目錄檢查權task

tid = syscall(__NR_gettid); 

我這樣做,因爲我不能儘管它已被記錄,但找到系統調用實際上是由我的系統上的任何庫導出的。但是,它可能適用於你的。

相關問題