Linux 绑定核运行

在Linux系统中,进程的调度切换是由内核自动完成的,在多核CPU上,进程有可能在不同的CPU核上来回切换执行,这对CPU的缓存不是很有利。

在多核CPU结构中,每个核心有各自的L1、L2缓存,而L3缓存是共用的。如果一个进程在核心间来回切换,各个核心的缓存命中率就会受到影响。相反如果进程不管如何调度,都始终可以在一个核心上执行,那么其数据的L1、L2 缓存的命中率可以显著提高。

 

如何设置进程与CPU核心绑定

简单设置

简单的可以使用 taskset -c 0,1 ./a.out 运行程序进行设置。

代码级设置

在 Linux 系统里,可以使用 CPU_* 系列函数和 sched_setaffinity() 可以实现绑定,具体步骤如下:

 

1.使用 **CPU_**系列函数,必须定义 _GNU_SOURCE 宏,告诉编译器启用这些函数:

#define _GNU_SOURCE

 2.首先声明一个 cpu_set_t,然后用 CPU_ZERO()初始化bit数据:

 3.接下来把进程绑定到某几个CPU核心,这要用CPU_SET()来设置cpu_set_t中相应的bit位,比如想让进程只在核心1或核心5上执行:

CPU_SET(1, &mask);
CPU_SET(5, &mask);

 4.最后用sched_setaffinity完成实际的绑定:

  1. cpu_set_t mask;
    CPU_ZERO(&mask);

    cpu_set_t其实是一个bit串,每个bit表示进程是否要与某个CPU核绑定。

  2. sched_setaffinity(0, sizeof(cpu_set_t), &mask);

     

  3. 设置起来并不难。那怎么验证我们的绑定真的起作用了呢?我们来做个实验:

    假定有一台双核机器,这段程序我们起了20个进程,从0开始每个进程分配一个进程号(注意是这里值我们自己起的进程号,不是进程pid),奇数进程号绑定绑定在 Core 0上执行,偶数号的进程绑定在 Core 1上执行。

    我们用for让进程循环,用 sched_getcpu() 函数获得当前进程运行在哪个CPU核心上,每次for循环检查下进程是否真的在分配的核心执行。

    #define _GNU_SOURCE
    #include <sched.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    void run(int c, int n) {
    
        cpu_set_t mask;
        CPU_ZERO(&mask);
        CPU_SET(n, &mask);
        sched_setaffinity(0, sizeof(cpu_set_t), &mask);
    
        int i;
        for (i = 0; i != 10000; i++) {
            printf("%d-%d\n", c, sched_getcpu());
        }
    }
    
    int main()
    {
        int i;
        for (i = 0; i != 20; i++) {
            int pid = fork();
            if (pid == 0) {
                run(i, i % 2);
                exit(0);
            }
        }
    }

     

     

     

     

     

     

     

     

     

     

     

     

     

  4.  

     

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NineDays66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值