Linux下CPU绑定线程、进程
来源:互联网 发布:我要当学霸 知乎 编辑:程序博客网 时间:2024/05/16 10:08
最近在对项目进行性能优化,由于在多核平台上,所以了解了些进程、线程绑定cpu核的问题,在这里将所学记录一下。
不管是线程还是进程,都是通过设置亲和性(affinity)来达到目的。对于进程的情况,一般是使用sched_setaffinity这个函数来实现,网上讲的也比较多,这里主要讲一下线程的情况。
与进程的情况相似,线程亲和性的设置和获取主要通过下面两个函数来实现:
1
2
3
4
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_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断:
1
2
3
4
5
6
7
8
//初始化,设为空
voidCPU_ZERO(cpu_set_t *set);
//将某个cpu加入cpu集中
voidCPU_SET(intcpu,cpu_set_t *set);
//将某个cpu从cpu集中移出
voidCPU_CLR(intcpu,cpu_set_t *set);
//判断某个cpu是否已在cpu集中设置了
intCPU_ISSET(intcpu,constcpu_set_t *set);
cpu集可以认为是一个掩码,每个设置的位都对应一个可以合法调度的 cpu,而未设置的位则对应一个不可调度的 CPU。换而言之,线程都被绑定了,只能在那些对应位被设置了的处理器上运行。通常,掩码中的所有位都被置位了,也就是可以在所有的cpu中调度.
以下为测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <pthread.h>
#include <sched.h>
void *myfun(void *arg)
{
cpu_set_t mask;
cpu_set_t get;
char buf[256];
int i;
int j;
int num = sysconf(_SC_NPROCESSORS_CONF);
printf("system has %d processor(s)\n", num);
for (i = 0; i < num; i++) {
CPU_ZERO(&mask);
CPU_SET(i, &mask);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
fprintf(stderr, "set thread affinity failed\n");
}
CPU_ZERO(&get);
if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
fprintf(stderr, "get thread affinity failed\n");
}
for (j = 0; j < num; j++) {
if (CPU_ISSET(j, &get)) {
printf("thread %d is running in processor %d\n", (int)pthread_self(), j);
}
}
j = 0;
while (j++ < 100000000) {
memset(buf, 0, sizeof(buf));
}
}
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t tid;
if (pthread_create(&tid, NULL, (void *)myfun, NULL) != 0) {
fprintf(stderr, "thread create failed\n");
return -1;
}
pthread_join(tid, NULL);
return 0;
}
这段代码将使myfun线程在所有cpu中依次执行一段时间,在我的四核cpu上,执行结果为 :
1
2
3
4
5
systemhas4processor(s)
thread1095604544isrunninginprocessor0
thread1095604544isrunninginprocessor1
thread1095604544isrunninginprocessor2
thread1095604544isrunninginprocessor3
在一些嵌入式设备中,运行的进程线程比较单一,如果指定进程线程运行于特定的cpu核,减少进程、线程的核间切换,有可能可以获得更高的性能。
0 0
- Linux下CPU绑定线程、进程
- Linux 下绑定进程到 CPU
- Linux下进程绑定多CPU运行
- linux下进程绑定cpu情况查看
- linux下浅谈线程绑定cpu
- linux下浅谈线程绑定cpu
- 进程线程与cpu绑定
- 【进程线程绑定CPU】总结
- X86下进程克隆及与CPU线程绑定介绍
- windows下绑定线程(进程)到指定CPU
- SMP系统linux下的进程绑定指定cpu
- Linux技巧:多核下绑定硬件/进程到不同CPU
- Linux技巧:多核下绑定硬件进程到不同CPU
- linux下服务器端线程cpu绑定小例子
- linux 下进程和线程指定CPU运行
- windows下绑定线程(进程)到指定的CPU核心
- windows下绑定线程(进程)到指定的CPU核心
- windows下绑定线程(进程)到指定的CPU核心
- ZIGBEE协议栈从底层添加一个自己的按键
- 面对对象继承之原型链继承
- USB协议架构及驱动架构
- ext4 学习笔记(六)[Ext.js方法 ](白鹤翔第一季)
- seaJs学习笔记之怎么调用模块
- Linux下CPU绑定线程、进程
- C语言一维数组的定义
- linux less从后向前查看日志信息
- 抽象、多态
- 数据库之关系运算详解
- CMake实践笔记
- 接 口
- POJ 1166 The Clocks(拨钟问题)
- java io操作
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
人生是什么意思
关于人生感悟的句子
感悟人生的话
思考人生图片
心情句子人生感悟
人生感悟图片
人生感悟故事
人生格言大全
励志人生感悟
人生经历感悟
人生感悟散文
对人生的感悟
人生格言图片
人生感悟图片带字
人生境界名言
积极向上的人生格言
关于人生感悟的作文
感悟人生作文
人生感悟短句
看破人生的禅语
人生感悟短文
人生感悟经典名言
有关人生哲理的格言
关于人生的感悟
人生感悟的书
感悟人生哲理句子
人生是什么说一段话
禅语感悟人生的句子
人生名言警句及感悟
人生电视连续剧
经典人生感悟
人生感悟诗句
经典句子人生感悟
人生的意义是什么
感悟人生的经典句子
人生格言座右铭
人生故事及感悟
精辟的人生格言
方与圆的人生智慧
人生因拼搏而精彩
人生必交的8种朋友