2016-02-10 78 views
2

我有一個父進程,用它來產生一系列子進程,每個子進程都按順序運行自己的程序。這些程序中的每一個都隨時間變化一個文件,我想從這個文件中讀取數據並查看它在每個程序運行時如何變化。叉()在特定CPU集合上運行

我需要兩組數據才能正常工作,某些設定時間間隔(我還沒有確定間隔時間)文件的值,以及每個程序運行所需的時間,還有其他變量可以影響這些程序的執行時間,這也是我想看到的。

所以我想要得到更準確的子進程的時間,同時仍然從文件中讀取我可以在不同的核心上運行它們。我有8個內核,我想在0-3上運行父進程,然後讓孩子在4-7上運行。我不確定這是否可能通過C語言來實現,並且四處搜索還沒有得到任何答案,這使我認爲它不是。

在Linux中,除了程序之外,我可以使用taskset來執行此操作。

我打算使用內核參數isolcpus()來留出4個內核。我在運行子程序時儘可能少地噪音。

+1

你看過'sched_setaffinity()'函數嗎? (http://man7.org/linux/man-pages/man2/sched_setaffinity.2.html) – NiBZ

+4

XY問題。一個典型的Linux系統有大約100到1000個進程來處理它們的線程。你的幾條線程不會有太大的改變,但可能會讓你的系統更加混亂。你真正的問題是什麼?這裏的「準確時間」是什麼意思? (並且不要只提供外部鏈接 - 一個問題必須是獨立的)。 – Olaf

+0

爲什麼在如此無菌的條件下進行這項測試,以至於您獲得的任何結果不能用於預測現實世界中的任何事情? –

回答

1

要求內核將CPU內核與線程或進程相關聯,也稱爲設置內核和進程/線程之間的「關聯」。

在linux下,存在一組提供此功能的函數。看看在manual page的功能之一...

man pthread_setaffinity_np 

API調用的這個家庭也許能夠給你所需要的東西。 該手冊頁有一個「另請參見」部分,該部分鏈接到該系列中的其他功能。

通常情況下,如果這些功能處理內核進程和線程調度,它完全取決於內核在您的請求是否被滿足或忽略時的情緒。您的里程數可能會因系統負載或可用核心數量而異。即使系統有16個內核,這些功能也可能在內核編譯設置中被禁用(想想虛擬機)。同樣,你可能會發現有一些額外的選項可以添加到內核中,以獲得比默認值更好的結果。