Dans un processeur multicœur, le cœur de processeur sur lequel le thread de processus est exécuté dépend du planificateur du système d'exploitation, et le contexte peut se déplacer vers un autre cœur de processeur en fonction de la situation. Sous Linux, vous pouvez définir l'affinité du processeur pour empêcher de tels mouvements et autoriser l'exécution des threads de processus uniquement sur des cœurs de processeur spécifiques (principalement en raison de problèmes de performances).
Collection de processeurs logiques que le thread est autorisé à exécuter. L'affinité du processeur est représentée par un masque de bits.
Par exemple, CPU0 est "0x00000001", CPU1 est "0x00000002" et l'ensemble de CPU0,1,3 est "0x0000000b".
Vous pouvez vérifier le cœur de CPU CPU0 en utilisant cat / proc / cpuinfo
.
Vous pouvez définir l'affinité CPU d'un processus avec l'ensemble de tâches de commande.
# taskset -p mask pid
Pour masque, spécifiez l'affinité du processeur et pour pid, spécifiez le processus que vous souhaitez modifier.
Utilisez l'option -a
pour changer pour tous les threads du processus pid.
# taskset -a -p mask pid
Seul ce processus est autorisé à s'exécuter sur ce processeur et tous les autres processus en sont privés.
# ps -e -o pid= | xargs -n 1 taskset -p 0xFFFFFFFE
# taskset -p 0x00000001 PID
Pour définir l'affinité du processeur par programmation, utilisez la fonction sched_setaffinity ().
#define _GNU_SOURCE /* feature_test_Voir les macros*/
#include <sched.h>
void
func(void)
{
cpu_set_t mask;
int ret;
//Désactiver tous les masques
CPU_ZERO(&mask);
// CPU_AFFINITY_Autoriser l'exécution sur le noyau de MASK
CPU_SET(CPU_AFFINITY_MASK, &mask);
//Définir l'affinité du processeur
ret = sched_setaffinity(0, sizeof(mask), &mask);
if (ret != 0) {
// error
}
}
Recommended Posts