如何从C使用sched_getaffinity和了sched_setaffinity在Linux呢?

2019-06-24 06:15发布

我在尝试着:

  • 与处理器钉扎运行16份同时(每个芯2个拷贝)

  • 同时运行与处理器钉扎(每个芯2个拷贝)和翻转处理器核心,以一定的功能后说功能1点结束最远芯8份。

我现在面临的问题是如何选择最远的处理器。

有些朋友建议用sched_getaffinity和了sched_setaffinity但我算没有找到任何很好的例子。

Answer 1:

使用了sched_setaffinity使核心7当前进程来看,你这样做:

cpu_set_t my_set;        /* Define your cpu_set bit mask. */
CPU_ZERO(&my_set);       /* Initialize it all to 0, i.e. no CPUs selected. */
CPU_SET(7, &my_set);     /* set the bit that represents core 7. */
sched_setaffinity(0, sizeof(cpu_set_t), &my_set); /* Set affinity of tihs process to */
                                                  /* the defined mask, i.e. only 7. */

见http://linux.die.net/man/2/sched_setaffinity & http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html获取更多信息。



Answer 2:

不要使用CPU_SETSIZE作为cpusetsize参数sched_ [集|获取]亲和力。 该名称具有误导性,但这是错误的。 的万客隆CPU_SETSIZE是(引用人3 cpu_set)“比可存储在cpu_set_t最大CPU数目多一个的值。” 您必须使用

sched_setaffinity(0, sizeof(cpu_set_t), &my_set);

代替。



Answer 3:

最小的可运行例子

在这个例子中,我们得到了亲和力,修改它,并检查是否已生效sched_getcpu()

#define _GNU_SOURCE
#include <assert.h>
#include <sched.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

void print_affinity() {
    cpu_set_t mask;
    long nproc, i;

    if (sched_getaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
        perror("sched_getaffinity");
        assert(false);
    } else {
        nproc = sysconf(_SC_NPROCESSORS_ONLN);
        printf("sched_getaffinity = ");
        for (i = 0; i < nproc; i++) {
            printf("%d ", CPU_ISSET(i, &mask));
        }
        printf("\n");
    }
}

int main(void) {
    cpu_set_t mask;

    print_affinity();
    printf("sched_getcpu = %d\n", sched_getcpu());
    CPU_ZERO(&mask);
    CPU_SET(0, &mask);
    if (sched_setaffinity(0, sizeof(cpu_set_t), &mask) == -1) {
        perror("sched_setaffinity");
        assert(false);
    }
    print_affinity();
    /* TODO is it guaranteed to have taken effect already? Always worked on my tests. */
    printf("sched_getcpu = %d\n", sched_getcpu());
    return EXIT_SUCCESS;
}

编译和运行:

gcc -std=c99 main.c
./a.out

输出示例:

sched_getaffinity = 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
sched_getcpu = 9
sched_getaffinity = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
sched_getcpu = 0

意思就是:

  • 最初,我所有的16个内核被启用,并将过程随机核心9(10号之一)运行
  • 后我们设置亲和力仅向第一核心,所述过程不一定移到核心0(第一个)

这也很有趣,通过运行该程序taskset

taskset -c 1,3 ./a.out

这使形式的输出:

sched_getaffinity = 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 
sched_getcpu = 2
sched_getaffinity = 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
sched_getcpu = 0

所以我们看到,它限制从一开始的亲和力。

这工作,因为亲和力由子进程继承,这taskset是分叉: 如何防止孩子派生进程继承CPU亲和力?

nproc尊重sched_getaffinity默认为在所示: 如何找出CPU的使用python的数量

测试在Ubuntu 16.04, GitHub的上游 。



文章来源: How to use sched_getaffinity and sched_setaffinity in Linux from C?