Architecture & OS
Von Neumann, binaire, processus, mémoire, ordonnancement
🎯 Introduction
Ce chapitre explore le fonctionnement interne d'un ordinateur : comment les données sont représentées en binaire, comment le processeur exécute des instructions, et comment le système d'exploitation gère les processus et la mémoire.
✅ Ce qu'il faut savoir
- Architecture de Von Neumann : CPU, mémoire, bus, E/S
- Représentation binaire, hexadécimale et entiers signés (complément à 2)
- Encodage des caractères : ASCII, UTF-8
- Rôle du système d'exploitation
- Notion de processus, état (prêt/actif/bloqué), ordonnancement
- Interblocage (deadlock)
🏗️ Architecture de Von Neumann
Proposée en 1945, cette architecture est à la base de tous les ordinateurs modernes. Elle repose sur 4 composants reliés par des bus :
| Composant | Rôle | Détails |
|---|---|---|
| UC (Unité de Contrôle) | Décode et séquence les instructions | Contient le compteur programme (PC) et le registre d'instruction (IR) |
| UAL (Unité Arithmétique et Logique) | Effectue les calculs | Opérations +, -, ×, AND, OR, NOT, comparaisons |
| Mémoire principale (RAM) | Stocke programmes et données | Volatile, adressable par octet |
| Entrées/Sorties | Communique avec le monde extérieur | Clavier, écran, disque, réseau… |
Cycle d'exécution d'une instruction (Fetch–Decode–Execute)
1. FETCH : Le PC indique l'adresse de l'instruction en mémoire.
L'instruction est copiée dans le registre IR.
PC est incrémenté (pointe sur l'instruction suivante).
2. DECODE : L'UC décode l'instruction (quel opcode ? quels opérandes ?)
3. EXECUTE : L'UAL effectue l'opération. Le résultat est stocké
dans un registre ou en mémoire.
Exemple : ADD R1, R2 → R1 ← R1 + R2
Les bus
Bus de données : transporte les données entre CPU et mémoire
Bus d'adresses : indique où lire/écrire en mémoire
Bus de contrôle : signaux de lecture/écriture, interruptions...
💻 Représentation binaire
Conversion entre bases
# Décimal → Binaire (divisions successives par 2)
# 42 = 32+8+2 = 101010₂
bin(42) # → '0b101010'
int('101010', 2) # → 42 (binaire → décimal)
# Hexadécimal (base 16 : 0-9 puis A-F)
hex(255) # → '0xff'
int('FF', 16) # → 255
# 1 octet = 8 bits = 2 chiffres hexa
# 0xFF = 11111111₂ = 255₁₀
Entiers signés : complément à 2
Sur n bits, les valeurs vont de -2ⁿ⁻¹ à 2ⁿ⁻¹ - 1. Sur 8 bits : -128 à +127.
# Représenter -5 sur 8 bits :
# 1. Écrire 5 en binaire : 00000101
# 2. Inverser tous les bits : 11111010
# 3. Ajouter 1 : 11111011 → c'est -5 en complément à 2
# Vérification : 00000101 + 11111011 = 100000000
# (9 bits, le bit de débordement est ignoré → 0) ✅
# En Python
import struct
struct.pack('b', -5) # → b'\xfb' (0xFB = 11111011)
Encodage des caractères
| Standard | Taille | Caractères | Notes |
|---|---|---|---|
| ASCII | 7 bits (128 valeurs) | Lettres latines, chiffres, ponctuation | Pas d'accents ! |
| Latin-1 (ISO-8859-1) | 8 bits (256 valeurs) | ASCII + caractères européens | é, à, ü… |
| UTF-8 | 1 à 4 octets | Tous les caractères Unicode (>1M) | Standard du web |
| UTF-32 | 4 octets fixes | Unicode complet | Gaspilleur en mémoire |
# En Python 3, les str sont Unicode (UTF-32 interne)
ord('A') # → 65 (code Unicode)
chr(65) # → 'A'
ord('é') # → 233
# Encodage en octets
'café'.encode('utf-8') # → b'caf\xc3\xa9' (5 octets !)
'café'.encode('latin-1') # → b'caf\xe9' (4 octets)
🐧 Système d'exploitation
Le système d'exploitation (OS) est le logiciel qui fait l'interface entre le matériel et les applications. Il gère les ressources partagées : processeur, mémoire, fichiers, périphériques.
| Fonction | Description |
|---|---|
| Gestion des processus | Créer, terminer, ordonnancer les programmes en cours |
| Gestion de la mémoire | Allouer/libérer la RAM, mémoire virtuelle |
| Système de fichiers | Organisation hiérarchique (arborescence), droits d'accès |
| Gestion des E/S | Pilotes (drivers), abstraction des périphériques |
| Sécurité | Mode utilisateur vs mode noyau, isolation des processus |
⚙️ Processus et ordonnancement
Un processus est un programme en cours d'exécution. Il possède son propre espace mémoire, ses registres et son compteur programme.
États d'un processus
fork() schedulé fin
Nouveau ────────► Prêt ───────────► Actif ──────► Terminé
▲ │
│ préempté │ attend E/S
└─────────────────┘
│
▼
Bloqué
(attend ressource)
| État | Description |
|---|---|
| Prêt | En attente du processeur (dans la file de l'ordonnanceur) |
| Actif (Running) | S'exécute sur le CPU en ce moment |
| Bloqué | Attend une ressource externe (E/S, verrou, signal) |
| Terminé | Exécution finie, en attente d'être "nettoyé" (zombie) |
Ordonnancement
L'ordonnanceur (scheduler) décide quel processus prêt s'exécute. Stratégies courantes :
FIFO (First In, First Out)
→ Simple mais injuste si un processus est très long
Round Robin (tourniquet)
→ Chaque processus a un quantum de temps (ex: 10ms)
→ À la fin du quantum, le suivant prend la main
→ Équitable, temps de réponse garanti
Priorité
→ Chaque processus a une priorité
→ L'ordonnanceur choisit toujours le plus prioritaire
→ Risque de famine pour les processus bas priorité
Interblocage (Deadlock)
Deux processus s'attendent mutuellement indéfiniment car chacun détient une ressource dont l'autre a besoin.
P1 détient R1, attend R2
P2 détient R2, attend R1
→ Deadlock ! Aucun ne peut avancer.
Conditions nécessaires (Coffman, 1971) :
1. Exclusion mutuelle : une ressource ne peut être utilisée
que par un seul processus à la fois
2. Rétention et attente : un processus peut garder ses
ressources en attendant d'autres
3. Pas de préemption : on ne peut pas forcer un processus
à libérer ses ressources
4. Attente circulaire : P1 attend P2, P2 attend P1...
💾 Mémoire
Hiérarchie mémoire
| Niveau | Taille typique | Vitesse | Volatil |
|---|---|---|---|
| Registres CPU | quelques Ko | < 1 ns | Oui |
| Cache L1/L2/L3 | Ko à Mo | 1–10 ns | Oui |
| RAM | 4–64 Go | ~50–100 ns | Oui |
| SSD/NVMe | 256 Go – 2 To | ~100 µs | Non |
| HDD | 1–10 To | ~10 ms | Non |
Mémoire virtuelle
Chaque processus croit avoir accès à tout l'espace d'adressage
(ex: 0 à 2^64 - 1 sur un système 64 bits).
L'OS fait la translation adresse virtuelle → adresse physique
via la MMU (Memory Management Unit).
Pages (généralement 4 Ko) :
- Si la page est en RAM : accès direct
- Si la page est sur disque : "page fault" → chargement (lent !)
🚨 Pièges classiques au bac
La RAM est volatile (s'efface à l'extinction). Le disque (SSD/HDD) est persistant. Un programme tourne en RAM, ses fichiers sont sur disque.
Sur 8 bits,
10000000 = -128 (pas -0). Le bit de poids fort est le bit de signe, mais il a aussi une valeur (-128).
Unicode est un standard d'encodage des caractères (attribue un numéro à chaque caractère). UTF-8 est une représentation d'Unicode sur des octets (1 à 4 octets par caractère).
Un programme est un fichier statique sur disque. Un processus est l'exécution de ce programme en mémoire. Plusieurs processus peuvent exécuter le même programme simultanément.
📝 Exercices
Exo 1 — Conversions binaires
Convertir les valeurs suivantes :
- 42 en binaire (sur 8 bits)
- 0b11001010 en décimal
- 0xFF en décimal
- -7 en complément à 2 sur 8 bits
1. 42 = 32+8+2 = 00101010₂
2. 11001010₂ = 128+64+8+2 = 202₁₀
3. 0xFF = 15×16 + 15 = 255₁₀
4. -7 sur 8 bits :
7 = 00000111
Inverser : 11111000
+1 : 11111001 → c'est -7 ✅
Vérif : 00000111 + 11111001 = 100000000 (overflow ignoré → 0)
Exo 2 — Ordonnancement Round Robin
Trois processus arrivent au temps t=0 avec les durées suivantes : P1=5ms, P2=3ms, P3=4ms. Quantum = 2ms. Donner l'ordre d'exécution et calculer le temps de complétion de chaque processus.
t=0 : P1 s'exécute 2ms → P1 reste 3ms
t=2 : P2 s'exécute 2ms → P2 reste 1ms
t=4 : P3 s'exécute 2ms → P3 reste 2ms
t=6 : P1 s'exécute 2ms → P1 reste 1ms
t=8 : P2 s'exécute 1ms → P2 TERMINÉ à t=9ms
t=9 : P3 s'exécute 2ms → P3 TERMINÉ à t=11ms
t=11 : P1 s'exécute 1ms → P1 TERMINÉ à t=12ms
Résumé :
P1 : terminé à t=12ms
P2 : terminé à t=9ms
P3 : terminé à t=11ms
Exo 3 — Deadlock
Deux processus P1 et P2 partagent deux ressources R1 et R2. P1 a acquis R1 et demande R2. P2 a acquis R2 et demande R1. Expliquer pourquoi il y a deadlock et proposer deux solutions pour l'éviter.
Deadlock : P1 attend que P2 libère R2. P2 attend que P1 libère R1. Aucun ne peut progresser → attente circulaire infinie.
Solution 1 — Ordre d'acquisition : Imposer que toutes les ressources soient acquises dans un ordre global fixé (ex: toujours R1 avant R2). P2 devrait d'abord demander R1, puis R2 — supprimant l'attente circulaire.
Solution 2 — Timeout : Si un processus n'obtient pas une ressource en temps maximal, il libère toutes ses ressources et réessaie plus tard.
Solution 3 — Détection & récupération : L'OS détecte le deadlock (graphe d'allocation) et tue un des processus pour libérer les ressources.
📌 Fiche synthèse
Von Neumann
- UC + UAL + RAM + E/S reliés par bus
- Cycle : Fetch → Decode → Execute
- PC pointe toujours sur la prochaine instruction
Binaire
- 1 octet = 8 bits = 2 chiffres hex
- Complément à 2 : inverser + 1
- UTF-8 : 1 à 4 octets, compatible ASCII
Processus
- États : Nouveau → Prêt → Actif → Bloqué → Terminé
- Round Robin : équitable, quantum de temps
- Deadlock : 4 conditions de Coffman
Mémoire
- Hiérarchie : Registres → Cache → RAM → Disque
- RAM = volatile, Disque = persistant
- Mémoire virtuelle : adresses virtuelles → physiques
🧠 QCM
Choisissez le nombre de questions et le niveau, puis lancez.