La FAQ non officielle du SMP
Autrefois, pour écrire de l'assembleur x86, par exemple, vous aviez des instructions disant "charger le registre EDX avec la valeur 5", "incrémenter le registre EDX", etc. Avec les processeurs modernes qui ont 4 cœurs (ou même plus), au niveau du code machine, est-ce qu'on a l'impression qu'il y a 4 processeurs séparés (c'est-à-dire qu'il y a seulement 4 registres "EDX" distincts) ?
Exactement. Il y a 4 jeux de registres, y compris 4 pointeurs d'instruction séparés.
Si c'est le cas, lorsque vous dites "incrémenter le registre EDX", qu'est-ce qui détermine quel registre EDX du CPU est incrémenté ?
L'unité centrale qui a exécuté cette instruction, naturellement. Considérez cela comme 4 microprocesseurs entièrement différents qui partagent simplement la même mémoire.
Y a-t-il un concept de "contexte CPU" ou de "thread" dans l'assembleur x86 maintenant ?
Non. L'assembleur traduit simplement les instructions comme il l'a toujours fait. Il n'y a aucun changement.
Comment fonctionne la communication/synchronisation entre les cœurs ?
Comme ils partagent la même mémoire, c'est surtout une question de logique de programme. Bien qu'il existe maintenant un interruption interprocesseur Ce mécanisme n'est pas nécessaire et n'était pas présent à l'origine dans les premiers systèmes x86 à double processeur.
Si vous écriviez un système d'exploitation, quel mécanisme est exposé via le matériel pour vous permettre de planifier l'exécution sur différents cœurs ?
En fait, l'ordonnanceur ne change pas, si ce n'est qu'il est légèrement plus attentif aux sections critiques et aux types de verrous utilisés. Avant le SMP, le code du noyau appelait éventuellement l'ordonnanceur, qui regardait la file d'attente d'exécution et choisissait un processus à exécuter comme prochain thread. (Pour le noyau, les processus ressemblent beaucoup aux threads). Le noyau SMP exécute exactement le même code, un thread à la fois, mais le verrouillage des sections critiques doit maintenant être sécurisé par le SMP pour éviter que deux cœurs ne choisissent accidentellement le même PID.
S'agit-il d'une ou de plusieurs instructions spéciales privilégiées ?
Non. Les cœurs fonctionnent tous dans la même mémoire avec les mêmes anciennes instructions.
Si vous deviez écrire un compilateur optimisant/une VM de bytecode pour un processeur multicœur, que devriez-vous savoir spécifiquement sur, disons, x86 pour qu'il génère un code qui s'exécute efficacement sur tous les cœurs ?
Vous exécutez le même code qu'avant. C'est le noyau d'Unix ou de Windows qui a dû changer.
Vous pourriez résumer ma question comme suit : "Quelles modifications ont été apportées au code machine x86 pour prendre en charge la fonctionnalité multicœur ?"
Rien n'était nécessaire. Les premiers systèmes SMP utilisaient exactement le même jeu d'instructions que les uniprocesseurs. L'architecture x86 a beaucoup évolué et des millions de nouvelles instructions ont été ajoutées pour accélérer les choses, mais aucune n'était nécessaire. necesario pour le SMP.
Pour plus d'informations, voir le Spécification du multiprocesseur Intel .
Mise à jour : toutes les questions de suivi peuvent être répondues en acceptant complètement qu'une n -Un processeur multicore est presque 1 exactement la même chose que n des processeurs séparés qui partagent simplement la même mémoire. 2 Il y a une question importante qui n'a pas été posée : comment écrire un programme pour qu'il fonctionne sur plus d'un cœur pour plus de performances ? Et la réponse est : il est écrit en utilisant une bibliothèque de threads comme Pthreads. Certaines bibliothèques de threads utilisent des "threads verts" qui ne sont pas visibles pour le système d'exploitation, et ceux-ci n'auront pas de cœurs séparés, mais tant que la bibliothèque de threads utilise les fonctionnalités de threads du noyau, votre programme threadé sera automatiquement multicœur.
1. Pour des raisons de rétrocompatibilité, seul le premier noyau démarre à la réinitialisation, et quelques opérations de type pilote doivent être effectuées pour activer les autres noyaux.
2. Ils partagent également tous les périphériques, naturellement.
2 votes
Une question similaire (mais pas identique) se pose ici : stackoverflow.com/questions/714905/