La planification des processus/threads aux cœurs est purement up to the OS. Le matériel n'a aucune compréhension des tâches en attente d'exécution. Le maintien de la liste des processus exécutables par le système d'exploitation par rapport à l'attente des E/S est entièrement une opération logicielle.
La migration d'un thread d'un core vers un autre se fait par le noyau sur le core original stockant le architectural state en mémoire, puis le code du système d'exploitation sur le nouveau core restaure l'état sauvegardé et reprend l'exécution de l'espace utilisateur.
Traditionnellement, les décisions d'échelle de fréquence et de tension sont prises par le système d'exploitation. Prenez Linux à titre d'exemple: Le code de prise de décision est appelé governor (et aussi arch wiki link came up high on google). Il regarde les choses comme la fréquence à laquelle les processus ont utilisé time slice sur le noyau actuel. Si le gouverneur décide que le processeur doit fonctionner à une vitesse différente, il programme certains registres de contrôle pour mettre en œuvre le changement. Si je comprends bien, le matériel prend soin de choisir le right voltage to support the requested frequency. Si je comprends bien, le système d'exploitation fonctionnant sur chaque cœur prend des décisions indépendamment. Sur le matériel qui permet à chaque cœur de fonctionner à des fréquences différentes, le code décisionnel n'a pas besoin de se coordonner les uns avec les autres. Si l'exécution d'une fréquence élevée sur un cœur nécessite une puce haute tension, le matériel s'en charge. Je pense que l'implémentation moderne de DVFS (tension dynamique et mise à l'échelle de fréquence) est assez haut niveau, le système d'exploitation indiquant simplement le choix de N et le microcontrôleur de bord prenant en charge les détails des oscillateurs de programmation/diviseurs d'horloge et les régulateurs de tension.
La fonction «Turbo» d'Intel, qui augmente de manière opportuniste la fréquence au-dessus de la fréquence maximale durable, prend la décision dans le matériel. Chaque fois que le système d'exploitation demande la fréquence annoncée la plus élevée, la CPU utilise le turbo lorsque l'alimentation et le refroidissement le permettent.
Le Skylake d'Intel va encore plus loin: le système d'exploitation peut confier le contrôle total de DVFS au matériel, éventuellement avec des contraintes. Cela lui permet de réagir de microseconde à microseconde, plutôt que sur une échelle de temps de quelques millisecondes. Cela permet réellement de meilleures performances dans les charges de travail en rafale, car plus de budget de puissance est disponible pour turbo quand c'est utile. Quelques benchmarks sont assez éclatants pour observer ceci, comme certains IIRC de browser/javascript.
Il y avait une discussion entière sur la nouvelle gestion de l'alimentation de Skylake à IDF2015, check out the slides and/or archived webcast. L'ancienne méthode est décrite avec beaucoup de détails là aussi, pour illustrer la différence, donc vous devriez vraiment vérifier si vous voulez plus de détails que mon résumé. (La liste des autres entretiens IDF est here, merci à Agner Fog's blog pour le lien)
@xmojmr J'ai essayé plusieurs fichiers PDF à partir du lien que vous avez fourni. Ils ont tous ce que la figure 3-9, mais pas celui que vous avez décrit. Pouvez-vous me dire de qui vous parlez? – v010dya
ouvert http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-manual-325462.pdf (_Combined Volumes: 1 , 2A, 2B, 2C, 3A, 3B et 3C_), ctrl + F "_Algorithme pour l'extraction de la fréquence du processeur" – xmojmr
@xmojmr Tous les modèles présentés ici (voir le tableau ci-dessous) traitent des processeurs monocœur . Donc cela n'aide pas vraiment. – v010dya