🧠 Le Processeur

Registres, ALU, décodeurs… les pièces du moteur qui font tourner votre factorielle.

1. Vue d'ensemble — ça ressemble à quoi ?

Un processeur moderne, c'est une usine à instructions. Ça arrive en flux, ça passe sur un tapis roulant, chaque atelier fait sa part du boulot, et à la fin une resultat sort — en principe celui que vous vouliez.

🫙 Cache L1
🔀 Décodeur
⚙️ ALU
📦 Registres
🌐 Bus mémoire

Entre tout ça : des kilomètres de transistors, des horloges qui tickent à plusieurs milliards de fois par seconde, et suffisamment de fils pour emballer la Terre.

🏭 Vue de loin, une puce c'est un plan de métro que personne comprend. Vue de près, c'est un champ de blé vu du satellite. À l'échelle du transistor, c'est juste des interrupteurs qui cliquent. Des milliards d'interrupteurs. Vous avez dit « élégant » ?

2. Les registres — la mémoire qui va (très) vite

Les registres sont les 16 petits casiers de la banane du processeur. Accès : 1 cycle horloge. Pas de « veuillez patienter ». Pas de « votre fichier est sur le disque réseau ». Juste boum, c'est là.

Notre code assembleur utilise une partie seulement. Voici les stars de la factorielle :

%raxRésultat, retour de fonction, multiplication
%rbxSauvé par la fonction (callee-saved)
%rcxCompteur, 4e argument
%rdx3e argument, multiplication
%rsi2e argument (source/string)
%rdi1er argument (destination)
%rbpFrame pointer (base de la pile)
%rspStack pointer (sommet de la pile)
%r8–%r15Registres supplémentaires (5e–6e args)
%ripInstruction pointer (compteur ordinal)
%eflagsFlags : zéro, signe, retenue, overflow…
Nom completSignificationRegistres 32 bitsRegistres 16 bitsRegistres 8 bits
%raxAccumulator%eax%ax%al / %ah
%rbxBase%ebx%bx%bl / %bh
%rcxCounter%ecx%cx%cl / %ch
%rdxData%edx%dx%dl / %dh
🐇 Les registres, c'est la mémoire cache de la mémoire cache de la RAM. Si les registres étaient des commerces, ce serait des épiceries de quartier ouvertes 24h/24, 7j/7. La RAM, c'est Carrefour un samedi après-midi. Le disque dur, c'est Amazon avec livraison en 15 jours.

Les flags (EFLAGS / RFLAGS)

Un registre spécial dont chaque bit raconte quelque chose sur la dernière opération :

FlagBitSignificationExemple
ZF6Zero Flag — résultat nulcmp de deux valeurs égales → ZF=1
SF7Sign Flag — résultat négatifcmp n,0 avec n négatif → SF=1
OF11Overflow Flag — débordement signé127+1 en 8 bits → 128, OF=1
CF0Carry Flag — retenue / empruntaddition 64-bit qui dépasse → CF=1
PF2Parity Flag — nombre de bits à 1 pairutile… pour les trucs qui datent du 8086
🚩 Les flags, c'est le tableau de bord du processeur : roue libre (ZF), clignotant à gauche (SF), voyant moteur (OF). Et le PF c'est le voyant « ceinture bouclée » — présent, mais personne ne le regarde jamais.

3. L'ALU — l'unité qui calcule (et qui juge)

ALU = Arithmetic Logic Unit. C'est le cœur du réacteur. Elle additionne, soustrait, multiplie, divise, décale, fait du ET/OU/XOR, compare… et met à jour les flags.

Quand notre code fait imulq %rdx, %rax, c'est l'ALU qui tourne — elle prend deux entrées (les registres), les balance dans son circuit de multiplication, et écrit le résultat dans %rax.

# Chaque fois que vous voyez l'une de ces instructions, l'ALU sue :
imulq %rdx, %rax   ; multiplication → ALU en mode bourrin
addl  $1, -12(%rbp) ; addition → ALU en mode cantine
salq  $4, %rax    ; décalage → ALU en mode déménageur
cmpl  %eax, %ebx  ; comparaison → ALU en mode arbitre
🏋️ L'ALU, c'est le stakhanoviste du processeur. Elle fait tout, tout le temps, sans pause café. Elle est composée exclusivement de portes logiques — technique : des transistors qui font « et si on faisait comme si… » et qui ont raison tout le temps. (Sauf quand vous faites de l'arithmétique flottante, mais c'est une autre histoire.)

Les variantes de l'ALU

ComposantRôleDit comme ça
ALU (U = Unit)Opérations arithmétiques et logiques sur entiersLe couteau suisse
FPU (F = Floating)Opérations sur nombres flottants (float, double)L'ALU qui a fait maths sup
AGU (A = Address)Calcule les adresses mémoire (rbp-20, etc.)Le GPS de bord
SIMD (SSE/AVX)Une opération sur plusieurs données à la foisLe rouleau compresseur
💡 L'AGU calcule %rbp - 20 pendant que l'ALU fait la multiplication. C'est ce qu'on appelle du parallélisme au niveau instruction. C'est aussi pourquoi votre processeur arrive à regarder YouTube tout en compilant votre code : il a plusieurs équipes de déménageurs.

4. Le décodeur d'instructions — le traducteur simultané

Le processeur ne parle pas assembleur. Il parle microcode. Le décodeur est l'interprète attitré : il prend vos instruction x86-64 (qui peuvent faire de 1 à 15 octets — merci l'héritage CISC) et les traduit en une séquence d'opérations microscopiques (micro-ops) que le cœur exécute.

# Ce que vous écrivez :
addl $1, -12(%rbp)

# Ce que le décodeur comprend :
  * charger la valeur à l'adresse rbp-12
  * ajouter 1
  * écrire à l'adresse rbp-12
  * mettre à jour les flags (ZF, SF, OF, CF)

# Soit typiquement 2 à 3 micro-ops.
🤖 Le décodeur x86-64, c'est le mec qui traduit « laissez-passer A38 » en langage clair. Il doit gérer des centaines d'instructions toutes plus tordues les unes que les autres, parce que Intel a promis la compatibilité remonté jusqu'au 8086 de 1978. Résultat : le décodeur bouffe 30% de la surface de la puce. Tout ça pour que votre vieux jeu DOS tourne encore. On dit « merci », doucement.

Pipeline — la chaîne de montage

Une instruction ne passe pas d'un coup dans l'ALU. Elle traverse des étapes — comme dans une chaîne de montage automobile :

📥 Fetch
🔀 Decode
📦 Execute
📖 Memory
📝 Writeback

Chaque étape prend 1 cycle. Donc une instruction met 5 cycles à passer, mais on en délivre une par cycle. C'est comme une baguette de pain : elle met 12h à arriver, mais toutes les 30 secondes quelqu'un en achète une.

🏭 Les problèmes arrivent quand une instruction dépend de la précédente (data hazard). Le processeur doit alors staller — c'est-à-dire attendre. C'est comme si l'ouvrier de l'ALU criait « HEP, J'AI PAS ENCORE FINI LA PORTIÈRE, LIVREZ PAS LA CARROSSERIE ! » Les processeurs modernes ont des astuces pour ça (forwarding, exécution dans le désordre…), mais au fond, ils restent des usines avec des ouvriers qui crient.

5. La mémoire cache — le frigo à données

Aller chercher une valeur dans la RAM, ça prend environ 100 cycles. Le processeur déteste attendre. Alors il a construit un frigo (le cache) à côté de son bureau.

NiveauTaille typiqueLatenceLocalisation
L132 Ko (données) + 32 Ko (instructions)~4 cyclesDans le cœur
L2512 Ko~12 cyclesDans le cœur (ou partagé)
L38–32 Mo~40 cyclesPartagé entre tous les cœurs
RAM8–64 Go~100 cyclesSur la carte mère
SSD / Disque~10⁷ cyclesOn a arrêté de compter
🧊 Le cache, c'est la table de chevet du processeur — il garde sous la main ce qu'il lit souvent. La RAM, c'est la bibliothèque municipale. Le disque dur, c'est les archives départementales. Et le cloud, c'est les catacombes de Paris. Bon courage.

6. L'unité de contrôle — le chef d'orchestre

L'unité de contrôle (Control Unit) est le chef d'orchestre. Elle ne calcule rien, elle décide qui fait quoi, quand, et dans quel ordre.

Elle lit le compteur ordinal (%rip), envoie l'adresse de l'instruction au cache L1, ordonne au décodeur de traduire, dit à l'ALU de se réveiller, dit au bus mémoire d'écrire le résultat… bref, c'est le chef de projet qu'on n'a jamais vu coder mais sans qui rien ne sort.

🎻 L'unité de contrôle, c'est le chef d'orchestre qui gère la partition. Quand elle se trompe (mauvaise prédiction de branchement), tout le monde s'arrête, et on vide le pipeline. C'est l'équivalent de « non, pas le fa dièse, c'était un sol bémol, on reprend de la mesure 12 ». Coût : 15 cycles de vide-grenier.

7. Le bus — les autoroutes de la puce

Le bus relie tout ça : le processeur, la RAM, les périphériques. Il y a le bus d'adresse (pour dire ), le bus de données (pour dire quoi), et le bus de contrôle (pour dire comment).

# Quand notre code accède à la mémoire :
movl -12(%rbp), %eax   ; adresse → bus d'adresse
                         ; donnée  → bus de données
                         ; lecture → bus de contrôle

Ça a l'air simple, mais c'est un protocole complexe avec des signaux d'acquittement, de priorité, et des arbitrages parce que oui, les cœurs se battent pour la RAM.

🚌 Le bus mémoire, c'est le couloir de métro aux heures de pointe. Tout le monde veut aller dans la même direction, personne ne cède la place, et il y a toujours un arbitre pour dire « toi d'abord, toi après ». Dans les puces modernes, on ajoute des bus dédiés (ring bus, mesh) pour fluidifier le trafic. Du covoiturage pour transistors.

8. Et aussi…

ComposantRôleTraduction libre
TLB (Translation Lookaside Buffer)Cache des traductions d'adresses virtuelles → physiquesL'annuaire téléphonique du MMU
MMU (Memory Management Unit)Traduit les adresses virtuelles en adresses physiquesLe douanier qui vérifie les passeports
Branch PredictorDevine si le saut conditionnel sera pris ou nonMadame Irma du processeur
ROB (ReOrder Buffer)Permet l'exécution dans le désordreLa poste : on dépose, on réordonne, on livre
PMU (Performance Monitoring Unit)Compte les événements (cache misses, branches mal prédites…)La CAF du processeur
APIC (Advanced Programmable Interrupt Controller)Gère les interruptionsLe réveille-matin des cœurs
🧩 Vous pensez avoir un processeur à 8 cœurs ? Vous avez 8 usines complètes avec leurs propres frigos, bureaux de poste, douaniers, et madame Irma. Et elles essaient toutes de se parler sans se marcher sur les transistors. Le miracle, c'est que ça marche.

9. Le cycle d'exécution (von Neumann) en 1 schéma

🔁 Fetch
(%rip) → L1I
🔀 Decode
micro-ops
⚙️ Execute
ALU / FPU / AGU
📖 Memory
L1D / RAM
📝 Writeback
registre

C'est tout bête. On prend une instruction, on la cuisine en cinq étapes, on dépose le résultat, et on recommence des milliards de fois par seconde. C'est ce qu'on appelle le cycle de von Neumann (1945). Ça n'a pas changé depuis. On a juste ajouté de la prédiction, du désordre, du cache, du multi-cœur… mais l'idée de base est toujours là.

⏳ 1945 : von Neumann invente l'architecture stockée-programme.
2026 : votre processeur exécute toujours le même cycle, juste 10 millions de fois plus vite. C'est comme si on roulait toujours en Ford T, mais à Mach 3. Et avec clim.

10. Lexique de survie

TermeDéfinition express
CISCx86-64 — instructions complexes, taille variable, héritage pléthorique
RISCARM, RISC-V — instructions simples et fixes, le zen du processeur
µopMicro-opération — l'instruction une fois passée au décodeur
PipelineChaîne de montage : Fetch → Decode → Execute → Memory → Writeback
HazardQuand une instruction doit attendre l'autre — data, control, structural
ForwardingCourt-circuiter le pipeline : « j'ai le résultat tout de suite, prends-le »
Branch mispredictionLe prédicteur a dit « saut pris » mais le saut n'a pas été pris. Tout le pipeline est vidé.
Speculative executionExécuter avant d'être sûr, au cas où. (Merci Meltdown/Spectre d'avoir gâché la fête.)
Out-of-OrderExécuter dans le désordre pour ne pas perdre de cycles, puis reconstituer l'ordre logique
Hyper-Threading (SMT)Un cœur physique qui fait semblant d'être deux (pour mieux utiliser le pipeline)
📚 Si vous lisez ce tableau et que vous comprenez tout, bravo ! Vous êtes un architecte processeur qui s'ignore. Si vous ne comprenez rien, pas de panique : la plupart des ingénieurs non plus. On fait tous man gcc et on espère.