在 linux 系統中,執行緒排程是由核心自主完成的。當系統執行在多核 cpu 上時,執行緒有可能在不同的 cpu 核上來回切換執行。這不利於 cpu 的快取,缺頁率較高。
以 intel i5 cpu 為例。在多核 cpu 結構中,每個 cpu 有各自的 l1、l2 快取,而 l3 快取是共用的。如果乙個執行緒在 cpu 間來回切換,各個 cpu 的快取的命中率將會降低。而如果執行緒不管如何排程,都始終可以在乙個 cpu 上執行,那麼其資料的 l1、l2 快取的命中率將得到顯著提高。
使用命令 taskset 可以把執行緒繫結為指定 cpu 上。
taskset 命令使用方法如下:
taskset -p
執行緒的 pid 可以使用pstree -p | grep
來獲取。但該方法的前提是執行緒必須已設定名稱,否則無法使用 pstree 來檢視執行緒。
cpu_set 為執行緒對應的 cpu 集,為整型型別,其數值為 1 的 bit 位對應著哪一號 cpu(從 0 起算)。例如 cpu_set 為 1(0001)時對應 1 號 cpu,為 4(0100)時對應 2 號 cpu。
當 cpu_set 有多個 bit 位為 1 時,表示系統會把執行緒隨機排程到在這些 cpu 之一上執行。例如當執行緒對應的 cpu_set 為 3 即二進位制 0011 時,表示該執行緒將被系統隨機地在 0 號 cpu 或 1 號 cpu 上排程執行。
當 taskset 不使用只使用
-p
時,表示查詢該執行緒對應的 cpu 集情況。
以下示例將使用命令 taskset 把執行緒號為 1958 的執行緒繫結為 1 號 cpu 上:
~ # taskset -p 1958
pid 1958's current affinity mask: 3
~ # taskset -p 2 1958
pid 1958's current affinity mask: 3
pid 1958's new affinity mask: 2
在 linux 中,可以使用sched_setaffinity()
改變執行緒對應的 cpu 集,把執行緒繫結到指定 cpu 上。
函式 sched_setaffinity 所屬標頭檔案,函式原型如下:
int
sched_setaffinity
(pid_t pid, size_t cpusetsize,
const cpu_set_t* mask)
;
可見,該實際上就是把執行緒pid
設定為指定 cpu 集。當傳參pid
為 0 時表示把當前執行緒的 cpu 集設定為mask
。
巨集函式功能
cpu_set(int cpu, cpu_set_t* cpusetp)
把cpu
新增到cpusetp
中
cpu_clr(int cpu, cpu_set_t* cpusetp)
把cpu
從cpusetp
中刪除
int cpu_isset(int cpu, cpu_set_t* cpusetp)
判斷cpu
是否在cpusetp
中,存在則返回 1,否則返回 0
cpu_zero(cpu_set_t* cpusetp)
清空cpusetp
,即把cpusetp
的每一 bit 位清零
cpu_count(cpu_set_t* cpusetp)
查詢cpusetp
的 bit 位為 1 的個數,即執行緒排程的 cpu 個數
其中,cpu
指的是哪一號 cpu,該編號從 0 起算。
在使用以上巨集時,需先開啟巨集__use_chu
與_gnu_source
告訴編譯器啟動以上巨集函式,且這些巨集宣告必須在所有標頭檔案宣告之前:
#ifndef __use_chu
#define __use_chu
#endif
#define _gnu_source
#include
以下示例把當前執行緒繫結為 3 號 cpu 上:
cpu_set_t mask;
cpu_zero
(&mask)
;cpu_set(3
,&mask)
;sched_setaffinity(0
,sizeof
(cpu_set_t)
,&mask)
;
執行緒繫結CPU核
linux系統提供api函式sched setaffinity和sched getaffinity用於設定或獲取執行緒的可以使用的cpu核。int sched setaffinity pid t pid,unsigned int cpusetsize,cpu set t mask 這個函式中pid表...
執行緒繫結CPU核
linux系統提供api函式sched setaffinity和sched getaffinity用於設定或獲取執行緒的可以使用的cpu核。int sched setaffinity pid t pid,unsigned int cpusetsize,cpu set t mask 這個函式中pid表...
Linux程序或執行緒繫結到CPU
linux提供乙個介面,可以將程序繫結到特定的cpu include int sched setaffinity pid t pid,size t cpusetsize,const cpu set t mask int sched getaffinity pid t pid,size t cpuse...