栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Linux设置进程CPU亲和力(核心绑定)

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux设置进程CPU亲和力(核心绑定)

文章目录
  • 1. 获取CPU核数
  • 2. 线程绑定CPU核心
    • ① 概念
    • ② 函数
    • ③ 例子


1. 获取CPU核数
int CPU_NUM = sysconf(_SC_NPROCESSORS_CONF);




2. 线程绑定CPU核心 ① 概念

CPU绑定 指的是在多 CPU 的系统中将进程或线程绑定到指定的 CPU 核上去执行。在 Linux 中,我们可以利用 CPU affinity(亲和性) 属性把进程绑定到一个或多个 CPU 核上。

CPU Affinity 是进程的一个属性,这个属性指明了进程调度器能够把这个进程调度到哪些CPU上。
该属性要求进程在某个指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器。

CPU Affinity分为2种:

  • soft affinity
  • hard affinity

soft affinity 只是一个建议,如果不可避免,调度器还是会把进程调度到其它的CPU上去执行;

hard affinity 则是调度器必须遵守的规则, 2.6 以上版本的 Linux 内核可以让开发人员可以编程实现 hard affinity 。



② 函数

进程与CPU的绑定 在Linux中,用结构体cpu_set_t来表示 CPU Affinity 掩码,同时定义了一系列的宏来用于操作进程的可调度CPU集合:

#define _GNU_SOURCE

#include 

void CPU_ZERO(cpu_set_t *set); // 清除集合的内容,让其不包含任何 CPU。
void CPU_SET(int cpu, cpu_set_t *set); // 添加 CPU 到集合中
void CPU_CLR(int cpu, cpu_set_t *set); // 从集合中移除 CPU
int CPU_ISSET(int cpu, cpu_set_t *set); // 测试 CPU 是否在集合中
int CPU_COUNT(cpu_set_t *set); // 返回集合中包含的 CPU 数量

在Linux中,可以使用以下两个函数 设置和获取进程的 CPU Affinity 属性

#define _GNU_SOURCE

#include 


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);


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 上:

int sched_getcpu(void);

如果调用成功,该函数返回一个非负的 CPU 编号值。



③ 例子

以下函数根据不同进程调用时输入的不同数值,将不同进程绑定到不同的核,从而将 CPU 的多核心利用起来

void func(int i) {
    cpu_set_t mask;
    CPU_ZERO(&mask);
    int cpu_num = sysconf(_SC_NPROCESSORS_CONF);
    if (cpu_num == 0) {
    	cpu_num = 1;
    }
    CPU_SET((i % cpu_num), &mask);
    sched_setaffinity(0, sizeof(cpu_set_t), &mask);
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/675890.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号