基本概念

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上相关推荐

  1. linux内核分成如下五个子系统,linux内核主要由5个子系统 Linux内核由哪几个子系统组成?...

    1, Linux内核由哪几个子系统组成? Linux内核主要由五个子系统组成:进程调度,内存管理,虚拟文件系统,网络接口,进程间通信.1.进程调度(SCHED):控制进程对CPU的访问.当需要选择下一 ...

  2. 【Linux 内核】Linux 操作系统结构 ( Linux 内核在操作系统中的层级 | Linux 内核子系统及关系 | 进程调度 | 内存管理 | 虚拟文件系统 | 网络管理 | 进程间通信 )

    文章目录 一.Linux 内核在操作系统中的层级 二.Linux 内核子系统 三.Linux 内核子系统之间的关系 一.Linux 内核在操作系统中的层级 Linux 内核 所在层级 : 整个计算机系 ...

  3. Linux内核分析(三)----初识linux内存管理子系统

    原文:Linux内核分析(三)----初识linux内存管理子系统 Linux内核分析(三) 昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linu ...

  4. Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理

    为什么80%的码农都做不了架构师?>>>    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 本书使用高分辨率精心绘制的300多张图片,帮助大家理解操作系统特有 ...

  5. linux内核锁死怎么解决_解决Linux内核中的2038年问题

    linux内核锁死怎么解决 由于时间在Linux中的表示方式,带符号的32位数字无法支持20:38(UTC)3:14:07之后的时间. 2038年 (Y2038或Y2K38)问题是关于时间数据类型表示 ...

  6. iso linux 内核版本号_Linux发行版和Linux内核的区别

    Linux内核版本与linux发行版本的区别 LINUX内核版本 是指系统内核的版本号.LINUX的内核具有两种不同的版本号,实验版本和产品化版本.要确定 LINUX版本 的类型,只要查看一下版本号: ...

  7. Linux内核学习之路_1_编译Linux内核

    1.准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 1.2.2 Linux内核配置 1.1 学习环境 本系列教程使用的环境如下: 操作系统 ...

  8. linux内核下网络驱动流程,基于Linux内核驱动的网络带宽测速方法与流程

    本发明涉及一种测速方法,尤其是一种网络带宽测速方法. 背景技术: :电信运营商为客户提供一定带宽的Internet接入:为了检验带宽是否达标,一般均由客户使用个人电脑在网页上直接测速.但是随着智能网关 ...

  9. 图解linux内核设计艺术,Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理...

    Linux内核设计的艺术:图解Linux操作系统架构设计与实现原理 作者:新设计团队 出版日期:2011年05月 文件大小:29.01M 支持设备: ¥6.00在线试读 适用客户端: 言商书局 iPa ...

最新文章

  1. nginx 的proxy_cache才是王道
  2. 谈谈对 Canal( 增量数据订阅与消费 )的理解--大数据平台技术栈系列(3)
  3. java实用教程——组件及事件处理——处理事件
  4. C语言 第五章 选择结构 答案,c语言第五章 选择结构程序设计(习题册答案).doc
  5. 程序员只能吃青春饭?老程序员爆料花样出路
  6. Netty 服务 如何 接收新的连接
  7. MYSQL8.0 排序查询报错 this is incompatible with sql_mode=only_full_group_by
  8. vSphere Client 连接ESXi 或者是vCenter 时虚拟机提示VMRC异常的解决办法
  9. 白盒测试方法和黑盒测试方法
  10. PN5321(PN5321A3HN/C106)国产替代,FSVP532软硬件兼容,支持A卡,B卡,FeliCa卡,支持ISO/IEC18092,ECM340点对点
  11. MATLAB— RGB图像 ==Bayer图像 (bggr, gbrg, grbg, rggb)
  12. Android MTP 转载http://www.cnblogs.com/skywang12345/p/3474206.html
  13. property follows cocoa naming convention for returning ‘owned‘ objects
  14. 鸡易发呼吸道疾病的原因 鸡打喷嚏甩鼻用什么药
  15. 加油站踩踏式逃亡?电网成大赢家?时代抛弃你的时候,真的一声不吭
  16. JavaWebJavaEE重要基础知识
  17. python 文件缓存
  18. #数据结构与算法 第一小题 学生成绩档案管理系统
  19. 字符串分段组合python123_boost python分段fau
  20. python爬取糗事百科超搞笑图片

热门文章

  1. Windows系统带你一步一步无脑使用babel
  2. Java参数传递笔记
  3. 为什么苹果不再需要谷歌地图?
  4. Rocksdb的优劣及应用场景分析
  5. STL中的multimap---顺便说说如何查找同一关键字对应的所有值
  6. Vscode 用Filter Line看日志,很爽
  7. 我做技术的这十年,我不做技术的这一年~
  8. 每日一题(15)—— static有什么用途
  9. WritePrivateProfileString等读写.ini配置文件
  10. python自由落体_VPython - example - 模拟自由落体运动