Comment fonctionne l'ordinateur ?

ceci est un complément au cours de "technologie informatique" d'IUP GSI 1ère année à l'IPST. Ce n'est en aucun cas un polycopié du cours, c'est à dire, pour être plus précis, que l'examen portera sur ce qui a été dit en cours, pas sur ce document.

Table des matières : Comment fonctionne l'ordinateur ?

1) fonctionnement interne de base

2) Les 5 générations de langages de programmation

3) La gestion de l'ordinateur

1) fonctionnement interne de base

Vous pouvez voir les documents présentés en cours sur certains points de l'histoire de l'informatique.

L'idée de base a été de représenter par 1 ou 0 le fait qu'il y ait du courant ou non, dans circuit électronique (au départ un "tube à vide" ou un relais, désormais des semi-conducteurs), et de les combiner pour représenter des nombres en binaire (voir ptrau.free.fr/autom/autom07.htm).

Au centre de l'ordinateur : la carte mère :

Pour plus de détails, voir coeur-ordi.htm

CPU (Central Processing Unit) : le processeur. Il commande tout le système. Il sait faire des calculs arithmétiques de base (addition, soustraction, multiplication) mais uniquement sur des nombres entiers, des opérations logiques (et, ou, complément), et tester si le résultat de ces calculs est positif, négatif ou nul. Il sait lire un nombre en mémoire ou dans un port, ou l'écrire (via le bus). Deux grandeurs caractérisent le CPU :

Mémoire centrale : elle est partagée en deux parties :

Les interfaces : ils sont vus par le CPU comme des mémoires, il peut y écrire ou lire des nombres binaires. Ils permettent à la carte mère de dialoguer avec des dispositifs externes nommés "périphériques". En général l'interface est réalisée par une carte électronique, qui reçoit des commandes du CPU, les traite et rend la réponse si nécessaire. Il y en a trois grands types :

Le bus permet de transférer des nombres. Il relie tous ces composants, c'est ce qui fait que lorsque deux d'entre eux dialoguent, les autres doivent attendre. L'ordinateur ne peut de ce fait faire qu'une chose à la fois. Pendant longtemps, l'horloge du processeur cadençait tous les composants. Ils fallait qu'ils soient tous aussi rapides. A la fin des années 80, le PC tournait à 4,77 MHz. Aujourd'hui on peut faire fonctionner un processeur à plusieurs Ghz, mais pas les mémoires, encore moins les cartes d'interfaces. On va donc prévoir des fréquences différentes, et entre les deux une "zone tampon" appelée "cache". Celui-ci mémorise les informations qui arrivent à grande vitesse pour les transmettre à la vitesse du destinataire. Evidement, quand le cache est plein il prévient l'émetteur qui devra alors soit attendre soit en profiter pour faire quelque chose d'autre. Il y a désormais des caches multiples (cache mémoire, cache disque,...) et différentes fréquences de composants. Vous pouvez insérer par exemple une carte PCI sur tout Pentium, elle fonctionnera toujours à la même vitesse.

2) Les 5 générations de langages de programmation

Comment donne-t-on des ordres à un ordinateur ? Grâce à un programme.

Le CPU va chercher dans la mémoire centrale des "instructions". Chaque action de base que sait faire le processeur est désignée par un "code opération" qui est un nombre (en binaire). C'est ce qu'on appelle le "langage machine". Bien que tous les processeurs soient capables de faire à peu près la même chose, chaque marque voire type a "numéroté" différemment les opérations. Vous ne pourrez donc pas faire tourner un programme PC sur un Mac (sauf si vous avez un émulateur, programme qui pour chaque code op d'un processeur donne son équivalent pour un autre, mais c'est extrêmement lent et limité).

Exemple : sur un PC, je veux ajouter 5 dans la mémoire n° 1234. Ce numéro de mémoire (on dit une "adresse") a trop de chiffres en binaire pour entrer dans un octet, on en utilise deux (le PC met toujours les derniers chiffres en premier). Je note tous les nombres en hexa, en binaire ce serait trop long : lire le contenu d'une mémoire (un octet), et le stocker dans le processeur (dans une "mémoire" nommée accumulateur) est codé A0, ajouter un nombre à l'accumulateur est codé 04, recopier l'accumulateur dans un mémoire est codé A2. Le programme sera donc : A0 34 12 04 05 A2 34 12 et fait 8 octets. C'est ainsi qu'on programmait les premiers ordinateurs (langage de première génération).

Pour simplifier la programmation, on a décidé de donner un nom aux différentes instructions, c'est le langage mnémonique : MOV pour transférer un nombre d'une mémoire, ADD pour additionner, AL pour l'accumulateur,... Voici ce que donne notre programme précédent :

On permet également au programmeur de définir ses propres noms (appelés "identificateurs"). Par exemple on pourrait définir que la mémoire d'adresse 1234 a pour nom "memoire", la première instruction deviendrait MOV AX,memoire.

La traduction d'un programme mnémonique (un peu plus clair pour le programmeur) en langage machine (seul compréhensible par le processeur) s'appelle "assemblage". Par abus de langage, on regroupe sous le nom "assembleur" indifféremment chacun de ces deux langages. J'ai encore mon très vieux cours assembleur, si ça vous intéresse.

Très rapidement, on est passé à une troisième génération de langages : les langages dits "évolués" et "structurés". Ici on a prévu des instructions plus complexes, qui seront traduites en plusieurs codes op. On y a également prévu des types numériques plus complexes (au minimum les réels, appelés aussi flottants). Plutôt que de les numéroter, on nomme les mémoires dont on a besoin (variables), on peut aussi regrouper plusieurs instructions sous un seul nom (sous-programmes). Les deux premiers langages évolués ont été le FORTRAN (FORmula TRANslator) créé pour le calcul scientifique, et COBOL pour les applications de gestion. Puis BASIC, langage volontairement peu puissant mais prévu pour l'initiation à la programmation (les premiers PC se programmaient en basic, les premiers MSDOS étaient livrés avec BasicA, les suivants avec GW-Basic ou QBasic, précurseurs du Visual Basic). Pour l'enseignement de l'informatique de plus haut niveau, on a créé PASCAL. Le C quand à lui, un langage prévu pour les informaticiens, est plus efficace et plus puissant, mais aussi plus complexe. (voir poly langage C poly Pascal poly Fortran77)

La quatrième génération de langages correspond à une organisation du programme non plus sous forme d'une suite ordonnées d'instructions, mais les instructions sont regroupées autour des données les utilisent. Ce sont les langages de bases de données et les langages orientés objets (LOO). Pour ces derniers, de nombreux langages ont été crées, dont par exemple SmalTalk. Mais c'est C++ (voir mon cours C++), pourtant moins bon, qui s'est imposé, car il est compatible avec C, et a permis une migration progressive. Les nouveaux langages créés aujourd'hui ont une syntaxe proche du C++ (voir par exemple mon cours javascript).

Les langages de 5è génération sont ceux de l'intelligence artificielle. Ils ne se sont pas développés autant qu'on le prédisait dans les années 80. Ici, on ne programme plus, mais on donne, progressivement mais en vrac, de la connaissance sur le domaine à traiter, au système de se débrouiller pour l'organiser (sous une forme qui pourrait par exemple approcher notre réseau de neurones) et puiser dans sa base de connaissances ce qui lui permettra de résoudre les problèmes qu'on lui pose. (voir mon résumé Prolog).

3) La gestion de l'ordinateur

Pour éviter de devoir donner des ordres en binaire à l'ordinateur, on a créé pour chaque ordinateur un programme appelé système d'exploitation (OS operating system), qui est lancé au démarrage de l'ordinateur. Il doit connaître comment accéder aux interfaces, attend qu'on lui donne des ordres (on dit lancer une commande) et se débrouille pour les exécuter. Au début, l'OS était spécifique à chaque machine, vendu et maintenu par le fabriquant de l'ordinateur. Il ne prenait en charge que des périphériques du même fabricant (et pas moyen d'échanger une console BULL avec une IBM par exemple). Certains universitaires, lassés de devoir réécrire les programmes pour tous les OS, ont écrit un OS multi-plateforme (Multics puis UNIX), mais longtemps les fabriquants ont refusé de l'implanter, même pour utiliser UNIX il fallait acheter l'OS du constructeur.

Pour éviter de devoir modifier l'OS à chaque modification de périphériques, on en a extrait et figé une partie, qui sait gérer un minimum de périphériques, en général une console en mode texte et le support qui contient le système d'exploitation. Dans les premiers ordinateurs, ce programme était enregistré sur une bande de papier perforée (en binaire) qu'on appelait "bootstrap". Aujourd'hui il est plutôt logé en ROM, sur un PC on l'appelle BIOS (Basic Input Output System), il sait vérifier la mémoire disponible, puis rechercher s'il y a des disques durs (un seul type, IDE, pas les SCSI par exemple) ou une disquette, puis il y recherche un système d'exploitation, le charge en mémoire puis lui passe la main. Il connaît un type de console de base (pour le PC, en mode texte uniquement, mais certains fabriquants y ont incorporé un fond graphique, par ex Compaq).

L'OS lui aussi doit être évolutif. En particulier, si l'on veut permettre de choisir parmi une multitude de périphériques différents, il faut soit que l'OS les connaisse absolument tous, soit qu'on sépare la partie concernant chaque périphérique possible, et que l'OS ne charge que celles qui correspondent à la configuration demandée (c'est le pilote ou driver). Le driver est donc spécifique à un périphérique et un système d'exploitation. Aujourd'hui, les périphériques sont capables de donner leur nom et type, ils sont dits "plug and play", à chaque allumage l'OS va vérifier les composants disponibles, ce qui va rallonger l'initialisation mais pas ralentir le fonctionnement normal. Toute modification importante de la configuration de l'OS ou des périphériques nécessite dont de rebooter l'ordinateur.

Les premiers ordinateurs personnels contenaient un OS minimal, logé en ROM, et contenant en général le langage Basic. Il ne savait que gérer le clavier et l'écran, en mode graphique ou semi-graphique (pavés de couleur), et permettait des jeux au graphisme simplifié. J'en ai trouvé quelques exemples :

 

La seule mémoire de masse disponible était la cassette audio. Puis les OS ont permis de gérer des disques (et disquettes) et se sont appelés DOS (Disk Operating System). Au débuts du PC, le DOS le plus courant était CP/M (on a aussi vu DR-DOS de Digital, PC-DOS d'IBM, QDOS,...) avant l'hégémonie du MSDOS (Microsoft DOS). Il existe même un freeware FreeDOS encore dévellopé actuellement.

Comment gèrent-ils les disques ? Un disque est un ensemble de secteurs, tous étant numérotés. On appelle fichier un ensemble de données, regroupées sous un nom. L'OS doit donc disposer d'une table associant le nom du fichier aux secteurs qu'il utilise (FAT File Allocation Table). Au début, la FAT était écrite sur les premiers secteurs du disque, et était assez limitée. Il a fallu gérer des fichiers de taille variable, et donc stockés sur une suite non continue de secteurs. On a décomposé la FAT en deux parties :

Chaque système d'exploitation a décidé d'une gestion de disque (avec ses avantages et limites). Sous MSDOS, la FAT12 stockait les numéros de secteurs sur 12 bits (donc 4096 secteurs maxi), avec des noms de fichiers de 8+3 caractères. La FAT16 permet 65000 secteurs, la FAT32 beaucoup plus. Depuis Windows 95, une table annexe associe les noms longs au vrai nom d'un fichier (par exemple "program files" pour PROGRA~1). Les différents systèmes d'exploitation ont tous une méthode de gestion des disques (File System FS) différents (FAT16 sous DOS, FAT32 sous Windows, NTFS pour Windows NT, UFS sur d'anciens Unix, ExFS Extended FS, NFS via réseau (network),...). Mais il y a deux grandes classes : les mono et multi-utilisateurs. Un FS multi-utilisateurs connaît le propriétaire de chaque fichier, et peut donc gérer des droits d'accès différents. Sur les FS mono-utilisateur, tout utilisateur (à condition d'avoir pu entrer sur le système) a les mêmes accès aux fichiers.

Si l'on veut pouvoir créer beaucoup de fichiers, il faut prévoir de grosses tables, et donc réserver une grosse partie du disque pour cela (surtout du temps des petits disques). La solution a été de ne créer qu'un petit répertoire, appelé racine (root), et permettre de créer dans un répertoire des fichiers particuliers, nommés sous-répertoire, avec exactement la même structure (pouvant donc contenir des fichiers normaux et des sous-répertoires).

Les disques sont donc gérés de manière arborescente. Windows a choisi d'appeler "poste de travail" la racine de cet arbre. Sous cette racine, uniquement et obligatoirement les disques, notés A:, C:,... Dans ces disques, un répertoire (Windows) contient les commandes du système d'exploitation et ses fichiers de configuration, Program Files regroupe les programmes supplémentaires, Mes Documents les fichiers utilisateur. Sous Unix, la racine est nommée /, les commandes du système sont dans /bin, les fichiers de configuration dans /etc, les programmes supplémentaires dans /usr, les fichiers utilisateurs dans /home. Les disques peuvent correspondre à n'importe quel répertoire (mais tout ce qui est dans le disque est obligatoire dans ou sous ce répertoire). On associe un disque à un répertoire par un montage (mount). Si par exemple on monte /home sur un autre disque (ou une autre partition) que le reste, les utilisateurs, même en saturant leur zone personnelle ne pourront pas saturer le disque système.

Exemple d'arborescence sous Windows98 (PC) et sous Solaris (Station Sun):

Vous pouvez également regarder le document fourni en TD d'IUP1 concernant les systèmes d'exploitation.

Commandes de base d'un système d'exploitation :

  DOS - Telnet vers Windows UNIX
afficher la liste des fichiers (détaillée) DIR /V ls -l
changer de répertoire de travail CD répertoire cd répertoire
remonter à la racine CD \ cd /
effacer un fichier DEL fichier rm fichier
effacer tous les fichiers DEL *.* rm *
créer un répertoire MD répertoire mkdir répertoire
supprimer un répertoire (vide) RD répertoire rmdir répertoire
copier un fichier COPY source dest cp source dest
déplacer (ou renommer) un fichier ou répertoire MOVE src dest mv src dest
copier un répertoire et ses sous-répertoires XCOPY /S src dest cp -R src dest
gérer les accès aux fichiers ATTRIB chmod
aide sur une commande commande /? man commande

Pour plus de détails sur les commandes Unix (mais en se limitant aux commandes de base) : les notes d'Hanna Klaudel.

4) Proposition de liens :

En local, mon cours "architecture des ordinateurs et SE". A l'extérieur, je vous conseille le Cours d'Informatique d'Y. Mairesse (le fonctionnement de l'ordinateur, présentation Windows et logiciels Micro$oft courants, le tout simple, progressif, avec des petits exercices). Ou regardez les cours du CMIC (Windows, Word, Excel, PowerPoint...).

 

P. TRAU, ULP - IPST, novembre 2002