2014-09-13 100 views
0

如何知道進程正在空閒?如何確定進程是否處於空閒狀態C

讓我說我的程序會產生n個進程,我想知道他們中的任何一個是否處於空閒狀態,以便我可以要求他們做額外的工作,但問題是如何確定進程是否在其分配的時間片。

我可以在整個系統中找到cpu利用率((總時間 - 空閒時間)/總時間),但不知道如何才能獲得某個進程的CPU利用率。

因爲(糾正我,如果我錯了)一個進程,如果在一個時間片空閒,會自動放棄剩餘的CPU時間,所以讓這個進程的CPU時間是不好的。

一個可能的解決辦法是,看是否自願上下文切換次數增加(可以說超過閾值),但我有比內核2.6.23所以讀的/ proc/PID /爲voluntary_context_switches狀態下工作& nonvoluntary_context_switches不我的選擇...

任何建議...

注: ,我給上面的是一個過於簡單化的例子。 IPC不是一種選擇。特定通話過程應該能夠確定它是否處於空閒狀態。在流程花費時間的所有地方跟蹤這一點並不可行。底線,我想看看一些內核統計,以確定這個特定的過程是否坐着,並根據這些信息做一些東西。

+1

工作進程應該告訴管理進程完成之前的任務。 – Barmar 2014-09-13 01:02:42

+1

或者您可以只有一個隊列,所有工作進程都從中執行任務。當工作人員完成最後一項任務時,它只是讀取隊列中的下一個任務。 – Barmar 2014-09-13 01:03:39

+2

這就像[XY問題]的字典定義(http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – Barmar 2014-09-13 01:05:44

回答

0

一種方法是使用WMI在Windows中檢查進程CPU統計 在Unix中,你需要運行命令,如上面找到進程的CPU利用率

或者,如果這些進程是由主進程管理,實際上創建它們,它需要維護類似於線程池的空閒和使用進程

+0

請再次閱讀這個問題,我可以找到進程的CPU利用率,但重點是如何找到「閒置」時間。一個閒置的進程只會顯示0%的利用率,這也可能是睡眠,阻塞進程的情況。你將如何區分它們。 – 2014-09-13 01:26:57

+0

進程本身應該能夠找到它,主服務器無法維護隊列 – 2014-09-13 01:28:00

+2

進程處於空閒狀態的唯一時間是它正在休眠或被阻塞的時間。還有什麼其他的閒置? – Barmar 2014-09-13 01:28:37

0

不確定這是否滿足您的要求,但是一種方法是在內核模塊的幫助下從用戶空間訪問內核中的task_struct結構。這將在進程pid的幫助下爲您提供完整的進程信息。您可以在下面的鏈接中查看內核源代碼中的task_struct結構定義。如果你可以給我們更多關於你想要做什麼的細節,它會幫助我們分享一些可行的東西。

http://lxr.free-electrons.com/source/include/linux/sched.h#L1224

+0

我不會那樣。我相信OP想要一個用戶地解決方案。 – 2014-09-17 05:00:40

1

您的程序forking(未產卵)的過程。換句話說,您的程序應該使用fork(2)而不是posix_spawn來啓動其他進程。

然後你的程序知道它的子進程的PID(這是fork的結果),它應該保留它們。一旦你知道一個過程的PID,例如, 1234,使用/proc/1234/查詢有關該過程的信息。見proc(5);特別是你的程序可以讀取/proc/1234/status/proc/1234/stat等....你的程序需要打開,順序讀取,並關閉這些僞文件(這很快,沒有涉及磁盤IO)。

但是,我認爲這是錯誤的做法。您最好使用一些pipe(7) -s到那些進程,並且有一個event loop,例如測試。與poll(2)哪個管道是可讀寫的。很可能繁忙的子進程在監視過程中將使其輸入管道不可寫入(因爲已滿)。

順便說一句,你應該考慮升級你的內核。

1

你可以閱讀的/ proc/PID/STAT - 第三場(與scanf("%*s %*s %c", &state)閱讀)是進程的當前狀態的單個字符:

R - running 
S - sleeping in interruptable wait 
D - waiting in uninterruptable disk sleep 
Z - zombie (exited) 
T - traced or stopped 
W - paging wait 

如果進程停止等待睡眠或I/O,它將處於狀態S

相關問題