Question

Je connais un peu l'ensemble, et qu'il ya 4 ou 8 ou si des registres à usage général. Comment faire tous les programmes sur un travail informatique avec juste cette quantité de registres, en particulier avec multithreading et tout?

Était-ce utile?

La solution

Multi-threading lui-même ne touche pas le nombre de registres utilisés. Lorsqu'un fil est permutée, il a généralement ses registres sauvegardés dans la mémoire et le prochain thread à exécuter a ces registres chargés à partir de sa sauvegarde précédente.

Un exemple est un système ayant une structure de bloc de contrôle de fil (TCB). Cette structure contiendrait (alors que le fil ne fonctionnait pas), le pointeur d'instruction enregistré, pointeur de pile, registres généraux, des registres à virgule flottante, les statistiques de fil et ainsi de suite. Bref, tout le nécessaire pour restaurer complètement le fil à l'état où il était quand il a été échangé pour un autre thread à exécuter.

Et tout ce qui se passe dans un ordinateur se fait dans les registres. Les compilateurs modernes peuvent optimiser le code pour que les éléments de données les plus utilisés sont conservés dans des registres, mais la grande majorité des données sont conservées en mémoire et seulement acheté dans des registres en cas de besoin.

Le meilleur livre que j'ai jamais lu sur le sujet est de Tanenbaum « organisation structurée informatique » qui examine les ordinateurs en termes de couches, à partir du niveau logique numérique au niveau du système d'exploitation, chaque bâtiment de niveau sur le précédent.

  

En plus: mon rêve est un jour écrire un livre comme ça qui couvre tout , à partir du niveau de quark jusqu'à Emacs: -)

Autres conseils

Les autres variables et les piles de threads sont généralement stockés dans l'espace mémoire protégé, où ils peuvent être appelés dans les registres en cas de besoin.

Vous pouvez consulter le livre Les éléments des systèmes informatiques une bonne compréhension de la façon dont fonctionne le processeur de votre ordinateur. Le livre est mis en place une série de projets dans lesquels vous travaillez à partir d'une porte NON-ET à une unité centrale de traitement, assembleur, compilateur simple, et à un petit système d'exploitation. Il est très précieux pour comprendre comment toutes les pièces de votre ordinateur emboîtent.

Chaque fois qu'un fil (ou un processus) inverse, à tous les registres sont poussés sur la pile par le noyau du système d'exploitation dans une structure de données appelée généralement le processus de bloc de contrôle. Ensuite, lorsque les échanges de fil / processus avant, les données du registre sont lues à partir de PCB et extraites de la pile de registres.


Il y a aussi des registres internes et une table de correspondance que le x86 a en interne ce genre de mise en place d'une table de registre virtuel pour préserver l'architecture de jeu d'instructions IA32 tout en ayant une plus grande flexibilité pour concevoir des architectures superscalaires et des algorithmes d'ordonnancement d'instructions sophistiqués.

En outre, l'instruction définit habituellement une charge et magasin instruction, qui est utilisé conjointement avec des pointeurs vers la mémoire, ce qui permet de stocker les données des registres dans la mémoire. Ce qui est le terme la machine Load-Store vient, par exemple, un ordinateur qui ne dispose pas d'instructions qui fonctionnent directement sur la mémoire.

Certains ordinateurs ne sont des instructions qui fonctionnent sur la mémoire; certaines sont basées sur une pile. Cela dépend des concepteurs et des contraintes pour le matériel.

vous devez comprendre que des milliers à des millions d'instructions de montage sont exécutées pour des choses même simples. Ces registres obtiennent leurs valeurs permutées souvent.

Il est en fait assez intéressant comment l'ordinateur est capable d'utiliser si peu de registres pour accomplir tout ce qu'il fait.

Il est très intelligent programmation au niveau de l'assemblage (typiquement en raison des compilateurs terriblement intelligents) qui permettent si peu de registres à utiliser de manière efficace.

Si un problème est impossible de compléter avec seulement les quelques registres prévus, le programme typiquement « déversement » ses registres dans la pile principale de la mémoire. En se rappelant où sur la pile, nous mettons nos registres renversées, nous pouvons facilement les récupérer en arrière.

Lorsque nous manquons des registres dont nous avons besoin nous les stockons simplement sur la pile, ce qui nous donne FAR plus d'espace que la plupart d'entre nous ont besoin de nos programmes.

Dans le cas spécifique de multi-threading, nous sauver juste tous nos registres à la mémoire, alors nous avons une ardoise propre pour les autres threads.

C'est l'une des choses que d'autres stockage de l'ordinateur, en particulier RAM, est utilisé pour:. Pour sauvegarder et restaurer bits de données dans et hors des registres

Quand un thread est mis loin si un autre thread peut fonctionner. les premiers fils de registre d'état est enregistré quelque part (sur la pile ou d'une autre structure de données), et la seconde de l'état du registre de fil est restauré à partir de là où il a été enregistré auparavant. RAM est assez rapide que des milliers de ces commutateurs peuvent se produire dans une seconde, mais prend assez de temps que si vous échanger des fils inutilement, il peut affecter les performances.

Une autre événement très, très courant est des variables locales - si une variable locale est utilisée pendant une période assez courte, il ne peut jamais exister en dehors d'un registre. Cependant, dans de nombreux cas, une variable locale pourrait avoir besoin d'être sauvé du registre à un emplacement de mémoire afin d'une autre valeur peut être chargé et manipulé dans un registre. La même chose se fait pour à peu près toutes les variables, non seulement la population locale (mais il est beaucoup plus probable pour ne jamais avoir une existence locale en mémoire).

C'est une question très impliqué et la réponse dépend de l'architecture de votre CPU.

Dans les bons jours ol », vous aviez raison - il n'y avait en effet que quelques registres à usage général. De nos jours, la CPU et le compilateur joue un jeu de « trois cartes monte » avec vos registres à usage général par le biais de techniques telles que enregistrer renommer.

Bien que sur des architectures simples, il est vrai que les registres sont copiés dans la mémoire [cache] lorsqu'un contexte commutateur se produit, des techniques comme SMT « fou » le système d'exploitation en pensant il y a plus de noyaux que ce qu'ils sont réellement.

Mais la réponse la plus générale à votre question est que les données sont déplacées dans et hors des registres beaucoup . Et voilà pourquoi une grande partie des instructions que vous voyez dans un programme de montage donné est sont des instructions « MOV ». Les concepteurs de CPU et compilateur passent beaucoup de temps et d'argent optimiser leurs conceptions de sorte que vous n'êtes pas de la mémoire Transfert de données principale (lent) dans des registres - ils essaient de conserver les données mises en cache autant que possible. Ce grand nombre d'instructions « MOV » est pourquoi la latence de la mémoire et la vitesse du bus sont si cruciales pour la performance de l'ordinateur en général.

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