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. 假定 ...
随机推荐
- 【转】java中float与byte[]的互转 -- 不错
原文网址:http://tjmljw.iteye.com/blog/1767716 起因:想把一个float[]转换成内存数据,查了一下,下面两个方法可以将float转成byte[]. 方法一 imp ...
- 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列
339. [NOI2005] 维护数列 时间限制:3 s 内存限制:256 MB [问题描述] 请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线‘ _ ’表示实际 ...
- UVa11613 Acme Corporation(最小费用流)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33452 [思路] 最小费用流. 构图: 1 每个月建立2个点,建立 ...
- codeforces 610B
Description Vika has n jars with paints of distinct colors. All the jars are numbered from 1 to n an ...
- Python中http请求方法库汇总
最近在使用python做接口测试,发现python中http请求方法有许多种,今天抽点时间把相关内容整理,分享给大家,具体内容如下所示: 一.python自带库----urllib2 python自带 ...
- FreeRTOS学习笔记——任务间使用队列同步数据
1.前言 在嵌入式操作系统中队列是任务间数据交换的常用手段,队列是生产者消费者模型的重要组成部分.FreeRTOS的队列简单易用,下面结合一个具体例子说明FreeRTOS中的队列如何使用. 2.参考代 ...
- [HTML5] Emmet
For example we want to generate the code like this: <a href="#tab1">Tab 1</a>& ...
- cocos2d-x项目过程记录(跨平台iOS和Android)
(原创作品,欢迎转载,注明出处,谢谢:http://www.cnblogs.com/binxindoudou/admin/EditPosts.aspx?postid=3205249) 1.配置环境,重 ...
- 从零开始学习jQuery-------jQuery元素选择器(三)
下面我们来介绍一下jQuery元素选择器,在Web开发中我们最常用的操作是获取元素,然后对获取的元素进行一系列的操作,jQuery根据获取页面元素的不同,可以将jQuery选择器分为四大类:基本选择器 ...
- android中的数据库操作(转)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...