Linux进程或线程绑定到CPU
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的更多相关文章
- linux 将进程或者线程绑定到指定的cpu上
基本概念 cpu亲和性(affinity) CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性:再简单的点的描述就将指定的进程或线程绑定到相应的 ...
- linux进程、线程与cpu的亲和性(affinity)
参考:http://www.cnblogs.com/wenqiang/p/6049978.html 最近的工作中对性能的要求比较高,下面简单做一下总结: 一.什么是cpu亲和性(affinity) C ...
- Linux 进程、线程运行在指定CPU核上
/******************************************************************************** * Linux 进程.线程运行在指定 ...
- Linux进程和线程的比較
进程与线程 參考:http://www.cnblogs.com/blueclue/archive/2010/07/16/1778855.html 首先比較Linux进程和线程的创建的差别,以此展开: ...
- Linux -- 进程或线程独占CPU
如果想让特定进程或线程独占某一或某些CPU,我们需要做三件事. 一,隔离CPU,避免其它线程run在被隔离的CPU上. 二,绑定所有的interrupts到非隔离的CPU上,避免被隔离的CPU收到in ...
- Linux进程与线程的区别
进程与线程的区别,早已经成为了经典问题.自线程概念诞生起,关于这个问题的讨论就没有停止过.无论是初级程序员,还是资深专家,都应该考虑过这个问题,只是层次角度不同罢了.一般程序员而言,搞清楚二者的概念, ...
- 操作系统:Linux进程与线程
这里是一部分内容,还会做修改. 一:目的及内容 学习fork(),exec,pthread库函数的使用,阅读源码,分析fork,exec,pthread_create函数的机理 代码实现: 进程A创建 ...
- 分享自己做的一个指定进程以及线程长时间cpu监控的工具
前言: 前面给大家分享过一个工作中用到的编译拷贝脚本,其实工作中还有一些其他工具的使用,今天再来分享一个自己纯手工的CPU监控的脚本.大家可以结合上篇文章与本篇文章一起学习shell. 主要实现功能: ...
- linux --> 进程和线程
进程和线程 进程(process)和线程(thread)是操作系统的基本概念,下面用一个类比,来解释它们. 1. 计算机的核心是CPU,它承担了所有的计算任务.它就像一座工厂,时刻在运行. 2. 假定 ...
随机推荐
- 后缀自动机(SAM) :SPOJ LCS - Longest Common Substring
LCS - Longest Common Substring no tags A string is finite sequence of characters over a non-empty f ...
- 代码审查工具之PMD操作指南
上周客户要求对OA系统的代码质量进行了一个整体审查,并且要出一份报告给领导. 为此花了半天时间把代码审查工具PMD琢磨了下,现将具体操作步骤描述如下,以供大家参考! 1 前言 质量是衡量一个软件是否成 ...
- [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 ...
- Eclipse 在线汉化
1. 打开Eclipse , 进入菜单中 Help-->Install new Software.. 2. 到Eclipse 官网找到语言包地址,http://www.eclipse.org/ ...
- springboot 配置文件 .properties和.yml的写法区别
例如 : redis配置的properties或yml文件,如下: spring.redis.cluster.nodes[]= spring.redis.cluster.nodes[]= 或 s ...
- Eclipse连接SVN服务器
(1)安装 eclipse SVN 插件 插件名称 site-1.4.8.zip Help --> SoftwareUpdates --->Find and Insta ...
- win32程序中简单应用mfc
今日写程序在win32中用CRect发现报错,突然想起来.要引入mfc库.想重新建立一个工程添加对mfc的支持.发现选项不能选.查资料后发现. 在win32程序中简单应用mfc库,只需要简单的引入&l ...
- 开源实时视频码流分析软件:VideoEye
本文介绍一个自己做的码流分析软件:VideoEye.为什么要起这个名字呢?感觉这个软件的主要功能就是对"视频"进行"分析".而分析是要用眼睛来看的,因此取了&q ...
- epoll 回显服务器源码
在写epoll回显服务器代码之前,可以先看看上一篇文章:select poll epoll三者之间的比较.最近在继续学习网络编程中的服务端编程中,了解到很多网游服务器是在IOMP(IO完成端口)框架下 ...
- LNMP wget 记录
源码下载 下载cmake(MySQL编译工具) http://www.cmake.org/files/v3.0/cmake-3.0.0.tar.gz 下载libmcrypt(PHPlibmcrypt模 ...