打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Linux进程或线程绑定到CPU

Linux进程或线程绑定到CPU

为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的CPU,这样可以减少调度的开销和保护关键进程或线程。

进程绑定到CPU

Linux提供一个接口,可以将进程绑定到特定的CPU

#include <sched.h>

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

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

参数

pid:进程的id号,如果pid0,则表示本进程

cpusetsizemask的大小

mask:运行进程的CPU,可以通过以下函数操作mask

#define CPU_SET(cpu, cpusetp) //设置cpu

#define CPU_CLR(cpu, cpusetp) //删除cpu

#define CPU_ISSET(cpu, cpusetp) //判断cpu

#define CPU_ZERO(cpusetp) //初始化为0

示例代码

#include <stdio.h>#include <unistd.h>#include <math.h>#include <sched.h> void WasteTime(){    int abc = 10000000;    while(abc--)    {        int tmp = 10000*10000;    }    sleep(1);}int main(int argc, char **argv){    cpu_set_t mask;    while(1)    {         CPU_ZERO(&mask);        CPU_SET(0, &mask);         if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {            perror("sched_setaffinity");        }        WasteTime();         CPU_ZERO(&mask);        CPU_SET(1, &mask);         if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {            perror("sched_setaffinity");        }        WasteTime();             CPU_ZERO(&mask);        CPU_SET(2, &mask);         if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {            perror("sched_setaffinity");        }        WasteTime();             CPU_ZERO(&mask);        CPU_SET(3, &mask);         if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {            perror("sched_setaffinity");        }        WasteTime();    }}

 

测试

编译之后运行程序,输入命令top -p 进程id,输入f,输入j,输入回车,可以看到进程在cpu0123之间不停切换。

 

线程绑定到CPU

不仅仅进程可以绑定到CPU,线程也可以。Linux提供一个接口,可以将线程绑定到特定的CPU

#include <pthread.h>

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, cpu_set_t *cpuset);

该接口与进程绑定到CPU的接口的使用方法基本一致。

当进程绑定到特定的CPU之后,线程还是可以绑定到其他的CPU的,没有冲突。

示例代码

#include <stdio.h>#include <math.h>#include <pthread.h>#include <unistd.h>#include <sched.h>void WasteTime(){    int abc = 10000000;    while(abc--)    {        int tmp = 10000*10000;    }    sleep(1);}void *thread_func(void *param){    cpu_set_t mask;    while(1)    {         CPU_ZERO(&mask);        CPU_SET(1, &mask);         if (pthread_setaffinity_np(pthread_self(), sizeof(mask),            &mask) < 0) {            perror("pthread_setaffinity_np");        }         WasteTime();         CPU_ZERO(&mask);        CPU_SET(2, &mask);         if (pthread_setaffinity_np(pthread_self(), sizeof(mask),            &mask) < 0) {            perror("pthread_setaffinity_np");        }        WasteTime();    }} void *thread_func1(void *param){    cpu_set_t mask;    while(1)    {         CPU_ZERO(&mask);        CPU_SET(3, &mask);         if (pthread_setaffinity_np(pthread_self(), sizeof(mask),            &mask) < 0) {            perror("pthread_setaffinity_np");        }         WasteTime();         CPU_ZERO(&mask);        CPU_SET(4, &mask);         if (pthread_setaffinity_np(pthread_self(), sizeof(mask),            &mask) < 0) {            perror("pthread_setaffinity_np");        }        WasteTime();    }} int main(int argc, char *argv[]){    cpu_set_t mask;     CPU_ZERO(&mask);    CPU_SET(0, &mask);     if (sched_setaffinity(0, sizeof(mask), &mask) < 0) {        perror("sched_setaffinity");    }    pthread_t my_thread;     if (pthread_create(&my_thread, NULL, thread_func,        NULL) != 0) {        perror("pthread_create");    }    if (pthread_create(&my_thread, NULL, thread_func1,        NULL) != 0) {        perror("pthread_create");    }    while(1) { WasteTime(); }    pthread_exit(NULL);}

 

测试

编译运行之后,输入命令top -p 进程id,输入f,输入j,输入回车,输入H,可以看到主线程一直保持在cpu0,一个线程在cpu12之前切换,另一个线程在cpu34之间切换。

 

 

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
CPU与线程绑定
实时和非实时调度策略测试总结
linux 下进程和线程指定CPU运行
Linux_多核系统下绑定进程或线程到指定CPU_核执行
线程属性pthread
Android:通过systrace进行性能分析
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服