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号,如果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 = ;
while(abc--)
{
int tmp = *;
}
sleep(); } int main(int argc, char **argv)
{
cpu_set_t mask;
while()
{ CPU_ZERO(&mask);
CPU_SET(, &mask);
if (sched_setaffinity(, sizeof(mask), &mask) < ) {
perror("sched_setaffinity");
}
WasteTime(); CPU_ZERO(&mask);
CPU_SET(, &mask);
if (sched_setaffinity(, sizeof(mask), &mask) < ) {
perror("sched_setaffinity");
}
WasteTime(); CPU_ZERO(&mask);
CPU_SET(, &mask);
if (sched_setaffinity(, sizeof(mask), &mask) < ) {
perror("sched_setaffinity");
}
WasteTime(); CPU_ZERO(&mask);
CPU_SET(, &mask);
if (sched_setaffinity(, sizeof(mask), &mask) < ) {
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 = ;
while(abc--)
{
int tmp = *;
}
sleep(); } void *thread_func(void *param)
{
cpu_set_t mask;
while()
{
CPU_ZERO(&mask);
CPU_SET(, &mask); if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
&mask) < ) {
perror("pthread_setaffinity_np");
} WasteTime(); CPU_ZERO(&mask);
CPU_SET(, &mask);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
&mask) < ) {
perror("pthread_setaffinity_np");
} WasteTime();
}
} void *thread_func1(void *param)
{
cpu_set_t mask;
while()
{
CPU_ZERO(&mask);
CPU_SET(, &mask); if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
&mask) < ) {
perror("pthread_setaffinity_np");
} WasteTime(); CPU_ZERO(&mask);
CPU_SET(, &mask);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask),
&mask) < ) {
perror("pthread_setaffinity_np");
} WasteTime();
}
} int main(int argc, char *argv[])
{
cpu_set_t mask;
CPU_ZERO(&mask);
CPU_SET(, &mask);
if (sched_setaffinity(, sizeof(mask), &mask) < ) {
perror("sched_setaffinity");
} pthread_t my_thread; if (pthread_create(&my_thread, NULL, thread_func,
NULL) != ) {
perror("pthread_create");
}
if (pthread_create(&my_thread, NULL, thread_func1,
NULL) != ) {
perror("pthread_create");
}
while() { WasteTime(); }
pthread_exit(NULL); }

测试

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

最新文章

  1. 树莓派 Linux备忘
  2. [oracle]逗号(或分号等)间隔的列,按这一列劈分后转多行
  3. java类加载器
  4. laravel captcha
  5. 1439. Battle with You-Know-Who(splay树)
  6. Tasks on 2013
  7. Java基础知识强化之网络编程笔记20:Android网络通信之 Android常用OAuth登录和分享
  8. BZOJ 2754: [SCOI2012]喵星球上的点名
  9. 前端html+css之第十四天
  10. Web前端开发面试题赋答案
  11. 1230.2——iOS准备(阅读开发者文档时的笔记)
  12. UINavigationController 导航控制器
  13. 启示—地点IT高管20在职场心脏经(读书笔记6)
  14. JAVA 单步调试快捷键
  15. vue 2.0 scopedSlots和slots在render函数中的应用示例
  16. 修改 CKEditor 超链接的默认协议
  17. netty源码解解析(4.0)-5 线程模型-EventExecutorGroup框架
  18. tmux的使用
  19. call 和 apply
  20. ASP.NET中UrlEncode应该用Uri.EscapeDataString()(转)

热门文章

  1. 数据结构(KD树):HDU 4347 The Closest M Points
  2. 【单调队列】Vijos P1771 瑞士轮 (NOIP2011普及组第三题)
  3. ScrollView自动滑到底部
  4. [Audio processing] 常见语音特征 —— LPC
  5. Fiddler 模拟post 提交
  6. linux两台server远程copy文件
  7. Java基础知识强化之集合框架笔记13:Collection集合存储学生对象并遍历
  8. Getting Started with the NDK
  9. fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志&lt;转&gt;
  10. Android 项目建立步骤