日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上

發布時間:2024/7/5 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

基本概念

cpu親和性(affinity)

CPU的親和性, 就是進程要在指定的 CPU 上盡量長時間地運行而不被遷移到其他處理器,也稱為CPU關聯性;再簡單的點的描述就將指定的進程或線程綁定到相應的cpu上;在多核運行的機器上,每個CPU本身自己會有緩存,緩存著進程使用的信息,而進程可能會被OS調度到其他CPU上,如此,CPU cache命中率就低了,當綁定CPU后,程序就會一直在指定的cpu跑,不會由操作系統調度到其他CPU上,性能有一定的提高。

軟親和性(affinity)

就是進程要在指定的 CPU 上盡量長時間地運行而不被遷移到其他處理器,Linux 內核進程調度器天生就具有被稱為 軟 CPU 親和性(affinity) 的特性,這意味著進程通常不會在處理器之間頻繁遷移。這種狀態正是我們希望的,因為進程遷移的頻率小就意味著產生的負載小。

硬親和性(affinity)

簡單來說就是利用linux內核提供給用戶的API,強行將進程或者線程綁定到某一個指定的cpu核運行。

相關函數

void CPU_ZERO (cpu_set_t *set)  /*這個宏對 CPU 集 set 進行初始化,將其設置為空集。*/

void CPU_SET (int cpu, cpu_set_t *set)  /*這個宏將 指定的 cpu 加入 CPU 集 set 中*/

void CPU_CLR (int cpu, cpu_set_t *set)  /*這個宏將 指定的 cpu 從 CPU 集 set 中刪除。*/

int CPU_ISSET (int cpu, const cpu_set_t *set)  /*如果 cpu 是 CPU 集 set 的一員,這個宏就返回一個非零值(true),否則就返回零(false)。*/

進程與cpu的綁定

#include

int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

int sched_getaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);

代碼示例:

#define _GNU_SOURCE

#include

#include

#include

#include

#include

#include

/* sysconf( _SC_NPROCESSORS_CONF ) 查看cpu的個數;打印用%ld長整。

* sysconf( _SC_NPROCESSORS_ONLN ) 查看在使用的cpu個數;打印用%ld長整 */

int main(int argc, char **argv)

{

int cpus = 0;

int i = 0;

cpu_set_t mask;

cpu_set_t get;

cpus = sysconf(_SC_NPROCESSORS_CONF);

printf("cpus: %d\n", cpus);

CPU_ZERO(&mask); /* 初始化set集,將set置為空*/

CPU_SET(0, &mask); /* 依次將0、1、2、3號cpu加入到集合,前提是你的機器是多核處理器*/

CPU_SET(1, &mask);

CPU_SET(2, &mask);

CPU_SET(3, &mask);

/*設置cpu 親和性(affinity)*/

if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {

printf("Set CPU affinity failue, ERROR:%s\n", strerror(errno));

return -1;

}

usleep(1000); /* 讓當前的設置有足夠時間生效*/

/*查看當前進程的cpu 親和性*/

CPU_ZERO(&get);

if (sched_getaffinity(0, sizeof(get), &get) == -1) {

printf("get CPU affinity failue, ERROR:%s\n", strerror(errno));

return -1;

}

/*查看運行在當前進程的cpu*/

for(i = 0; i < cpus; i++) {

if (CPU_ISSET(i, &get)) { /*查看cpu i 是否在get 集合當中*/

printf("this process %d of running processor: %d\n", getpid(), i);

}

}

sleep(10); //讓程序停在這兒,方便top命令查看

return 0;

}

結果:

線程與cpu的綁定

#include

int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);

int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset);

代碼示例:

#define _GNU_SOURCE

#include

#include

#include

#include

#include

#include

void *testfunc(void *arg)

{

int i, cpus = 0;

cpu_set_t mask;

cpu_set_t get;

cpus = sysconf(_SC_NPROCESSORS_CONF);

printf("this system has %d processor(s)\n", cpus);

CPU_ZERO(&mask);

for (i = 0; i < 4; i++) { /*將0、1、2、3添加到集合中*/

CPU_SET(i, &mask);

}

/* 設置cpu 親和性(affinity)*/

if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {

fprintf(stderr, "set thread affinity failed\n");

}

/* 查看cpu 親和性(affinity)*/

CPU_ZERO(&get);

if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {

fprintf(stderr, "get thread affinity failed\n");

}

/* 查看當前線程所運行的所有cpu*/

for (i = 0; i < cpus; i++) {

if (CPU_ISSET(i, &get)) {

printf("this thread %d is running in processor %d\n", (int)pthread_self(), i);

}

}

sleep(3); //查看

pthread_exit(NULL);

}

int main(int argc, char *argv[])

{

pthread_t tid;

if (pthread_create(&tid, NULL, (void *)testfunc, NULL) != 0) {

fprintf(stderr, "thread create failed\n");

return -1;

}

pthread_join(tid, NULL);

return 0;

}

結果:

指定在哪個CPU上運行:

void *threadfunc(void *arg)

{

cpu_set_t mask;

cpu_set_t mask;

int cpuid = 1;

CPU_ZERO(&mask);

CPU_SET(cpuid, &mask);

/* 設置cpu 親和性(affinity)*/

if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {

fprintf(stderr, "set thread affinity failed\n");

}

}

標簽:set,int,pthread,mask,cpu,線程,linux,CPU

來源: https://www.cnblogs.com/chay/p/10587452.html

總結

以上是生活随笔為你收集整理的linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。