Question

Ce qui est exactement sauvegardé et restauré dans un changement de contexte entre deux fils

  • dans le même processus
  • entre deux processus
Était-ce utile?

La solution

Ceci est plutôt une question complexe puisque la réponse (s) dépendent beaucoup de choses:

  1. La CPU en question
    • Il peut varier considérablement même au sein de la même famille, par exemple les registres supplémentaires ajoutés pour les opérations SSE / MMX.
  2. Le système d'exploitation, car il contrôle les gestionnaires qui déclenchent un changement de contexte et de décider si le matériel de l'unité centrale de traitement (le cas échéant) pour aider à un changement de contexte est utilisé ou non.
    • Par exemple Windows ne pas utiliser le matériel Intel qui peut faire une grande partie du stockage de changement de contexte pour vous car il ne stocke pas les registres à virgule flottante.
  3. Toutes les optimisations rendues possibles par un programme conscient de ses propres besoins et capable d'informer le système d'exploitation de cette
    • Peut-être pour indiquer qu'il n'utilise pas FP registres ne dérange pas si avec eux
    • Dans les architectures avec des fichiers de registre importants comme la plupart RISC dessins il y a des avantages considérables à savoir que vous avez seulement besoin d'un petit sous-ensemble de ces registres

Au minimum l'utilisation dans des registres à usage général et registre de compteur de programme devront être sauvés (en supposant la conception commune de la plupart de style CISC / RISC courant processeurs à usage général).

Notez que la tentative de faire seulement la quantité minimum d'effort par rapport à un changement de contexte est un sujet de certains d'intérêt académique

Linux a évidemment plus d'informations disponibles à ce sujet dans le domaine public que mes références peuvent être un peu obsolète.

Il y a un « task_struct » qui contient un grand nombre de domaines relatifs à l'état des tâches ainsi que le processus que la tâche est pour.

L'un d'eux est le « thread_struct »

  

/ * état spécifique à la CPU de cette tâche * /
   - fil thread_struct struct;
       contient des informations sur les descripteurs cache TLS, les registres de débogage,
       faute d'information, virgule flottante, mode virtuel 86 ou autorisations IO.

Chaque architecture définit son propre thread_struct qui identifie les registres et autres valeurs enregistrées sur un commutateur.

Ceci est en outre compliquée par la présence de renommer les registres qui permettent à de multiples instructions de vol (soit via superscalaire ou pipeline des conceptions architecturales liés). La phase de restauration d'un contexte swicth reposera probablement sur le pipeline de la CPU en cours de restauration dans un état initialement vide tels les instructions qui n'a pas encore été retraités dans le pipeline ont aucun effet et ne peuvent donc être ignorés. Cela rend la conception de l'unité centrale de traitement beaucoup plus difficile.

La différence entre un processus et un thread est que le commutateur de processus (ce qui signifie toujours un interrupteur de fil dans tous les principaux systèmes d'exploitation de flux) devra mettre à jour l'information de traduction de la mémoire, IO informations et autorisations liées à des structures connexes.

Ces seront principalement des pointeurs vers les structures de données plus riches ne seront donc pas un coût significatif par rapport au changement de contexte de fil.

Autres conseils

Lorsque la commutation de contexte est entre les fils d'un même processus, tous les registres d'usage général non volatils du courant du fil sont enregistrées et celles du nouveau fil sont restaurés; registres volatiles doivent être enregistrées que si l'exécution du thread courant a été interrompu par une interruption. Registres de tout co-processeur utilisé par les fils (processeur à virgule flottante, par exemple), doivent également être sauvegardés et restaurés Si la commutation entre fils de 2 processus, en plus de ce qui est nécessaire pour un changement de contexte normale, les changements liés à la mémoire et de gestion d'entrées-sorties doivent également faire; par exemple pour la protection de la mémoire nécessaire par des processus est réalisé à l'aide des tables de pages et tableaux de répertoire de page et chaque processus a une adresse de table de répertoire de page unique, qui doit être changé lorsque les changements de processus.

Cela dépend du système d'exploitation que vous utilisez, mais pour que vous devrez enregistrer le contenu de tous les registres (y compris le compteur d'instructions) et charger les registres du fil vous passez à.

La seule différence qui me vient à l'esprit en ce qui concerne l'interrupteur entre deux threads sur le même processus est que vous ne perdez pas le contenu du cache L1 et MMU.

Je ne suis pas sûr, mais si je me souviens bien aussi l'ensemble de la mémoire de travail est activée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top