2010-08-03 82 views
3

在我的服務器中,存在多個CPU(0-7)。我需要運行並行代碼,每個進程都有一個CPU,所以我怎麼知道每個進程的CPU信息?如何在Linux中獲取進程的CPU信息?

例如,如果兩個進程(#0和#1)的存在,並且進程#0使用CPU 5和工序#1使用CPU 7.

如何才能知道,通過編程在C或Fortran的?

回答

0

通常,您必須更改CPU關聯性,因爲進程可以在處理器之間遷移:CPU Affinity(Linux Journal,2003)。

0

更一般地說,你爲什麼想知道? Linux內核非常擅長調度進程/線程,以充分利用可用內核。

+0

因爲我想動態改變CPU速度並做一些研究工作 – 2010-08-03 20:23:17

1

一般來說,操作系統的任務是從應用程序中抽象出這些東西。 通常我會看到我的應用程序(就像在巨大的文件中執行grep一樣簡單)每隔一段時間更換一次CPU內核。

現在,如果您想強制某個特定內核上的應用程序,則可以手動設置CPU關聯性。

我以前寫過一些非常奇怪的軟件,我從來沒有想要知道和/或控制它。

你爲什麼要想要知道?

2

使用sched_getcpu()呼叫。

請記住,可以自由調度進程/線程以在任何可用的cpu/core上運行,因此您的一個進程可以在覈心1上運行一秒,在覈心2上運行下一個毫秒。您可以限制哪些處理器允許運行進程sched_setaffinity()

2

我不知道Linux上的任何系統調用會給出有關在哪個CPU上運行的線程的一般信息。 @nos是正確的,sched_getcpu()會告訴你一個線程在哪個CPU上運行,但僅限於調用上下文。

您可以通過查詢/proc文件系統來執行此操作。但是,如果發現自己圍繞此功能構建應用程序,則可能需要重新檢查設計。

文件/proc/<pid>/stats包含一個字段,爲您提供運行進程的最後一個CPU。你只需要解析輸出。 (使用man proc查看字段列表)。