博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux进程或线程绑定到CPU
阅读量:5314 次
发布时间:2019-06-14

本文共 3840 字,大约阅读时间需要 12 分钟。

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 
#include
#include
#include
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 
#include
#include
#include
#include
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之间切换。

 

 

转载于:https://www.cnblogs.com/swey/p/4469722.html

你可能感兴趣的文章
面向对象(多异常的声明与处理)
查看>>
MTK笔记
查看>>
ERROR: duplicate key value violates unique constraint "xxx"
查看>>
激活office 365 的启动文件
查看>>
无法根据中文查找
查看>>
[简讯]phpMyAdmin项目已迁移至GitHub
查看>>
转载 python多重继承C3算法
查看>>
【题解】 bzoj1597: [Usaco2008 Mar]土地购买 (动态规划+斜率优化)
查看>>
css文本溢出显示省略号
查看>>
git安装和简单配置
查看>>
面向对象:反射,双下方法
查看>>
鼠标悬停提示文本消息最简单的做法
查看>>
Java面向对象重要关键字
查看>>
课后作业-阅读任务-阅读提问-2
查看>>
面向对象设计中private,public,protected的访问控制原则及静态代码块的初始化顺序...
查看>>
fat32转ntfs ,Win7系统提示对于目标文件系统文件过大解决教程
查看>>
Awesome Adb——一份超全超详细的 ADB 用法大全
查看>>
shell cat 合并文件,合并数据库sql文件
查看>>
Android 将drawable下的图片转换成bitmap、Drawable
查看>>
介绍Win7 win8 上Java环境的配置
查看>>