Linux 程式設計 執行緒繫結 CPU

2021-10-02 07:24:36 字數 2443 閱讀 7380

在 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)cpucpusetp中刪除

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...