Linux 中執行緒與 CPU 核的繫結

發表於2016-11-03

最近在對專案進行效能優化,由於在多核平臺上,所以瞭解了些程式、執行緒繫結cpu核的問題,在這裡將所學記錄一下。

不管是執行緒還是程式,都是通過設定親和性(affinity)來達到目的。對於程式的情況,一般是使用sched_setaffinity這個函式來實現,網上講的也比較多,這裡主要講一下執行緒的情況。

與程式的情況相似,執行緒親和性的設定和獲取主要通過下面兩個函式來實現:

從函式名以及引數名都很明瞭,唯一需要點解釋下的可能就是cpu_set_t這個結構體了。這個結構體的理解類似於select中的fd_set,可以理解為cpu集,也是通過約定好的巨集來進行清除、設定以及判斷:
cpu集可以認為是一個掩碼,每個設定的位都對應一個可以合法排程的 cpu,而未設定的位對應一個不可排程的 CPU。換而言之,執行緒都被繫結了,只能在那些對應位被設定了的處理器上執行。通常,掩碼中的所有位都被置位了,也就是可以在所有的cpu中排程.
以下為測試程式碼:
這段程式碼將使myfun執行緒在所有cpu中依次執行一段時間,在我的四核cpu上,執行結果為  :
在一些嵌入式裝置中,執行的程式執行緒比較單一,如果指定程式執行緒執行於特定的cpu核,減少程式、執行緒的核間切換,有可能可以獲得更高的效能。

相關文章