linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上
基本概念
cpu亲和性(affinity)
CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性;再简单的点的描述就将指定的进程或线程绑定到相应的cpu上;在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。
软亲和性(affinity)
就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,Linux 内核进程调度器天生就具有被称为 软 CPU 亲和性(affinity) 的特性,这意味着进程通常不会在处理器之间频繁迁移。这种状态正是我们希望的,因为进程迁移的频率小就意味着产生的负载小。
硬亲和性(affinity)
简单来说就是利用linux内核提供给用户的API,强行将进程或者线程绑定到某一个指定的cpu核运行。
相关函数
void CPU_ZERO (cpu_set_t *set) /*这个宏对 CPU 集 set 进行初始化,将其设置为空集。*/
void CPU_SET (int cpu, cpu_set_t *set) /*这个宏将 指定的 cpu 加入 CPU 集 set 中*/
void CPU_CLR (int cpu, cpu_set_t *set) /*这个宏将 指定的 cpu 从 CPU 集 set 中删除。*/
int CPU_ISSET (int cpu, const cpu_set_t *set) /*如果 cpu 是 CPU 集 set 的一员,这个宏就返回一个非零值(true),否则就返回零(false)。*/
进程与cpu的绑定
#include
int sched_setaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
int sched_getaffinity(pid_t pid, size_t cpusetsize, const cpu_set_t *mask);
代码示例:
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
/* sysconf( _SC_NPROCESSORS_CONF ) 查看cpu的个数;打印用%ld长整。
* sysconf( _SC_NPROCESSORS_ONLN ) 查看在使用的cpu个数;打印用%ld长整 */
int main(int argc, char **argv)
{
int cpus = 0;
int i = 0;
cpu_set_t mask;
cpu_set_t get;
cpus = sysconf(_SC_NPROCESSORS_CONF);
printf("cpus: %d\n", cpus);
CPU_ZERO(&mask); /* 初始化set集,将set置为空*/
CPU_SET(0, &mask); /* 依次将0、1、2、3号cpu加入到集合,前提是你的机器是多核处理器*/
CPU_SET(1, &mask);
CPU_SET(2, &mask);
CPU_SET(3, &mask);
/*设置cpu 亲和性(affinity)*/
if (sched_setaffinity(0, sizeof(mask), &mask) == -1) {
printf("Set CPU affinity failue, ERROR:%s\n", strerror(errno));
return -1;
}
usleep(1000); /* 让当前的设置有足够时间生效*/
/*查看当前进程的cpu 亲和性*/
CPU_ZERO(&get);
if (sched_getaffinity(0, sizeof(get), &get) == -1) {
printf("get CPU affinity failue, ERROR:%s\n", strerror(errno));
return -1;
}
/*查看运行在当前进程的cpu*/
for(i = 0; i < cpus; i++) {
if (CPU_ISSET(i, &get)) { /*查看cpu i 是否在get 集合当中*/
printf("this process %d of running processor: %d\n", getpid(), i);
}
}
sleep(10); //让程序停在这儿,方便top命令查看
return 0;
}
结果:
线程与cpu的绑定
#include
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, const cpu_set_t *cpuset);
代码示例:
#define _GNU_SOURCE
#include
#include
#include
#include
#include
#include
void *testfunc(void *arg)
{
int i, cpus = 0;
cpu_set_t mask;
cpu_set_t get;
cpus = sysconf(_SC_NPROCESSORS_CONF);
printf("this system has %d processor(s)\n", cpus);
CPU_ZERO(&mask);
for (i = 0; i < 4; i++) { /*将0、1、2、3添加到集合中*/
CPU_SET(i, &mask);
}
/* 设置cpu 亲和性(affinity)*/
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
fprintf(stderr, "set thread affinity failed\n");
}
/* 查看cpu 亲和性(affinity)*/
CPU_ZERO(&get);
if (pthread_getaffinity_np(pthread_self(), sizeof(get), &get) < 0) {
fprintf(stderr, "get thread affinity failed\n");
}
/* 查看当前线程所运行的所有cpu*/
for (i = 0; i < cpus; i++) {
if (CPU_ISSET(i, &get)) {
printf("this thread %d is running in processor %d\n", (int)pthread_self(), i);
}
}
sleep(3); //查看
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t tid;
if (pthread_create(&tid, NULL, (void *)testfunc, NULL) != 0) {
fprintf(stderr, "thread create failed\n");
return -1;
}
pthread_join(tid, NULL);
return 0;
}
结果:
指定在哪个CPU上运行:
void *threadfunc(void *arg)
{
cpu_set_t mask;
cpu_set_t mask;
int cpuid = 1;
CPU_ZERO(&mask);
CPU_SET(cpuid, &mask);
/* 设置cpu 亲和性(affinity)*/
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0) {
fprintf(stderr, "set thread affinity failed\n");
}
}
标签:set,int,pthread,mask,cpu,线程,linux,CPU
来源: https://www.cnblogs.com/chay/p/10587452.html
linux内核线程绑定到单个核,linux 将进程或者线程绑定到指定的cpu上相关推荐
- linux内核分成如下五个子系统,linux内核主要由5个子系统 Linux内核由哪几个子系统组成?...
1, Linux内核由哪几个子系统组成? Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信.1.进程调度(SCHED):控制进程对CPU的访问.当需要选择下一 ...
- 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )
文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...
- Linux内核分析(三)----初识linux内存管理子系统
原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...
- Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理
为什么80%的码农都做不了架构师?>>> Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 本书使用高分辨率精心绘制的300多张图片,帮助大家理解操作系统特有 ...
- linux内核锁死怎么解决_解决Linux内核中的2038年问题
linux内核锁死怎么解决 由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间. 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示 ...
- iso linux 内核版本号_Linux发行版和Linux内核的区别
Linux内核版本与linux发行版本的区别 LINUX内核版本 是指系统内核的版本号.LINUX的内核具有两种不同的版本号,实验版本和产品化版本.要确定 LINUX版本 的类型,只要查看一下版本号: ...
- Linux内核学习之路_1_编译Linux内核
1.准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 1.2.2 Linux内核配置 1.1 学习环境 本系列教程使用的环境如下: 操作系统 ...
- linux内核下网络驱动流程,基于Linux内核驱动的网络带宽测速方法与流程
本发明涉及一种测速方法,尤其是一种网络带宽测速方法. 背景技术: :电信运营商为客户提供一定带宽的Internet接入:为了检验带宽是否达标,一般均由客户使用个人电脑在网页上直接测速.但是随着智能网关 ...
- 图解linux内核设计艺术,Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理...
Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 作者:新设计团队 出版日期:2011年05月 文件大小:29.01M 支持设备: ¥6.00在线试读 适用客户端: 言商书局 iPa ...
最新文章
- nginx 的proxy_cache才是王道
- 谈谈对 Canal( 增量数据订阅与消费 )的理解--大数据平台技术栈系列(3)
- java实用教程——组件及事件处理——处理事件
- C语言 第五章 选择结构 答案,c语言第五章 选择结构程序设计(习题册答案).doc
- 程序员只能吃青春饭?老程序员爆料花样出路
- Netty 服务 如何 接收新的连接
- MYSQL8.0 排序查询报错 this is incompatible with sql_mode=only_full_group_by
- vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法
- 白盒测试方法和黑盒测试方法
- PN5321(PN5321A3HN/C106)国产替代,FSVP532软硬件兼容,支持A卡,B卡,FeliCa卡,支持ISO/IEC18092,ECM340点对点
- MATLAB— RGB图像 ==Bayer图像 (bggr, gbrg, grbg, rggb)
- Android MTP 转载http://www.cnblogs.com/skywang12345/p/3474206.html
- property follows cocoa naming convention for returning ‘owned‘ objects
- 鸡易发呼吸道疾病的原因 鸡打喷嚏甩鼻用什么药
- 加油站踩踏式逃亡?电网成大赢家?时代抛弃你的时候,真的一声不吭
- JavaWebJavaEE重要基础知识
- python 文件缓存
- #数据结构与算法 第一小题 学生成绩档案管理系统
- 字符串分段组合python123_boost python分段fau
- python爬取糗事百科超搞笑图片