Beachten Sie, dass ich die CPU-Affinität für Threads festlegen musste, um ein bestimmtes Experiment durchzuführen.
Der Prozessthread wird je nach Betriebssystem auf einem der CPU-Kerne ausgeführt. Durch Einstellen der CPU-Affinität ist es möglich, den auszuführenden CPU-Kern willkürlich zu begrenzen und anzugeben.
Linux verfügt über eine Funktion sched_setaffinity zum Festlegen der CPU-Affinität.
#define _GNU_SOURCE
#include <sched.h>
int main() {
pid_t pid;
cpu_set_t cpu_set;
int result;
pid = getpid;
CPU_ZERO(&cpu_set);
CPU_SET(2, &cpu_set);
result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
if (result != 0) {
//Error
}
//wird bearbeitet
return 0;
}
Die Struktur cpu_set_t repräsentiert eine Reihe von CPUs. Initialisieren Sie die Struktur cpu_set_t mit der Funktion CPU_ZERO und geben Sie dann den CPU-Kern an, der mit der Funktion CPU_SET ausgeführt werden soll. Geben Sie für eine 4-Kern-CPU als erstes Argument einen Wert zwischen 0 und 3 an. Weitere Informationen finden Sie unter Handbuch.
sched_setaffinity Das Argument der Funktion ist die Prozess-ID, die Datengröße von cpu_set_t und der Zeiger von cpu_set_t in der angegebenen Reihenfolge.
Das erste Argument kann die Funktion getpid sein. Das zweite Argument ist im Grunde sizeof (cpu_set_t). Das dritte Argument gibt den Zeiger der von CPU_SET angegebenen Strukturvariablen cpu_set_t an.
Mit der obigen Methode wird es im Prozess selbst festgelegt. Wenn Sie also die Affinität für jeden Thread festlegen möchten, ist dies etwas anders.
Abhängig von der Umgebung ist dies mit [pthread_setaffinity_np] möglich (http://linuxjm.osdn.jp/html/LDP_man-pages/man3/pthread_setaffinity_np.3.html). Das Programmbeispiel wird weggelassen, da es in Manual beschrieben ist.
Wenn die obige Funktion nicht verwendet werden kann, kann sie festgelegt werden, indem die Thread-ID an das erste Argument der Funktion sched_setaffinity übergeben wird. Wenn Sie die Funktion gettid verwenden können, können Sie einfach die von der Funktion gettid erhaltene Strukturvariable pid_t auslösen.
Wenn die Funktion gettid nicht verwendet werden kann, rufen Sie den Systemaufruf direkt auf, um die Thread-ID abzurufen.
#include <sched.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>
pid_t gettid(void) {
return syscall(SYS_gettid);
}
void* thread_main(void* args) {
pid_t pid;
cpu_set_t cpu_set;
int result;
pid = gettid;
CPU_ZERO(&cpu_set);
CPU_SET(2, &cpu_set);
result = sched_setaffinity(pid, sizeof(cpu_set_t), &cpu_set);
if (result != 0) {
//Error
}
//wird bearbeitet
return NULL;
}
int main() {
pthread_t p;
pthread_create(&p, NULL, thread_main, NULL);
//wird bearbeitet
return 0;
}
Bitte weisen Sie auf Fehler hin.
Recommended Posts