Tour de l'ordinateur: architecture Von Neumann

EDIT: Voila le premier chapitre de ma nouvelle série de cours en informatique

1. Architecture Von Neumann

Il y a trois grands penseurs de l'informatique moderne, en l'occurrence Alan Turing, John Von Neumann et Claude Shannon. Nous allons parler des travaux de Von Neumann qui ont posé la base de l'ordinateur dans sa conception théorique.

Dans un article fondateur de 1936 On computable numbers, with an application to the entscheidungsproblem, Alan Turing, définit précisément la notion de calcul et la relie à l’exécution d’un algorithme par une machine imaginaire qui servira de modèle aux ordinateurs modernes. En même temps qu’il fonde l’informatique comme science, il en pose les limites avec l’exemple de fonctions non calculables, comme le problème de l’arrêt : on ne saurait construire un programme général capable de prouver la terminaison de n’importe quel programme. En 1937, Claude Shannon démontre comment il est possible d’effectuer des calculs à l’aide de l’électricité avec des relais électromagnétiques en prolongeant les travaux du logicien Geoges Boole. Il explique comment construire un additionneur à quatre chiffres binaires qu’il désigne pour la première fois sous le terme de bit pour binary digit.

Un ordinateur est une machine programmable, automatique et universelle :

  • programmable : la séquence d’opérations exécutée par un ordinateur peut être entièrement spécifiée dans le texte d’un programme ;
  • automatique : un ordinateur peut exécuter un programme sans intervention extérieure (câblage . . .);
  • universelle : un ordinateur peut exécuter tout programme calculable (selon la théorie de Turing) avec le jeu d’instructions câblé dans son processeur.

En 1945, John von Neumann, mathématicien hongrois exilé aux États-Unis, publie un rapport sur la réalisation du calculateur EDVAC où il propose une architecture permettant d’implémenter une machine universelle, décrite par Alan Turing dans son article fondateur de 1936 sur le problème de l’indécidabilité. L’architecture de Von Neumann va servir de modèle pour la plupart des ordinateurs de 1945 jusqu’à nos jours, elle se compose de quatre parties distinctes :

  1. L’Unité Centrale de Traitement (Central Processing Unit en anglais) ou Processeur est constituée de deux sous-unités :
    • L’Unité de Commande charge la prochaine instruction dont l’adresse mémoire se trouve dans un registre appelé Compteur de Programme (PC en anglais) ou Compteur ordinal, la décode avec le décodeur et commande l’exécution par l’ALU avec le séquenceur. L’instruction en cours d’exécution est chargée dans le Registre d’Instruction. L’Unité de Commande peut aussi effectuer une opération de branchement, un saut dans le programme, en modifiant le Compteur de Programme, qui par défaut est incrémenté de 1 lors de chaque instruction.
    • L’Unité Arithmétique et Logique (ALU en anglais) qui réalise des opérations arithmétiques (addition, multiplication . . .), logiques (et, ou . . .), de comparaisons ou de déplacement de mémoire (copie de ou vers la mémoire). L’ALU stocke les données dans des mémoires d’accès très rapide appelées registres. Les opérations sont réalisées par des circuits logiques constituant le jeu d’instructions du processeur.
  2. La mémoire où sont stockés les données et les programmes.
  3. Des bus qui sont des fils reliant le CPU et la mémoire et permettant les échanges de données et d’adresses. Les adresses, les données et les commandes circulent par les bus. Un bus ne peut être utilisé que par deux composants (émetteur/récepteur) à la fois
  4. Des dispositifs d’entrées/sorties permettant d’échanger avec l’extérieur (lecture ou écriture de données).

Dans le modèle de Von Neumann, le processeur exécute une instruction à la fois, de façon séquentielle.

Le cycle d'instruction

L'unité de contrôle est constitué de trois éléments:

  • une horloge qui permet la synchronisation des éléments et des événements
  • un décodeur qui détermine les opérations a exécuter en fonction du code de l’instruction.
  • un séquenceur qui déclenche et coordonne les différentes opérations pour réaliser l’instruction.

Le cycle d’une instruction est constitué d’un cycle de recherche puis d’un cycle d’exécution qui mettent en jeu des échanges entre la mémoire et l’Unité Centrale de Traitement, synchronisés par des signaux périodiques émis par une horloge à quartz. Chaque cycle peut couvrir plusieurs cycles d’horloge.

Les registres impliqués dans chaques cycles d'instruction:

  • Registres d’adresse mémoire (MAR) : Il est connecté aux lignes d’adresse du bus système. Il spécifie l’adresse en mémoire pour une opération de lecture ou d’écriture.
  • Registre de mémoire tampon (MBR) : Il est connecté aux lignes de données du bus système. Il contient la valeur à stocker en mémoire ou la dernière valeur lue dans la mémoire.
  • Compteur de programme (PC) : Contient l’adresse de la prochaine instruction à récupérer.
  • Instruction Register(IR) : Contient la dernière instruction récupérée.

Chaque phase du cycle d’instruction peut être décomposée en une séquence de micro-opérations élémentaires. Dans les exemples ci-dessus, il existe une séquence pour chacun des cycles Fetch, Indirect, Execute et Interrupt .

Nous avons supposé un nouveau registre à 2 bits appelé Instruction Cycle Code (ICC). L’ICC désigne l’état du processeur en fonction de la partie du cycle dans laquelle il se trouve : – 

00 : Cycle d’extraction 
01 : Cycle indirect 
10 : Cycle d’exécution 
11 : Cycle d’interruption 

À la fin de chaque cycle, l’ICC est réglé de manière appropriée. L’organigramme ci-dessus du cycle d’instructions décrit la séquence complète des micro-opérations, en fonction uniquement de la séquence d’instructions et du modèle d’interruption (il s’agit d’un exemple simplifié). Le fonctionnement du processeur est décrit comme l’exécution d’une séquence de micro-opérations.

Cycle de recherche

  • On recupère dans IR l’instruction a exécuter (celle à l’adresse contenue dans PC)
  • On incremente le compteur ordinal PC (compteur programme), qui pointe vers l'instruction qui contient la mémoire de l'instruction en cours d'éxecution.

Cycle d'execution

  • On décode l’instruction
  • Lire les adresses et les registres nécessaires à l’instruction
  • Determiner que faire pour cette instruction
  • Le faire (ou le faire faire) (utilisation d’une unité de calcul)

Les programmes stockés dans la mémoire centrale de l’ordinateur sont constitués d’instructions de bas niveau, exécutables directement par les circuits logiques du processeur. Le jeu d’instructions du microprocesseur est restreint. L’unité de contrôle décode la série de bits composant chaque instruction : les premiers bits forment un code (opcode) qui déclenche l’activation des circuits nécessaires dans l’ALU et les bits suivants portent les opérandes. Un programme nommé compilateur permet de transformer le texte d’un programme en langage de haut niveau (comme Python ou C) en une série d’instructions en langage machine.

Opcode

L'opcode, ou "code opération", fait référence à une instruction machine ou à un code numérique qui représente une opération spécifique à effectuer par le processeur d'un ordinateur. Chaque instruction machine correspond à une opération élémentaire que le processeur peut exécuter, telle qu'une addition, une soustraction, un chargement de données en mémoire, etc.

L'opcode est généralement une séquence de bits dans le langage machine du processeur, et chaque instruction est associée à un opcode unique. L'opcode est une partie essentielle d'une instruction machine complète, qui peut également inclure des opérandes, des adresses mémoire, et d'autres informations nécessaires à l'exécution de l'opération.

Voici un exemple simple pour illustrer le concept d'opcode :

Supposons que nous avons une instruction d'addition en langage machine pour un processeur hypothétique. L'instruction complète pourrait ressembler à ceci :

Opcode : 1010 (hypothétique, à des fins d'illustration) 
Opérandes : Registre A, Registre B

Dans cet exemple, "1010" est l'opcode qui indique au processeur d'effectuer une opération d'addition. Les opérandes "Registre A" et "Registre B" spécifient les données sur lesquelles l'opération doit être effectuée.

En langage assembleur, qui est un langage de bas niveau plus lisible pour les humains, cette instruction pourrait ressembler à quelque chose comme :

ADD RegistreA, RegistreB
  1. Langage Machine :

    • Le langage machine est le langage binaire directement compris et exécuté par le processeur. Chaque instruction est représentée par une séquence de bits spécifique, appelée opcode. Le langage machine est spécifique à l'architecture matérielle du processeur et est souvent difficile à lire et à écrire directement par les humains.
    • Opcode :

    • L'opcode, ou "code opération", est la partie du langage machine qui identifie une opération spécifique à effectuer. Chaque instruction machine est associée à un opcode unique. Par exemple, un opcode peut représenter une addition, une soustraction, un chargement de données en mémoire, etc.

    • Langage Assembleur :

    • L'assembleur est un langage de bas niveau qui utilise des mnémoniques et des symboles compréhensibles par les humains pour représenter les instructions machine. Chaque mnémonique correspond à une instruction spécifique et est associée à un opcode. L'assembleur facilite la programmation de bas niveau en permettant aux programmeurs de travailler avec des instructions plus lisibles que le langage machine brut.