Question

Alors je reçois dans un peu d'assemblée ces derniers temps et je suis un débutant donc je me demandais si quelqu'un pourrait clarifier quelque chose. Je suppose chaque processus a son propre ensemble de registres, et chaque thread peut modifier ces registres droit ?. Comment alors plusieurs threads utilisent les mêmes registres sans provoquer des affrontements? Ou est-ce chaque thread a son propre ensemble de registres?

Était-ce utile?

La solution

Un changement de contexte de fil implique l'enregistrement des registres du contexte d'exécution en cours, et le chargement des registres avec les valeurs enregistrées de contexte d'exécution commencent à commutées. (entre autres). Ainsi, chaque fil a effectivement son propre ensemble de registres. Aussi sa propre pile, car ESP est l'un des registres.

Une façon de penser à ce sujet est que vous obtenez des fils en sauvant de l'état du registre en cours, et le chargement des registres avec un nouvel état. Si cela ne se produit pas, alors ne est pas un interrupteur de fil. Si vous passez aussi à un autre ensemble de tables d'adresses virtuelles, alors ce que vous avez est un commutateur de processus plutôt que d'un commutateur de fil.

vous dites:

  

Je suppose que chaque processus a son propre ensemble de registres, et chaque thread peut modifier ces registres droit?

Mais ce n'est pas tout à fait raison. Chaque noyau d'unité centrale comporte un seul ensemble de registres. Ces registres sont modifiés chaque fois que l'OS passe à un autre thread. Mais il n'y a qu'un seul thread d'exécution dans un noyau de CPU à un moment donné. Les processus n'ont pas vraiment leurs propres registres, processus propres fils (ou au moins un fil), et les fils ont des registres, ou plutôt un endroit pour garder les valeurs des registres tandis que le thread attend un noyau CPU soit disponible pour exécuter.

Autres conseils

dans le matériel, il n'y a qu'un jeu de registres pour chaque noyau de processeur. À cause de cela, un seul thread à la fois peut utiliser les registres. threads multiples sont exécutées en même temps sur un seul noyau en passant rapidement d'un fil à l'autre. Scheduling thread qui fonctionne quand est le travail du système d'exploitation.

Lors du passage d'un fil à l'autre, les contenus des registres sont enregistrées dans une zone particulière de la mémoire et les registres pour le prochain fil sont copiés dans le processeur. Cela inclut le pointeur d'instruction, de sorte que le fil sait où continuer l'exécution quand il prend le contrôle en arrière. Ce processus est appelé changement de contexte.

Depuis le planificateur du système d'exploitation est encore un autre thread, il ne peut que les processus de planification quand il est en cours d'exécution. Cela signifie qu'une fonctionnalité matérielle spéciale - une interruption - est nécessaire pour contrôler les changements de contexte. Seul le système d'exploitation peut programmer des interruptions de commutation de contexte.

Le fil se fait par un noyau ou un système d'exploitation, de sorte que le programme ne devrait pas se soucier de lui. Si aucun noyau ou système d'exploitation est disponible, vous devez implémenter vous-même. pour que vous aurez besoin:

  • une fonction qui sauvera le sate d'enregistrer tous dans votre CPU (SP: Stack pointeur, la valeur du registre interne, PC: compteur de programme etc ...) dans un un autre espace de mémoire pour passer à une nouvelle fil.
  • une fonction pour charger un environnement de fil à votre environnement de CPU, restaurer la valeur de registre interne précédemment enregistré sur votre registre de CPU.

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

Il existe des moyens pour sauver l'état de tous les registres, de sorte qu'un fil peut reprendre là où il l'avait laissé.

Certains processeurs facilitent cette .

vous

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

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

En général, un processus est plus lourd qu'un fil et diverses approches de planification existent:

  • contexte faisant passe juste en interne ( fils verts ) à votre programme (votre système d'exploitation sera tout simplement considérer un seul processus afin: multi-noyau dur)
  • vous pouvez attribuer un certain nombre de processus réels d'avoir une approche hybride permettant une optimisation multi-core facile.

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

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