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

Linux进程或线程绑定到CPU的更多相关文章

  1. linux 将进程或者线程绑定到指定的cpu上

    基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...

  2. linux进程、线程与cpu的亲和性(affinity)

    参考:http://www.cnblogs.com/wenqiang/p/6049978.html 最近的工作中对性能的要求比较高,下面简单做一下总结: 一.什么是cpu亲和性(affinity) C ...

  3. Linux 进程、线程运行在指定CPU核上

    /******************************************************************************** * Linux 进程.线程运行在指定 ...

  4. Linux进程和线程的比較

    进程与线程 參考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比較Linux进程和线程的创建的差别,以此展开: ...

  5. Linux -- 进程或线程独占CPU

    如果想让特定进程或线程独占某一或某些CPU,我们需要做三件事. 一,隔离CPU,避免其它线程run在被隔离的CPU上. 二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到in ...

  6. Linux进程与线程的区别

    进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...

  7. 操作系统:Linux进程与线程

    这里是一部分内容,还会做修改. 一:目的及内容 学习fork(),exec,pthread库函数的使用,阅读源码,分析fork,exec,pthread_create函数的机理 代码实现: 进程A创建 ...

  8. 分享自己做的一个指定进程以及线程长时间cpu监控的工具

    前言: 前面给大家分享过一个工作中用到的编译拷贝脚本,其实工作中还有一些其他工具的使用,今天再来分享一个自己纯手工的CPU监控的脚本.大家可以结合上篇文章与本篇文章一起学习shell. 主要实现功能: ...

  9. linux --> 进程和线程

    进程和线程 进程(process)和线程(thread)是操作系统的基本概念,下面用一个类比,来解释它们. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定 ...

随机推荐

  1. 后缀自动机(SAM) :SPOJ LCS - Longest Common Substring

    LCS - Longest Common Substring no tags  A string is finite sequence of characters over a non-empty f ...

  2. 代码审查工具之PMD操作指南

    上周客户要求对OA系统的代码质量进行了一个整体审查,并且要出一份报告给领导. 为此花了半天时间把代码审查工具PMD琢磨了下,现将具体操作步骤描述如下,以供大家参考! 1 前言 质量是衡量一个软件是否成 ...

  3. [Locked] Shortest Distance from All Buildings

    Shortest Distance from All Buildings You want to build a house on an empty land which reaches all bu ...

  4. Eclipse 在线汉化

    1. 打开Eclipse  , 进入菜单中 Help-->Install new Software.. 2. 到Eclipse 官网找到语言包地址,http://www.eclipse.org/ ...

  5. springboot 配置文件 .properties和.yml的写法区别

    例如 :    redis配置的properties或yml文件,如下: spring.redis.cluster.nodes[]= spring.redis.cluster.nodes[]= 或 s ...

  6. Eclipse连接SVN服务器

    (1)安装 eclipse SVN 插件      插件名称 site-1.4.8.zip      Help --> SoftwareUpdates --->Find and Insta ...

  7. win32程序中简单应用mfc

    今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...

  8. 开源实时视频码流分析软件:VideoEye

    本文介绍一个自己做的码流分析软件:VideoEye.为什么要起这个名字呢?感觉这个软件的主要功能就是对"视频"进行"分析".而分析是要用眼睛来看的,因此取了&q ...

  9. epoll 回显服务器源码

    在写epoll回显服务器代码之前,可以先看看上一篇文章:select poll epoll三者之间的比较.最近在继续学习网络编程中的服务端编程中,了解到很多网游服务器是在IOMP(IO完成端口)框架下 ...

  10. LNMP wget 记录

    源码下载 下载cmake(MySQL编译工具) http://www.cmake.org/files/v3.0/cmake-3.0.0.tar.gz 下载libmcrypt(PHPlibmcrypt模 ...