GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menggunakan sched_getaffinity dan sched_setaffinity di Linux dari C?

Untuk menggunakan sched_setaffinity agar proses saat ini berjalan pada inti 7, Anda melakukan ini:

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. */

Lihat http://linux.die.net/man/2/sched_setaffinity &http://www.gnu.org/software/libc/manual/html_node/CPU-Affinity.html untuk info selengkapnya.


Contoh minimal yang dapat dijalankan

Dalam contoh ini, kita mendapatkan afinitas, memodifikasinya, dan memeriksa apakah sudah berlaku dengan 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 upstream.

Kompilasi dan jalankan:

gcc -ggdb3 -O0 -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out

Keluaran sampel:

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

Artinya:

  • awalnya, semua 16 inti saya diaktifkan, dan proses berjalan secara acak pada inti 9 (yang ke-10)
  • setelah kami menetapkan afinitas hanya ke inti pertama, prosesnya harus dipindahkan ke inti 0 (yang pertama)

Menyenangkan juga menjalankan program ini melalui taskset :

taskset -c 1,3 ./a.out

Yang memberikan output berupa:

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

jadi kami melihat bahwa itu membatasi afinitas sejak awal.

Ini berfungsi karena afinitas diwariskan oleh proses anak, yaitu taskset adalah forking:Bagaimana cara mencegah pewarisan afinitas CPU dengan proses fork anak?

nproc menghormati sched_getaffinity secara default seperti yang ditunjukkan pada:Cara mengetahui jumlah CPU menggunakan python

Python:os.sched_getaffinity dan os.sched_setaffinity

Lihat:Cara mengetahui jumlah CPU menggunakan python

Diuji di Ubuntu 16.04.


Linux
  1. Apa itu Perintah Chown di Linux dan Cara Menggunakannya

  2. Cara Menginstal Dan Menggunakan Flatpak Di Linux

  3. Cara Menginstal dan Menggunakan Traceroute di Linux

  1. Cara menginstal dan menggunakan telnet di Kali Linux

  2. Bagaimana Cara Menginstal dan Menggunakan Layar Linux?

  3. Perintah Tail Linux:Apa Itu dan Bagaimana Cara Menggunakannya

  1. Cara Menginstal dan Menggunakan SSHFS di Linux

  2. Cara Menginstal dan Menggunakan Slack di Linux

  3. File Host Linux:Bagaimana Mengedit dan Menggunakannya?