我有搜索關於CPU親和力的問題/答案,並閱讀結果,但我仍然無法讓我的線程釘上一個CPU。爲什麼系統監視器不顯示正確的CPU關聯性?
我正在研究一個將在專用Linux機器上運行的應用程序,所以我不關心其他進程,只有我自己的。此應用程序當前生成一個pthread,然後主線程進入while循環以使用POSIX msg隊列處理控制消息。這while循環阻止等待控件味精進來,然後處理它。所以主線程非常簡單而且非關鍵。我的代碼工作得很好,因爲我可以發送這個應用程序消息,它會處理它們就好了。所有的控制消息都是非常小的尺寸,用於控制應用程序的功能,也就是說,只有少數控制消息被髮送/接收。
在我進入這個while循環之前,我使用sched_getaffinity()來記錄所有可用的CPU。然後我使用sched_setaffinity()將此進程設置爲單個CPU。然後我再次調用sched_getaffinity()來檢查它是否設置爲僅在一個CPU上運行,並且確實是正確的。
產生的單個pthread也做類似的事情。我在新創建的pthread中做的第一件事是調用pthread_getaffinity_np()並檢查可用的CPU,然後調用pthread_setaffinity_np()將其設置爲不同的CPU,然後調用pthread_getaffinity_np()檢查它是否設置爲所需,並且確實如此正確。
這是令人困惑的。當我運行應用程序並在系統監視器中查看CPU歷史記錄時,我發現沒有與運行該應用程序時沒有所有這些設置親和性內容的區別。調度程序仍然在這個四核心盒上的4個CPU中運行幾秒鐘。所以看起來調度器忽略了我的親和力設置。
我錯在期待看到一些證明,主線程和pthread實際上是在他們自己的單CPU中運行?還是我忘了做更多的事情來讓它按照我的意圖工作?
感謝,
-Andres