Je veux comprendre comment se passe un certain scénario de changement de contexte. Supposons que j'ai 10 cœurs de processeur exécutant un seul processus. Tout est gourmand en CPU, aucun thread ne dort (en attente d'E/S).Commutateur de contexte: que se passe-t-il dans le cas le plus défavorable?
(je suis surtout préoccupé par les architectures informatiques modernes personnels traditionnels et les systèmes, généralement x64 avec Windows, Linux ...)
-moi si je me trompe: en cours d'exécution 10 CPU/RAM threads indépendants est plus intensive souvent une situation quasi optimale. Le temps passé en changement de contexte est plutôt négligeable. Alors que le système peut parfois décider de réattribuer des threads à différents cœurs de manière circulaire en provoquant une réinitialisation des caches RAM, cela a un effet mineur et fonctionne presque comme si chaque thread était exécuté sur un seul cœur fixe.
Seul le bus RAM principal peut être une limitation puisque tous les threads le partagent, mais ce n'est pas le point qui m'intéresse ici. Réduire le nombre de threads n'augmentera pas le débit de toute façon. Maintenant, supposons que vous avez toujours 10 cœurs mais que vous exécutez 1000 threads. Le planificateur pourrait théoriquement décider de passer rarement (disons chaque seconde) à 10 threads pendant une seconde, puis à 10 autres ... et le tout serait encore proche des performances optimales (débit).
Mais cela ne semble pas être le cas et il semble que les threads soient commutés de manière intensive, ce qui entraîne une performance fortement sous-optimale (débit). Ai-je raison? Quelle est la cause principale de cette performance sous-optimale? Quelques chiffres seraient bien si vous avez une idée des ordres de grandeur de (par exemple): commutateurs par seconde, perte de performance causée par la commutation ...
Un système d'exploitation tel que Windows permet à un thread de fonctionner pendant 3 ticks d'horloge avant de passer le processeur à un autre. Donc, environ 47 millisecondes. Le coût réel d'un changement de contexte dépend grandement de la façon dont il jette les données dans les caches du processeur. Ces jours-ci, le pire des cas est d'environ 15 000 cycles. Donc, sur un noyau de 3 GHz qui est d'environ 0,01% de frais généraux. Avoir un millier de threads actifs n'est bien sûr jamais bon pour le débit, les cycles de calcul sont une ressource finie. –