2013-04-13 39 views
0

我可以調用哪些庫函數來獲取進程映射到內核或給出進程ID告訴我它正在運行的是哪個核心,它上次運行還是計劃運行。所以像這樣:如何在C中獲得核心映射的進程?

core 1: 14232,42323 
core 2: 42213,63434,434 
core 3: 34232,34314 
core 4: 42325,6353,1434,4342 
core 5: 43432,64535,14345,34233 
core 6: 23242,53422,4231,34242 
core 7: 78789 
core 8: 23423,23124,5663 

sched_getcpu返回調用進程的核心號碼。如果有一個給定進程ID的函數,會返回一個很好的核心數字,但我沒有找到一個。 sched_getaffinity也沒有用;它只是告訴你給定一個過程什麼核心它可以運行哪個不是我感興趣的。

+1

在給定的時刻CPU核心運行最多一個進程... –

+2

爲什麼要問?想用這些無用的信息做什麼? –

+0

我編輯它。我有一個倉庫和有限數量的流程。知道在哪些內核上運行哪些進程對我來說非常重要。另外,不要忘記,你可以在一個核心上設置進程,以便它只能在該核心上運行。 – theRealWorld

回答

1

是,虛擬文件​​/proc/[pid]/stat似乎有這樣的信息:​​:

/proc/[pid]/stat 
     Status information about the process. This is used by ps(1). It is 
     defined in /usr/src/linux/fs/proc/array.c. 
     (...fields description...) 

     processor %d (since Linux 2.2.8) 
         CPU number last executed on. 

在我的雙核:

cat /proc/*/stat | awk '{printf "%-32s %d\n", $2 ":", $(NF-5)}' 
(su):       0 
(bash):       0 
(tail):       1 
(hd-audio0):      1 
(chromium-browse):    0 
(bash):       1 
(upstart-socket-):    1 
(rpcbind):      1 

..though如果是相關的,我不能說/或準確..

2

你的問題沒有任何確切的答案。調度程序可以隨時將進程從一個處理器核心遷移到另一個處理器核心(實際上它正在這樣做)。所以當你得到答案時,它可能已經是錯誤的了。並且一個進程通常不與任何特定內核綁定(除非其CPU親和力已被設置爲例如sched_setaffinity(2),這是不常見的;更多地參見cpuset(7))。

你爲什麼問?爲什麼這很重要?

您可能想挖掘/proc,請參閱proc(5)手冊頁。

換句話說,如果內核確實提供了這些信息,它是通過/proc/,但我猜這些信息不可用,因爲它沒有任何意義。

NB。內核將在各種處理器內核上安排進程,這比您可以做得更好,所以即使在倉庫中,您也不應該關心運行某個pid的核心。

+0

我有一個倉庫和有限數量的流程。知道在哪些內核上運行哪些進程對我來說非常重要。另外,不要忘記,你可以在一個核心上設置進程,以便它只能在該核心上運行。 – theRealWorld

+0

調度程序不會爲了高速緩存目的而經常從核心處移動進程。我的任務與分析相關,對我來說知道每個進程在哪裏運行非常重要。許多人經常認爲處理器會盡一切努力。通常,小的調整可以在倉庫中節省數百萬美元。 – theRealWorld

3

我不知道,你可以得到什麼CPU任何特定的過程運行的信息,但是如果你在/proc看,你會發現每個正在運行的進程的一個條目。在此之下,在/proc/<pid>/cpuset中,您可以找到有關可用於運行該進程的一組CPU的信息。