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)