Linux进程或线程绑定到CPU

发表于:2015-5-06 09:58

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:sweychen    来源:51Testing软件测试网采编

#
Linux
分享:
  为了让程序拥有更好的性能,有时候需要将进程或线程绑定到特定的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之间不停切换。
21/212>
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号