2010-08-04 6 views
14

Je connais un peu l'assemblage, et il y a 4 ou 8 registres généraux. Comment tous les programmes sur un ordinateur fonctionnent avec juste ce nombre de registres, en particulier avec le multithreading et tout?Comment un ordinateur utilise-t-il seulement quelques registres?

+2

J'aime à considérer les registres comme des variables locales pour le processeur. Je n'ai pas tendance à avoir une tonne de variables dans la portée de la fonction actuelle. La plupart d'entre eux sont en mémoire quelque part, dans une autre partie du programme. –

+0

@Merlyn: C'est vrai, mais peut-être un peu trompeur, puisque les locaux sont (en l'absence d'optimisations du compilateur) généralement stockés sur la pile. – bcat

+0

@bcat: Oui, le concept ne correspond pas parfaitement. Différentes architectures auront aussi des comportements différents (bien que cela puisse être ignoré en tant qu'optimisations de compilateur). –

Répondre

11

Le multi-threading lui-même n'affecte pas le nombre de registres utilisés. Lorsqu'un thread est échangé, ses registres sont généralement sauvegardés en mémoire et le prochain thread à exécuter a ces registres chargés depuis 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 (pendant que le thread n'était pas en cours d'exécution), le pointeur d'instruction enregistré, le pointeur de pile, les registres à usage général, les registres à virgule flottante, les statistiques de thread et ainsi de suite. En bref, tout devait restaurer totalement le thread dans l'état dans lequel il était lorsqu'il a été remplacé par un autre thread à exécuter.

Et tout ce qui se passe dans un ordinateur ne se fait pas dans les registres. Les compilateurs modernes peuvent optimiser le code de sorte que les éléments de données les plus utilisés soient conservés dans des registres, mais la grande majorité des données sont conservées en mémoire et ne sont achetées dans des registres que lorsque cela est nécessaire.

Le meilleur livre que j'ai jamais lu sur le sujet est Tanenbaum's"Structured Computer Organization" qui examine les ordinateurs en termes de couches, à partir du niveau logique numérique jusqu'au niveau du système d'exploitation, chaque niveau s'appuyant sur le précédent.

                      alt text http://ecx.images-amazon.com/images/I/51PAGENX36L._SL500_AA300_.jpg

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

+0

+1 pour Tanenbaum, pas parce qu'il est Tanenbaum, mais parce que ce livre est vraiment génial. – bcat

+0

Il y a peu de gens dans l'industrie que j'évalue aussi haut que Tanenbaum (Knuth est le seul qui me vient à l'esprit). Les deux ont contribué beaucoup à leurs livres et logiciels prolifiques. J'ai encore le 2/E de ce livre que j'ai récupéré chez Uni (il ya un peu plus d'un an). – paxdiablo

+0

Oh, je suis complètement d'accord. Je voulais juste dire que j'aime le livre pour sa propre valeur, pas seulement parce que son auteur est une figure très importante dans CS (ce qui est certainement le cas de Tanenbaum). Et oui, je devais lire le livre à l'université aussi, et je suis tellement content que mon professeur l'ait choisi par rapport à un autre livre sur les systèmes informatiques. Je suis toujours étonné de voir à quel point il présente clairement la matière sans la réduire au minimum. – bcat

1

vous devez réaliser que des milliers à des millions d'instructions d'assemblage sont exécutées même pour des choses simples. Ces registres obtiennent souvent leurs valeurs échangées.

2

Chaque fois qu'un thread (ou un processus) s'interrompt, 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 habituellement le bloc de contrôle de processus. Ensuite, lorsque le thread/processus revient en arrière, les données du registre sont lues à partir du PCB et déplacées de la pile vers les 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 l'ordonnancement des instructions sophistiqué algorithmes.

En outre, l'instruction ensembles ont généralement une instruction de charge et magasin, 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. C'est de là que vient le terme Machine Load-Store, c'est-à-dire un ordinateur qui n'a pas d'instructions qui fonctionnent directement dans la mémoire.

Certains ordinateurs ont des instructions fonctionnant en mémoire; certains sont basés sur une pile. Cela dépend des concepteurs et des contraintes imposées au matériel.

5

Les autres variables et piles de threads sont généralement stockées dans un espace mémoire protégé, où elles peuvent être appelées dans des registres si nécessaire.

Vous voudrez peut-être consulter le livre The Elements of Computing Systems pour une bonne compréhension de la façon dont le processeur de votre ordinateur fonctionne. Le livre est configuré comme une série de projets où vous travaillez à partir d'une porte NON-ET vers un processeur, un assembleur, un compilateur simple et un petit système d'exploitation. Il est inestimable de comprendre comment toutes les pièces de votre ordinateur s'emboîtent.

+0

Refusé de répondre et de fournir une lecture plus approfondie. – mnuzzo

0

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

Lorsqu'un thread est désactivé, un autre thread peut s'exécuter. l'état du premier enregistrement de threads est enregistré quelque part (sur la pile ou dans une autre structure de données), et l'état de registre du thread de seconde est restauré à partir de l'endroit où il a été sauvegardé auparavant. La RAM est assez rapide pour que des milliers de ces commutateurs puissent se produire en une seconde, mais prend assez de temps pour que si vous échangez des threads inutilement, cela peut avoir un impact sur les performances.

Une autre occurrence très, très commune est les variables locales - si une variable locale est utilisée pendant une période assez courte, elle peut ne jamais exister en dehors d'un registre. Cependant, dans de nombreux cas, il peut être nécessaire d'enregistrer une variable locale du registre dans un emplacement de mémoire afin qu'une autre valeur puisse être chargée et manipulée dans un registre. La même chose se produit réellement pour presque toutes les variables, pas seulement les locaux (mais il est beaucoup plus probable pour un local de ne jamais avoir d'existence en mémoire).

1

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

Il s'agit vraiment d'une programmation intelligente au niveau de l'assemblage (généralement grâce à des compilateurs terriblement intelligents) qui permettent d'utiliser si peu de registres de manière aussi efficace.

Si un problème est impossible à résoudre avec seulement les quelques registres fournis, le programme va généralement "déverser" ses registres dans la pile de mémoire principale. En nous rappelant où sur la pile nous mettons nos registres renversés, nous pouvons facilement les récupérer. 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 pour nos programmes.

Dans le cas spécifique du multi-thread, nous sauvegardons simplement tous nos registres en mémoire, puis nous avons une table propre pour les autres threads.

0

C'est une question assez complexe et la réponse dépend de l'architecture de votre CPU.

Dans le bon vieux temps, vous aviez raison - il n'y avait en effet que quelques registres à usage général. De nos jours, le CPU et le compilateur jouent un jeu de "three-card-monte" avec vos registres à usage général à travers des techniques comme register renaming.

Bien que sur des architectures simples, il est vrai que les registres sont copiés dans la mémoire [cache] lorsqu'un changement de contexte se produit, des techniques comme SMT "trompent" l'OS en pensant qu'il y a plus de noyaux qu'ils ne le 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 c'est pourquoi une grande partie des instructions que vous voyez dans un programme d'assemblage donné sont des instructions "MOV".Les concepteurs de CPU et de compilateurs dépensent beaucoup de temps et d'argent pour optimiser leurs conceptions afin de ne pas déplacer les données de la mémoire principale (lente) vers les registres - ils essaient de garder les données en mémoire cache autant que possible. Ce grand nombre d'instructions "MOV" explique pourquoi la latence de la mémoire et la vitesse du bus sont si cruciales pour les performances de l'ensemble de l'ordinateur.

Questions connexes