2010-03-09 7 views
7

Donc, je me suis récemment mis dans un peu d'assemblage et je suis un débutant donc je me demandais si quelqu'un pouvait clarifier quelque chose. Je suppose que chaque processus a son propre ensemble de registres, et chaque thread peut modifier ces registres correctement. Comment alors plusieurs threads utilisent-ils les mêmes registres sans provoquer d'affrontements? Ou est-ce que chaque thread a son propre ensemble de registres?l'enregistrement des registres débutant

Répondre

11

Un commutateur de contexte de thread implique la sauvegarde des registres du contexte d'exécution en cours, et le chargement des registres avec les valeurs sauvegardées à partir du contexte d'exécution. (entre autres). Chaque thread a donc son propre ensemble de registres. Aussi sa propre pile, puisque ESP est l'un des registres. Une façon de penser à ceci est que vous obtenez des threads en sauvegardant l'état actuel du registre, et en chargeant les registres avec un nouvel état. Si cela ne se produit pas, alors ce n'est pas un commutateur de thread. Si vous passez également à un ensemble différent de tables d'adresses virtuelles, ce que vous avez est un commutateur de processus plutôt qu'un commutateur de thread.

vous dites:

je prends chaque processus a son propre ensemble de registres, et chaque thread peut modifier ces registres à droite?

Mais ce n'est pas tout à fait correct. Chaque cœur de CPU a un seul ensemble de registres. Ces registres sont modifiés chaque fois que le système d'exploitation bascule sur un thread différent. Mais il n'y a qu'un seul thread s'exécutant dans un cœur de CPU à la fois. Les processus n'ont pas vraiment leurs propres registres, processus propres threads (ou au moins un thread), et les threads ont des registres, ou plutôt un endroit pour conserver les valeurs pour les registres pendant que le thread attend un noyau de CPU disponible courir.

+0

belle information merci! donc à peu près avant un changement de contexte le fil actuel serait pushfd et pushad? Ensuite, après le pop back et loin il va? – Dnaiel

+0

@Dnaiel: Je ne sais pas s'ils utilisent réellement ces instructions, mais c'est l'idée de base, oui. –

0

Chaque thread a son propre contexte , qui comprend l'ensemble des registres, drapeaux CPU, pile, etc.

1

En fonction du processeur, il n'y a qu'un seul ensemble de registres. Pas un ensemble par fil.

Il existe des moyens de sauvegarder l'état de tous les registres, de sorte qu'un thread puisse reprendre là où il s'était arrêté.

Some processors facilitate this.

2

Le thread est fait par un noyau ou un système d'exploitation, donc le programme ne devrait pas s'en soucier. Si aucun noyau ou système d'exploitation n'est disponible, vous devez l'implémenter vous-même. pour que vous aurez besoin:

  • une fonction qui sauvera le sate de tous les registres dans votre CPU (SP: Stack pointeur , la valeur de registre interne, PC: compteur de programme etc ...) dans un autre espace mémoire pour passer à un nouveau thread .
  • une fonction pour charger un environnement de threads dans votre environnement de processeur, restaurez la valeur de registre interne précédemment enregistrée dans votre registre de CPU.
4

Dans le matériel, il existe un seul ensemble de registres pour chaque cœur de processeur. Pour cette raison, un seul thread à la fois peut utiliser les registres. Plusieurs threads sont exécutés en même temps sur un seul cœur en passant rapidement d'un thread à l'autre. Planification du thread qui s'exécute lorsque le travail est le système d'exploitation.

Lors du passage d'un thread à un autre, le contenu des registres est enregistré dans une zone spéciale de la mémoire et les registres du thread suivant sont copiés dans le processeur. Cela inclut le pointeur d'instruction, de sorte que le thread sait où continuer à s'exécuter lorsqu'il récupère le contrôle. Ce processus est appelé changement de contexte. Comme le planificateur du système d'exploitation se trouve dans un autre thread, il ne peut planifier les processus que lorsqu'il est en cours d'exécution.

Cela signifie qu'une fonction matérielle spéciale - une interruption - est nécessaire pour contrôler les changements de contexte. Seul le système d'exploitation peut planifier des interruptions de changement de contexte.

1

vous avez

  • un ensemble de processus qui est celle de votre système d'exploitation,
  • tous les processus dispose d'un espace de mémoire qui contient mémoire allouée dynamique, données statiques et assemblage de code,
  • chaque processus a une liste de fils
  • tous fil a son propre ensemble de registres, programme de lutte contre et pile

avec changement de contexte votre planificateur permute les données de fil pour passer l'exécution à un autre.

Habituellement un processus est plus lourd qu'un fil et diverses approches de planification existent:

  • contexte faisant commutateurs seulement en interne (fils verts) à votre programme (votre système d'exploitation va simplement considérer une processus unique donc: multi-core dur)
  • Vous pouvez affecter un certain nombre de processus réels pour avoir une approche hybride permettant une optimisation multi-cœur facile.