Le modèle de von Neumann
Introduction
En 1945, le mathématicien hongrois John von Neumann rédige un texte court qui va devenir le plan de l'ordinateur moderne. Avant lui, les machines comme l'ENIAC étaient programmées en branchant et débranchant des câbles — changer de programme demandait plusieurs jours. L'idée révolutionnaire de von Neumann tient en une phrase : stocker le programme dans la mémoire au même titre que les données. Plus de quatre-vingts ans plus tard, votre smartphone, votre console et le serveur qui héberge ce cours fonctionnent toujours selon ce modèle.
Les quatre grands constituants
Une machine de von Neumann comporte quatre blocs reliés par des bus, des faisceaux de fils qui transportent les informations.
| Constituant | Rôle |
|---|---|
| Unité centrale de traitement (CPU) | Exécute les instructions une par une. |
| Mémoire | Stocke les instructions du programme et les données. |
| Périphériques d'entrée/sortie | Communiquent avec l'extérieur (clavier, écran, disque, réseau). |
| Bus | Transportent données, adresses et signaux de contrôle entre les blocs. |
Le CPU et ses deux sous-unités
Le processeur (CPU) se décompose lui-même en deux blocs essentiels.
- L'unité de contrôle (UC) lit l'instruction en mémoire, la décode, et donne les ordres aux autres composants.
- L'unité arithmétique et logique (UAL) effectue les calculs (additions, comparaisons, opérations booléennes).
Le CPU dispose aussi de petites mémoires internes très rapides appelées registres — par exemple le compteur de programme (PC), qui contient l'adresse de la prochaine instruction à exécuter.
Quel registre indique la prochaine instruction à exécuter ?
La mémoire : un grand tableau d'octets
La mémoire centrale (RAM) est organisée comme un immense tableau de cases numérotées. Chaque case contient un octet (8 bits) et possède une adresse unique.
| Adresse | Contenu (octet) | Interprétation possible |
|---|---|---|
| 0x0010 | 10110000 | Instruction « charger valeur » |
| 0x0011 | 00000101 | La valeur 5 |
| 0x0012 | 00000111 | Instruction « ajouter » |
| 0x0013 | 00000011 | La valeur 3 |
La même suite d'octets peut représenter une instruction ou une donnée, selon le contexte où le CPU la lit. C'est précisément cette uniformité qui définit l'architecture de von Neumann.
Le cycle d'exécution
Le CPU répète indéfiniment trois étapes, appelées cycle fetch–decode–execute.
- Fetch (chercher) — le CPU lit en mémoire l'instruction pointée par le compteur de programme.
- Decode (décoder) — l'unité de contrôle interprète cette instruction pour savoir quelle opération réaliser.
- Execute (exécuter) — l'UAL effectue le calcul, ou le CPU déplace une donnée, ou il saute à une autre adresse. Puis le compteur de programme avance vers l'instruction suivante.
Un exemple en pseudo-langage machine
Imaginons un mini-programme qui calcule c = a + b avec a à l'adresse 10,
b à l'adresse 11, et c à l'adresse 12.
LOAD R1, [10] ; charger la valeur de l'adresse 10 dans le registre R1
LOAD R2, [11] ; charger la valeur de l'adresse 11 dans le registre R2
ADD R3, R1, R2 ; R3 reçoit R1 + R2 (UAL au travail)
STORE R3, [12] ; ranger R3 à l'adresse 12
Le CPU exécute ces quatre lignes l'une après l'autre. À haut niveau, c'est ce
que vous écrivez en Python avec un simple c = a + b — l'interpréteur
Python finit par produire l'équivalent de ces instructions élémentaires.
Combien d'étapes compose un cycle d'exécution standard ?
Mono-processeur et multi-processeur
Pendant des décennies, un ordinateur ne contenait qu'un seul processeur. Depuis les années 2005, la limite physique de la cadence (vers 4 GHz) a poussé les fondeurs à mettre plusieurs cœurs sur une même puce. Un processeur quad-core est en réalité une puce qui contient quatre UAL et quatre unités de contrôle quasi-indépendantes, partageant une mémoire commune.
Pour aller plus loin
L'architecture Harvard (utilisée notamment dans certains microcontrôleurs) sépare physiquement la mémoire des instructions et celle des données, ce qui évite le goulot d'étranglement de von Neumann au prix d'une moindre flexibilité. Vous croiserez aussi le terme RISC (jeu d'instructions réduit, comme les processeurs ARM de votre smartphone) opposé à CISC (jeu d'instructions étendu, comme les processeurs Intel x86). Ce sont des variantes qui restent fidèles au plan général posé par von Neumann.