Cours issu de : https://www.numerique-sciences-informatiques.fr/coursVonNeumann.php
Turing est né le 23 juin 1912. C'est un scientifique Britanique considéré aurjourd'hui comme le "père de l'informatique". En 1936, il rédige la "Théorie des nombres calculables, suivie d’une application au problème de la décision ». Son, idée: une machine peut calculer différentes tâches toute seule si on lui indique précisément comment procéder. La "machine de Turing" est une machine abstraite. C'est un ruban infini sur lequel se déplace une tête de lecture qui peut lire, écriture se déplacer vers la droite ou la gauche et agir en fonction de ce qui est lu. La tête de lecture possède un nombre fini d'états et réagit en fonction de son état à ce qui est lu. C'est ce qui permet de programmer la machine de Turing. Nous verrons un exemple plus loin.
Plus tard, en 1950, une fois les premiers ordinateurs construits, Turing invente le "test de Turing", un test d'intelligence artificielle. Le principe du test: si un humain et un ordinateur communiquent, un juge humain n'est pas capable de discerner l'homme de la machine. Ce test est inspiré d'un jeu d'imitations où un homme et une femme communiquent dans des pièces séparées et les personnes qui conversent avec eux doivent deviner qui est la femme alors que l'homme essai de se faire passer pour une femme.
Un exemple simple de programme sur la machine de Turing. Inverser indéfiniment les 0 et les 1 d'un nombre. La machine démarre à gauche du nombre. État 1: elle va vers la droite et démarre le programme en se plaçant en état 2. En état 2, la machine remplace les 0 par des 1 et inversement. Si la case est vide cela veut dire qu'il faut repartir à l'envers, c'est l'état 3, etc....Voici la table d'actions :
Voici un lien très intéressant pour comprendre et observer une machine de Turing
En 1936, Alan Turing imagine une machine universelle capable de simuler n'importe quelle machine de Turing. La machine universelle ne peut réussir cela qu'en lisant sur son propre ruban la description de la machine à simuler et ses données d'entrées.
On peut considérer que cette machine virtuelle est l'origine de l'ordinateur tel qu'on le connait aujourd'hui. C'est John Von Neumann qui va donner concrètement naissance à l'ordinateur en décrivant un modèle pour l'ordinateur: l'architecture de Von Neumann.
L'idée est de stocker dans un même endroit le programme ET les données: la mémoire. Ce qui n'était pas le cas avec les machines construites entre 1937 et 1945 puisqu'elles nécessitaient d'être programmées en câblant un tableau de connexion (L'Eniac par exemple).
Les premières machines à programme enregistré sont construites en Angleterre en 1949: L'EDASAC (eletroniqc Delay Storage Automatic Calculator) et le Mark1.
Voici le schéma, toujours d'actualité, de l'architecture de Von Neumann (le MBR=memory buffer register contient les données/instruction à être stockées/lu on l'appelle aussi MDR: memory data register. Le MAR (memory adress register): registre contenant l'adresse de la mémoire où sera stocké la donnée).
Notez que puisque le programme et les données ne sont pas séparées, un programme peut très bien effacer son propre programme !
L'unité arithmétique et logique (UAL ou ALU en anglais) et l'unité de commande sont à l'intérieur du processeur et communiquent avec la mémoire par trois bus : le bus d'adresse, le bus de contrôle et le bus de données.
L'unité de contrôle (appelé aussi séquenceur, unité de commande) gère le processeur. Elle décode les instructions, choisit les registres(petites mémoires internes 64bits sur un pc 64 bits) à utiliser et assure la communication avec les entrée-sortie, la mémoire. En particulier le registre du compteur ordinal CO et le registre d'instruction RI qui contiennent respectivement l'adresse mémoire de la prochaine instruction et l'instruction en cours de traitement. Elle utilise aussi les registre ACC accumulateur qui stocke les opérandes intermédiaires et CC le code condition pour les instructions conditionnelles qui vont donc impliquer un saut dans la mémoire en fonction de la condition.
L'UAL est la partie qui effectue les calculs. A minima, sur les entiers, elle effectue les opérations arithmétiques de base, les opérations logiques (ou, et, complément à 1 etc), les comparaisons. Certaines ALU sont spécialisées et permettent de faire des calculs à virgule flottante, d'autres encore plus spécialisées implémentent des fonctions mathématiques ou calculs vectoriels. Il peut y avoir plusieurs ALU dans un processeur et peuvent alors fonctionner en parallèle.
Voici ci dessous ce qu'il se passe indéfiniment dans votre ordinateur. Il lance un cycle fetch pour chercher l'instruction à l'adresse demandée et se place le CO à la prochaine instruction. Ensuite il décode l'instruction, l'envoie à l'ALU qui fait soit des calculs, soit des comparaisons. L'ALU renvoie soit une nouvelle adresse au CO, soit des résultats dans un type de sortie (mémoire, periphérique externe,...)
L'ALU va soit écrire le résultats dans un registre, dans la mémoire principale, ou vers un périphérique externe. L'ALU peut aussi modifier le CO s'il a traité une condition.
La fréquence du processeur (aujourd'hui 3Ghz en moyenne soit 3 milliards de fois par secondes) donne un signal régulier pour synchroniser le fonctionnement du processeur. A chaque impulsion, une étape est faite (il y en a 5, on appelle cet ensemble pipelines). Une astuce utilisée depuis les processeurs 486 pour gagner en vitesse et de ne pas attendre la fin d'un cycle pour démarrer le suivant! Cela n'est pas aussi évident qu'il n'y parait puisque l'on peut avoir un saut en fin de cycle !
Une autre alternative apparue sur le Pentium 4 est l'hyperthreading qui simule deux processeurs en effectuant des tâches en parallèle.
On comprend donc que la machine ne sait pas faire grand chose à l'allumage! Additionner, comparer, mettre en mémoire et lire en mémoire...avec ces quelques instructions, on va pouvoir coder le bios, puis un système d'exploitation et des logiciels! Ce langage s'appelle le langage machine. Les instructions vont se suivre les unes après les autres, d'où le nom d'architecture séquentielle. Nous utiliserons le programme qui simule l'architecture de Von Neumann à l'adresse cliquer ici.
Que ce soit, un téléphone, un ordinateur ou même aujourd'hui une télévision. Tous respectent l'architecture de Von Neumann. Cela se matérialise par une carte mère qui contient le processeur, une mémoire ram pour stocker les programmes en cours d’exécution, et des slots pour ajouter des extensions: carte son, carte vidéo, disques durs (connecté par câble et non sur les slots).
Il ne faut pas confondre les différents types de mémoires !
Une architecture monoprocesseur est une architecture ne comprenant qu'un seul processeur. De 1973 à 2004, la loi de Moore a continué d'être vérifiée par l'augmentation de la fréquence des processeurs. Le premier processeur produit par Gordon Moore était cadencé à 0,74 MHz et 2300 transistors, en 1995 le Pentium pro est à 150/200 MHz et 5,5 millions de transistors. En 2003 le Pentium M a une centaine de millions de transistors et tourne à 2,2GHz.
L'augmentation de la fréquence devenant techniquement de plus en plus difficile (problème de surchauffe), une nouvelle idée permet de poursuivre la loi de Moore : mettre plus de processeurs dans un seul pc.
Quels sont les problèmes qui apparaissent avec l'augmentation de la fréquence et la multiplication du nombre de processeurs ? La mémoire avec qui le processeur est en communication constante ! La fréquence des processeurs est plus rapide que l’accès à la mémoire, c'est pour cela que l'on utilise la mémoire cache qui permet de stocker des résultats que l'on espère réutiliser plus vite. La multiplication des cœurs pose le problème de la synchronisation de la mémoire ! Il existe plusieurs stratégies pour répartir la mémoire cache de chaque processeur. Soit le cache est commun à tous les processeurs et leur contenu est donc à jour, soit chaque processeur à un cache dédié. Le cache partagé peut entrainer des conflits entre différents programmes et le temps d'accès est plus long.
Aujourd'hui la solution retenue est l'architecture hybride ! Le schéma ci-dessous illustre cette solution et vous présente par la même occasion le cache de niveau 1 et le cache de niveau 2.
Le calcul Booléen fut développé par le mathématicien Britannique George Boole en 1854. Nous reviendrons sur les propriétés algébriques du calcul booléens plus tard. En 1938, Claude Shannon fait le lien entre l'algèbre de Boole et des composants électriques. C'est le début de l'ère de l'électronique numérique.
Nous avons déjà appris les opérateurs logiques !
Les tables de vérité décrivent les différents opérateurs logiques. Ces tables peuvent aussi être traduites en équation et en chronogramme. La table reste le plus simple pour débuter. Ces opérateurs logiques sont représentés par des symboles dans les circuits électroniques. Malheureusement deux normes de symboles coexistent, la norme européenne avec des rectangle (symbole IEC) et une étiquette logique, la norme américaine : symbole ANSI, très répandue, avec des formes différentes par type d'opération.
Voici les différentes portes logiques :
A partir des opérateurs logiques précédents, on peut constituer des circuits logiques. A noter que l'on peut tous les réaliser en utilisant uniquement des portes NAND, ou NOR (déjà vu en TP).