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.