GNU/Linux >> Linux の 問題 >  >> Linux

C から Linux で sched_getaffinity と sched_setaffinity を使用するには?

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 を参照してください。


最小限の実行可能な例

この例では、アフィニティを取得して変更し、sched_getcpu() で有効になっているかどうかを確認します。 .

main.c

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

GitHub アップストリーム。

コンパイルして実行:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.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 子プロセスによってアフィニティが継承されるためです。 は forking です:子 fork プロセスによる CPU アフィニティの継承を防ぐにはどうすればよいですか?

nproc sched_getaffinity を尊重します デフォルトでは次のようになっています:Python を使用して CPU の数を確認する方法

Python:os.sched_getaffinity および os.sched_setaffinity

参照:Python を使用して CPU の数を調べる方法

Ubuntu 16.04 でテスト済み。


Linux
  1. LinuxでのChownコマンドとは何ですか?その使用方法

  2. LinuxでFlatpakをインストールして使用する方法

  3. LinuxでTracerouteをインストールして使用する方法

  1. KaliLinuxにtelnetをインストールして使用する方法

  2. Linux Screenをインストールして使用する方法は?

  3. Linuxテールコマンド:それは何であり、それを使用する方法

  1. LinuxにSSHFSをインストールして使用する方法

  2. LinuxでSlackをインストールして使用する方法

  3. Linuxホストファイル:編集して使用する方法は?