Modèle d'architecture d'un ordinateur
=====================================
<img class="r-stretch centre image-responsive" src="https://upload.wikimedia.org/wikipedia/commons/8/84/Von_Neumann_architecture.svg" alt="un switch" width="300">
<p class="legende">
<small>
<strong>Schématisation de l'architecture de von Neumann.</strong>
<br>Crédits : <a href="https://commons.wikimedia.org/wiki/File:Von_Neumann_architecture.svg">Chris-martin, Aeroid</a>, <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0</a>, via Wikimedia Commons
</small>
</p>
<div markdown="1">
<small>
*Ce document a été créé en collaboration avec Claude AI (modèle Claude Sonnet 3.5, version du 10/09/2024), qui a été utilisé pour transposer le cours correspondant (accessible [ici](modele-archi)) en un diaporama. Pour voir la conversation [cliquez ici](https://aiarchives.org/id/DtWQGSEUvViTF0VHxWQb-p).*
</small>
</div>
---
# Architecture de von Neumann
----
## Architecture de von Neumann
- Grands principes de fonctionnement des ordinateurs actuels résultent de travaux milieu des années 1940
- **Architecture de von Neumann** : modèle de fonctionnement des ordinateurs publié en 1945
- John von Neumann : mathématicien et physicien (et bien d'autres choses) américano-hongrois
<img class="r-stretch centre image-responsive" src="data/JvN.jpg" width="300">
<div>
<small class="legende">
<strong>John von Neumann (1903-1957)</strong>
<br>Crédit : <a href="https://commons.wikimedia.org/wiki/File:JohnvonNeumann-LosAlamos.jpg" target="_blank">© Los Alamos National Laboratory</a>, via Wikimedia Commons.
</small>
</div>
----
> <i class="fa-solid fa-circle-info"></i> Les travaux de von Neumann concernaient la conception de l'[EDVAC](https://fr.wikipedia.org/wiki/Electronic_Discrete_Variable_Automatic_Computer).
> * Ordinateur capable d'additionner, soustraire, multiplier et diviser en binaire
> * Capacité mémoire : 5.5 ko... / Taille : 45 m² ... / Poids : 8 tonnes ...
> * Il fallait 3 équipes de 30 personnes pour le faire fonctionner en continu
<img class="r-stretch" src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/4e/EDVAC.png/462px-EDVAC.png?20060906071323">
----
# ✏️ À faire
**Activité 1 : Composants d'un ordinateur**
<img class="r-stretch centre image-responsive" src="data/Personal_computer.svg" style="max-width=512px;">
<div class="legende">
<small>
<strong>Fig. 2 - Les composants d'un ordinateur</strong>
<br>Crédit : <a href="https://commons.wikimedia.org/wiki/File:Personal_computer,_exploded_4.svg">Gustavb</a>, <a href="http://creativecommons.org/licenses/by-sa/3.0/">CC BY-SA 3.0</a>, via Wikimedia Commons
</small>
</div>
----
## Principe de l'architecture
- Idée majeure : utiliser une **zone de stockage *unique*** pour les programmes **et** les données
- 4 parties principales :
- **Unité arithmétique et logique** (UAL) : effectue les opérations de base (+, -, ..., opérations logiques)
- **Unité de contrôle** (UC) : chef d'orchestre de l'ordinateur
- **Mémoire** : contient les programmes ET les données
- **Dispositifs d'entrée-sortie** : pour communiquer avec l'extérieur
----
## Schéma de l'architecture de Von Neumann
<img class="r-stretch" src="data/archiVN.svg" width="500">
> Le **CPU** (processeur) regroupe l'**UAL** et l'**UC**
----
### Unité de contrôle
<img class="r-stretch" src="data/archiVN.svg" width="500">
- **Rôle** : Récupère les instructions du programme en mémoire et les données nécessaires et les envoie à l'UAL
- Contient des registres (= mémoires internes très rapides) :
- Registre d'instruction (IR) : contient l'instruction courante à exécuter
- Compteur de programme (PC) : indique l'adresse de la prochaine instruction
----
### Unité arithmétique et logique
<img class="r-stretch" src="data/archiVN.svg" width="500">
- **Rôle** : Effectue tous les calculs (arithmétiques et logiques)
- Contient :
- Des registres de données dont l'**accumulateur** : registre où s'effectuent tous les calculs
- Circuits électroniques pour opérations arithmétiques, logiques, comparaisons et déplacements mémoire
----
### Mémoire
<img class="r-stretch" src="data/archiVN.svg" width="500">
- **Rôle** : stocker à la fois les programmes et les données
- Composée de :
- circuits mémoires organisés en cases mémoires
- chaque case possède une adresse unique
----
### Dispositifs d'entrée-sortie
<img class="r-stretch" src="data/archiVN.svg" width="500">
- **Rôle** : communiquer avec le monde extérieur
- Périphériques :
- d'entrée
- de sortie
- certains appartiennent aux deux familles
---
# Le langage machine
----
## Le langage machine
- Suite de nombres binaires représentant des **instructions machine** :
```
0110000001000001
```
- Seul langage compris par le processeur
- Structure d'une instruction machine :
- Champ **code opération** : indique l'opération à effectuer
- Champ **opérandes** : spécifie les données sur lesquelles s'appliquent l'opération
| champ code opération | champ opérandes |
|----------------------|-----------------|
| 0110000 | 001000001 |
---
## Le langage assembleur
- Langage de plus bas niveau lisible par l'humain
- Correspond directement aux instructions machine
- Exemple :
```plaintext
MOV R0,#2
MOV R1,#7
ADD R1,R0,R1
STR R1,21
HLT
```
----
### Simulateur RISC
- On va utiliser le simulateur RISC de Peter Higgison : https://peterhigginson.co.uk/RISC/
- Le jeu d'instructions possibles est disponible ici : http://www.peterhigginson.co.uk/RISC/instruction_set.pdf
<img class=" r-stretch centre image-responsive" src="data/risc.png" alt="capture d'écran simulateur RISC">
----
### Exemples d'instructions
<div style="font-size:0.6em">
| Instruction en assembleur | Signification |
|---|---|
| LDR R1,12 | Charge dans le registre R1 la valeur stockée à l'adresse mémoire 12. |
| STR R3,125 | Stocke la valeur du registre R3 en mémoire vive à l'adresse 125. |
| ADD R1,#128 | Additionne le nombre 128 (une valeur immédiate est identifiée grâce au symbole #) et la valeur stockée dans le registre R1, stocke le résultat dans le registre R1. |
| ADD R0,R1,R2 | Additionne la valeur stockée dans le registre R1 et la valeur stockée dans le registre R2, stocke le résultat dans le registre R0. |
| SUB R1,#128 | Soustrait le nombre 128 de la valeur stockée dans le registre R1, stocke le résultat dans le registre R1. |
| SUB R0,R1,R2 | Soustrait la valeur stockée dans le registre R2 de la valeur stockée dans le registre R1, stocke le résultat dans le registre R0. |
| MOV R1,#23 | Place le nombre 23 dans le registre R1. |
| MOV R0,R3 | Place la valeur stockée dans le registre R3 dans le registre R0. |
| HLT | Arrête l'exécution du programme. |
</div>
----
### Exemples d'instructions (suite)
- Programme Python
```python
a = 2
b = 7
c = a + b
```
- Écriture en assembleur
```plaintext
MOV R0,#2
MOV R1,#7
ADD R1,R0,R1
STR R1,21
HLT
```
> <i class="fa-solid fa-circle-question"></i>
> Quels sont les états des registres à la fin du programme ?
> Où est stockée la valeur de la variable `c` à la fin du programme ?
----
### Conversion en langage machine
- Correspondances données dans le [jeu d'instructions](http://www.peterhigginson.co.uk/RISC/instruction_set.pdf)
- Les trois premiers caractères assembleur (MOV, ADD, STR, etc.) correspondent au **code opération**
- Après l'espace, on a les **opérandes** (séparées par des virgules)
- Le code précédent
```plaintext
MOV R0,#2
MOV R1,#7
ADD R1,R0,R1
STR R1,21
HLT
```
se traduit ainsi en langage machine :
<div style="font-size:0.65em">
```plaintext
0010100000000010 0010100100000111 0110000001000001 1110001000010101 0000000000000000
```
</div>
----
### Conversion en langage machine (suite)
**Pourquoi ?**
<table class="tg first-column-not-bold" style="border-collapse:collapse;border-spacing:0;margin:auto;font-size:0.8em;">
<thead>
<tr>
<td style="font-weight:bold; text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;">
Instructions machine
</td>
<td style="font-weight:bold; text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;">
Correspondance
</td>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">00101</span><span style="color:#0C69B2;">000</span><span style="color:#1DB20C;">00000010</span>
</td>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">MOV</span> <span style="color:#0C69B2;">R0</span>,<span style="color:#1DB20C;">#2</span>
</td>
</tr>
<tr>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">00101</span><span style="color:#0C69B2;">001</span><span style="color:#1DB20C;">00000111</span>
</td>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">MOV</span> <span style="color:#0C69B2;">R1</span>,<span style="color:#1DB20C;">#7</span>
</td>
</tr>
<tr>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">0110000</span><span style="color:#0C69B2;">001</span><span style="color:#1DB20C;">000</span><span style="color:#FF8402;">001</span>
</td>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">ADD</span> <span style="color:#0C69B2;">R1</span>,<span style="color:#1DB20C;">R0</span>,<span style="color:#FF8402;">R1</span>
</td>
</tr>
<tr>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">1110</span><span style="color:#0C69B2;">001</span><span style="color:#1DB20C;">000010101</span>
</td>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">STR</span> <span style="color:#0C69B2;">R1</span>,<span style="color:#1DB20C;">21</span>
</td>
</tr>
<tr>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">00000</span><span>00000000000</span>
</td>
<td style="text-align:left;border-color:black;border-style:solid;border-width:1px;
overflow:hidden;padding:5px 5px;word-break:normal;background-color:white;font-family:'Consolas';font-size:1.1em;">
<span style="color:#EF2E4B;">HLT</span>
</td>
</tr>
</tbody>
</table>
> On peut le voir en copiant le code assembleur dans le simulateur (il faut choisir l'option *binary* pour les mots en binaire en mémoire)
----
## Cycle d'exécution
- Le CPU possède une **horloge** qui définit le rythme auquel les instructions sont exécutées.
- Un **cycle d'exécution** s'effectue en 3 étapes :
1. **Chargement** (load) : récupération de l'instruction depuis la mémoire (adresse indiquée dans registre **PC**) vers le registre **IR**
2. **Décodage** : interprétation de l'instruction du registre **IR** pour savoir ce qu'il faut faire (peut nécessiter la lecture d'autres mots binaires depuis la mémoire ou les registres)
3. **Exécution** : réalisation de l'opération demandée par l'UAL ou l'UC
> <i class="fa-solid fa-gauge-high"></i> Un CPU fréquencé à 3.2 GHz peut effectuer 3.2 milliards de cycles d'horloge par seconde
---
# Architecture actuelle
----
## Architecture actuelle
<img class="r-stretch" src="data/archiVN_actuelle.svg" width="500">
- Toujours basée sur le modèle de von Neumann
- Évolutions principales :
- Entrées-sorties contrôlées par des processeurs autonomes
- Ordinateurs multiprocesseurs (↗ de la puissance globale sans ↗ la vitesse des processus individuels)
- La mémoire devient le centre de l'architecture, degré de parallélisme plus élevé
---
# Bilan
- Ordinateurs actuels basés sur le modèle de von Neumann
- 4 parties principales : UAL, UC, mémoire, dispositifs d'E/S
- Processeur exécute des instructions en langage machine (= mots binaires décomposés en : champ *code opération* + champ *opérandes*)
- Langage assembleur : langage de plus bas niveau lisible par un humain
- Tout programme doit être converti en langage machine pour être exécuté
---
#### Références
- Equipe pédagogique DIU EIL, Université de Nantes.
- Article Wikipédia sur l'[Architecture de von Neumann](https://fr.wikipedia.org/wiki/Architecture_de_von_Neumann)
- Livre *Spécialité Numérique et sciences informatiques : 30 leçons avec exercices corrigés - Première*, éditions Ellipses, T. Balabonski, S. Conchon, J.-C. Filliâtre, K. Nguyen : [http://www.nsi-premiere.fr/](http://www.nsi-premiere.fr/).
- Livre *Informatique et Sciences du Numérique* de Gilles Dowek en téléchargement libre : [ici](https://wiki.inria.fr/wikis/sciencinfolycee/images/a/a7/Informatique_et_Sciences_du_Num%C3%A9rique_-_Sp%C3%A9cialit%C3%A9_ISN_en_Terminale_S._version_Python.pdf)
- Cours de David Roche sur le [Modèle d'architecture de von Neumann](https://pixees.fr/informatiquelycee/prem/c8c.html)
- Article [Le modèle d’architecture de von Neumann](https://interstices.info/le-modele-darchitecture-de-von-neumann/) sur le site interstices.info.
- Wikilivre sur les [composants d'un processeur](https://fr.wikibooks.org/wiki/Fonctionnement_d%27un_ordinateur/Les_composants_d%27un_processeur).
---
Germain BECKER, Lycée Mounier, ANGERS
CC BY-SA
![Licence Creative Commons](https://i.creativecommons.org/l/by-sa/4.0/88x31.png)