Les grands principes de fonctionnement des ordinateurs actuels résultent de travaux menés au milieu des années 1940. Ces travaux ont défini un schéma d'architecture appelée architecture de von Neumann, en référence à John Von Neumann (1903-1957), un mathématicien et physicien (et bien d'autres choses) américano-hongrois qui a participé et publié les travaux en 1945.
Fig. 1 - John von Neumann
Crédit : © Los Alamos National Laboratory, via Wikimedia Commons.
Avant de détailler cette architecture, commençons par une petite activité.
Lorsqu'on ouvre un ordinateur, quelle que soit sa marque, nous retrouvons en général les mêmes éléments : le processeur ou microprocesseur, la mémoire vive (RAM), la carte mère, la carte graphique, interface de connexion des périphériques, le lecteur de disque, le disque dur, le clavier, l'écran, la souris, l'alimentation électrique.
Question 1 : Associez le bon élément à chaque numéro du schéma ci-dessous.
Question 2 : Associez chaque élément à sa description
L'idée majeure de l'architecture de von Neumann, était d'utiliser une zone de stockage unique, à savoir la mémoire de l'ordinateur, pour conserver à la fois les programmes (instructions) et les données qu'ils devaient manipuler.
Les travaux de von Neumann publiés en 1945 concernaient la conception de l'EDVAC, un ordinateur basé sur cette architecture. Cet ordinateur était capable d'additionner, soustraire, multiplier et diviser en binaire. Sa capacité mémoire est l'équivalent actuel de 5,5 ko, alors qu'il occupait une surface de 45 m² et pesait presque 8 tonnes. Pour le faire fonctionner, trois équipes de trente personnes se succédaient en continu.
Dans l'architecture de von Neumann, un ordinateur est composé de 4 parties :
Le CPU (Central Processing Unit ou Unité Centrale de Traitement), aussi appelé processeur, regroupe à la fois l'unité arithmétique et logique et l'unité de contrôle.
Lorsque le processeur rassemble ce deux unités dans un seul et même circuit électronique, on parle de microprocesseur.
Fig. 3 - Schéma de l'architecture de Von Neumann
Crédit : Adaptation de l'image originale de Schega, CC BY-SA 3.0, via Wikimedia Commons
Nous décrivons dans ce paragraphe le fonctionnement des 4 parties de l'architecture de von Neumann. Ces informations prendront encore davantage de sens lorsque nous aborderons le langage machine à la fin de ce cours.
Elle possède notamment deux registres (= mémoires internes très rapides) :
Elle est composée notamment de :
Nous parlerons davantage de ces circuits électroniques dans un prochain chapitre, à suivre donc...
Les registres contiennent les valeurs de la mémoire de l'ordinateur nécessaires à l'exécution des instructions. Le résultat d'un calcul (arithmétique ou logique) est stocké dans l'accumulateur et peut être utilisé pour les instructions ultérieures de manière très rapide car cela évite les allers-retours en mémoire (l'accès aux registres est très rapide comparé à l'accès aux données en mémoire).
Les échanges de données entre le processeur et la mémoire se font par l'intermédiaire de bus de communication.
La mémoire de l'ordinateur (à ne pas confondre avec le disque dur) est composée de plusieurs milliards de circuits mémoires qui sont organisés en agrégats de 8, 16, 32, 64 bits (voire plus) appelés cases mémoires. Leur nombre définit la taille mémoire de l'ordinateur et chaque case possède une adresse pour les distinguer. Comme dit précédemment, ces cases mémoires contiennent à la fois les programmes et les données sur lesquelles portent les programmes.
Les registres du processeur sont également des cases mémoires, dont l'accès (lecture/écriture) est très rapide. Lorsque l'on parle de processeurs 32 bits, 64 bits, on fait en faire référence à la taille de ces registres.
Il en existe un très grand nombre que l'on peut classer en deux catégories : les périphériques d'entrée et les périphériques de sortie. Certains appartiennent à ces deux familles.
Pouvez-vous citer quelques périphériques de chaque famille ? Et appartenant aux deux ?
Dans cette partie, nous allons voir comment un ordinateur exécute un programme.
Un programme est une suite de nombres binaires placés en mémoire représentant des instructions exprimées en langage machine. C'est le seul langage que peut comprendre le processeur chargé d'exécuter ces différentes instructions.
Ainsi, un programme écrit dans un langage de programmation évolué (on dit de haut niveau) comme Python, Java, C, etc. ne peut pas être compris par le processeur. On doit donc utiliser un compilateur (pour le C, par exemple) ou un interpréteur (pour Python, par exemple) pour transformer le programme en langage machine.
Une instruction machine est un mot binaire composé de deux parties :
Une instruction machine possède le schéma suivant :
Nous allons voir des exemples tout de suite !
Il n'est pas facile (voire impossible) pour un humain d'écrire directement les mots binaires d'un programme en langage machine. On peut utiliser à la place un langage d'assemblage, appelé assembleur, qui est le langage de plus bas niveau d'un ordinateur lisible par un humain. Nous allons détailler un langage d'assemblage pour que vous puissiez comprendre l'exécution d'une séquence d'instructions de type langage machine.
Il existe plusieurs sortes de langage assembleur car ce dernier dépend du processeur utilisé.
Chaque instruction écrite en assembleur possède les deux champs "code opération" et "opérandes".
Dans la suite on utilisera le jeu d'instructions du simulateur RISC développé par Peter Higginson et disponible à cette adresse : https://peterhigginson.co.uk/RISC/.
On ne donne qu'une partie des instructions possibles, la liste complète est disponible ici. Vous utiliserez ce simulateur dans les activités pour bien fixer les idées.
Exemples d'instructions
Voici quelques instructions écrites en assembleur et leurs significations.
On trouve pour chacune un premier mot de 3 caractères qui correspond au "code opération" suivi d'un espace et des "opérandes".
Ainsi, le programme Python
a = 2
b = 7
c = a + b
pourrait s'écrire en assembleur de la façon suivante
MOV R0,#2
MOV R1,#7
ADD R1,R0,R1
STR R1,21
HLT
Dans ce cas, quels sont les états des registres à la fin du programme ? Où est stockée la valeur de la variable
c
à la fin du programme ?
Le jeu d'instructions du simulateur RISC accessible ici, donne la correspondance de chaque instruction assembleur en instruction machine.
Ainsi, en utilisant ce jeu d'instructions, le programme en assembleur précédent peut être converti en une suite d'instructions machine pouvant être exécutées par le processeur. On obtiendrait le code machine suivant (les cases mémoires sont de taille 16 bits ici) :
0010100000000010 0010100100000111 0110000001000001 1110001000010101 0000000000000000
On peut voir les correspondances, dans le tableau ci-dessous, où on a écrit en rouge le champ code opération :
En copiant le code assembleur dans la fenêtre de gauche du simulateur, on peut observer tout le déroulé de l'exécution du programme (on veillera à choisir l'option "binary" pour voir les mots en mémoire en binaire) : https://peterhigginson.co.uk/RISC/
Ce simulateur utilise des cases mémoires de 16 bits, les ordinateurs plus récents en ont de taille 64 bits généralement. De plus, le simulateur possède beaucoup d'autres instructions machine, certaines seront développées dans les activités 🙂
Un CPU possède une horloge qui définit le rythme auquel les instructions sont exécutées. Pour exécuter une instruction, le processeur va effectuer ce qu'on appelle un cycle d'exécution qui s'effectue en trois étapes :
Par exemple, un processeur ayant une fréquence de 3,2 GHz va effectuer 3,2 milliards de cycles d'horloge par seconde.
La fréquence des processeurs a augmenté de manière linéaire depuis les premiers ordinateurs mais stagne depuis une vingtaine d'année car la chaleur produite devient trop importante et pourrait perturber la lecture des informations voire détériorer physiquement les circuits 🌡️🥵
Le modèle de von Neumann défini en 1945 est toujours celui utilisé dans les ordinateurs actuels. Évidemment, les composants se sont de plus en plus miniaturisés et sont de plus en plus performant.
Par rapport au schéma initial, deux évolutions sont à noter :
les entrées-sorties, intialement commandées par le CPU, sont depuis les années 1960 sous le contrôle de processeurs autonomes
les ordinateurs sont désormais multiprocesseurs, c'està-dire qu'ils possèdent plusieurs processeurs, qu'il s'agisse d'unités séparées ou de coeurs multiples à l'intérieur d'une même puce. Cela permet d'atteindre une puissance de calculs élevée sans augmenter la vitesse des processeurs individuels, limitée par les capacités d'évacuation de la chaleur dans des circuits de plus en plus denses.
Ces deux évolutions ont pour conséquence de mettre la mémoire, plutôt que l'unité de contrôle, au centre de l'ordinateur, et d’augmenter le degré de parallélisme dans le traitement et la circulation de l’information. Mais elles ne remettent pas en cause le modèle de von Neumann.
Fig. 4 - Architecture actuelle des ordinateurs multiprocesseurs
Crédit : Adaptation de l'image originale de Schega, CC BY-SA 3.0, via Wikimedia Commons
Références :
Germain BECKER, Lycée Mounier, ANGERS