Réponses:
La principale distinction entre un commutateur de thread et un commutateur de processus est que pendant un changement de thread, l'espace de mémoire virtuelle reste le même, alors qu'il ne le fait pas pendant un changement de processus. Les deux types impliquent de transférer le contrôle au noyau du système d'exploitation pour effectuer le changement de contexte. Le processus de commutation d'entrée et de sortie du noyau du système d'exploitation ainsi que le coût de la commutation des registres constituent le coût fixe le plus élevé de la réalisation d'un changement de contexte.
Un coût plus flou est qu'un changement de contexte perturbe les mécanismes de mise en cache des processeurs. Fondamentalement, lorsque vous changez de contexte, toutes les adresses mémoire dont le processeur "se souvient" dans son cache deviennent effectivement inutiles. La seule grande différence ici est que lorsque vous changez d'espaces de mémoire virtuelle, le tampon de recherche de traduction (TLB) ou équivalent du processeur est vidé, ce qui rend les accès à la mémoire beaucoup plus coûteux pendant un certain temps. Cela ne se produit pas lors d'un changement de thread.
La commutation de contexte de processus implique la commutation de l'espace d'adressage mémoire. Cela inclut les adresses mémoire, les mappages, les tables de pages et les ressources du noyau - une opération relativement coûteuse. Sur certaines architectures, cela signifie même vider divers caches de processeur qui ne peuvent pas être partagés entre les espaces d'adressage. Par exemple, x86 doit vider le TLB et certains processeurs ARM doivent vider l'intégralité du cache L1!
Le changement de thread est le changement de contexte d'un thread à un autre dans le même processus (le passage d'un thread à l'autre d'un processus à l'autre n'est qu'un changement de processus).
Tout d'abord, le système d'exploitation amène le thread sortant en mode noyau s'il n'y est pas déjà, car le changement de thread ne peut être effectué qu'entre les threads, qui s'exécute en mode noyau. Ensuite, le planificateur est appelé pour prendre une décision sur le thread vers lequel sera effectuée la commutation. Une fois la décision prise, le noyau enregistre une partie du contexte de thread qui se trouve dans le CPU (registres du CPU) dans la place dédiée en mémoire (souvent au sommet de la pile du noyau du thread sortant). Ensuite, le noyau effectue le basculement de la pile du noyau du thread sortant vers la pile du noyau du thread entrant. Après cela, le noyau charge le contexte précédemment stocké du thread entrant de la mémoire dans les registres du processeur. Et renvoie enfin le contrôle en mode utilisateur, mais en mode utilisateur du nouveau thread. Dans le cas où le système d'exploitation a déterminé que le thread entrant s'exécute dansun autre processus, le noyau effectue une étape supplémentaire: définit un nouvel espace d'adressage virtuel actif.
Le principal coût dans les deux scénarios est lié à une pollution de la cache. Dans la plupart des cas, le jeu de travail utilisé par le thread sortant diffère considérablement du jeu de travail utilisé par le thread entrant. En conséquence, le thread entrant commencera sa vie avec une avalanche de défauts de cache, vidant ainsi les données anciennes et inutiles des caches et chargeant les nouvelles données de la mémoire. La même chose est vraie pour TLB (Translation Look Aside Buffer, qui est sur le CPU). Dans le cas de la réinitialisation de l'espace d'adressage virtuel (les threads s'exécutent dans différents processus), la pénalité est encore pire, car la réinitialisation de l'espace d'adressage virtuel conduit au vidage de l'ensemble du TLB, mêmesi le nouveau thread n'a besoin de charger que quelques nouvelles entrées. En conséquence, le nouveau thread commencera son quantum temporel avec de nombreux ratés TLB et des pages fréquentes. Le coût direct du commutateur de threads n'est pas non plus négligeable (de ~ 250 et jusqu'à ~ 1500-2000 cycles) et dépend de la complexité du processeur, des états des deux threads et des ensembles de registres qu'ils utilisent réellement.
PS: Bon article sur les frais généraux de changement de contexte: http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
Dans le changement de contexte de thread, l'espace de mémoire virtuelle reste le même alors qu'il ne l'est pas dans le cas du changement de contexte de processus. En outre, Process Context Switch est plus coûteux que Thread Context Switch.
Je pense que la principale différence réside dans l'appel switch_mm()
qui gère les descripteurs de mémoire de l'ancienne et de la nouvelle tâche. Dans le cas des threads, l'espace d'adressage de la mémoire virtuelle est inchangé (les threads partagent la mémoire virtuelle), donc très peu doit être fait, et donc moins coûteux.
Bien que le changement de contexte de thread ait besoin de changer le contexte d'exécution (registres, pointeurs de pile, compteurs de programme), ils n'ont pas besoin de changer l'espace d'adressage comme le font les commutateurs de contexte de processus. Il y a un coût supplémentaire lorsque vous changez d'espace d'adressage, plus d'accès à la mémoire (pagination, segmentation, etc.) et vous devez vider TLB lors de l'entrée ou de la sortie d'un nouveau processus ...
En bref, le commutateur de contexte de thread n'attribue pas un tout nouvel ensemble de mémoire et de pid, il utilise le même que le parent car il s'exécute dans le même processus. Un processus engendre un nouveau processus et attribue ainsi de nouveaux mem et pid.
Il y a beaucoup plus à faire. Ils ont écrit des livres là-dessus.
En ce qui concerne le coût, un changement de contexte de processus >>>> thread car vous devez réinitialiser tous les compteurs de pile, etc.
En supposant que le processeur que le système d'exploitation exécute a des périphériques à latence élevée connectés,
Il est logique d'exécuter un autre thread de l'espace d'adressage du processus, pendant que le périphérique à latence élevée répond.
Mais, si le périphérique à latence élevée répond plus rapidement que le temps nécessaire pour configurer la table + la traduction des mémoires virtuelles en physiques pour un NOUVEAU processus, alors il est douteux qu'un commutateur soit essentiel.
En outre, le cache HOT (les données nécessaires à l'exécution du processus / thread sont accessibles en moins de temps) est un meilleur choix.