为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的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号,如果pid为0,则表示本进程
cpusetsize:mask的大小
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之间不停切换。