On peut déjà limiter les cœurs sur lesquels un processus peut être exécuté en définissant l'affinité des processus . Sous Linux, cela peut être accompli en utilisant taskset
pour limiter les cœurs sur lesquels le processus peut être exécuté. Par défaut, Linux utilise un planificateur de tâches préemptif qui est presque identique à ce que vous décrivez dans le document (2)
. Presque tous les principaux systèmes d'exploitation utilisent ce type de planificateur de tâches, ce qui fait qu'un processus est exécuté sur plusieurs cœurs par défaut.
En fait, pour garantie votre processus fonctionne pendant X
temps passé sur le noyau Y
comme vous l'avez laissé entendre dans (1)
nécessiterait l'utilisation d'un système d'exploitation en temps réel ; il existe également un module de noyau en temps réel pour Linux (par ex. RTLinux ).
TL,DR : En réponse à la question Comment puis-je partager efficacement un processus entre les cœurs ? Tous les principaux systèmes d'exploitation le font déjà en raison de l'utilisation du planificateur de tâches. Le rôle d'un système d'exploitation est de contrôler quel processus s'exécute à quel moment et à quel endroit. Bien qu'il soit possible d'"épingler" un processus à un cœur particulier (ou à un ensemble de cœurs) et de l'empêcher de s'exécuter sur d'autres cœurs (par l'intermédiaire de la fonction taskset
), le système d'exploitation continuera à programmer l'exécution d'autres processus sur ce noyau lorsque le processus est préempté.
Si jamais vous avez besoin de garantie l'exécution de votre programme pendant au moins X
temps passé sur le noyau Y
vous devriez envisager d'utiliser un noyau en temps réel, ou "mettre au point" le planificateur de tâches que vous utilisez déjà d'utiliser différentes politiques de préemption (ou même de remplacer l'ensemble du planificateur de tâches par un autre !) Notez que seul un système d'exploitation en temps réel garantie exécution.