Page préc.
Exemples de systèmes d'exploitation |
Fin de page |
Page suiv.
Vie et mort d'un processus |
Dans les années 50, l'entrée des travaux est manuelle, chaque utilisateur ayant pour lui tout seul non seulement l'ordinateur, mais aussi la salle machine, pour une durée moyenne d'environ une heure. Au moyen de cartes perforées contenant du code binaire, il entre d'abord en mémoire le chargeur qui charge lui-même le programme de l'utilisateur en mémoire. C'est au programmeur de gérer complètement ses E/S. Bien entendu, les travaux se succèdent l'un après l'autre.
Aux environs de 1955, le chargeur est devenu le premier programme résident. Il boucle sur les travaux. Le temps moyen de réponse est divisé par deux. Le programmeur dispose d'un jeu de macro-instructions pour les E/S. C'est le système d'exploitation qui prend en charge leur gestion. Les premiers langages apparaissent : Assembleurs, Fortran, ainsi bien sûr que les compilateurs correspondants. La notion d'adresse symbolique apparaît, le compilateur (ou traducteur) générant du code contenant des adresses relatives à l'adresse de début du programme. Les premières bibliothèques de sous-programmes sont mises à la disposition des utilisateurs.
Au début des années 60 apparaissent les premiers "moniteurs d'enchaînement de travaux". Le mode de fonctionnement du centre de calcul change du tout au tout : un opérateur se substitue aux utilisateurs. Il prépare et soumet à l'ordinateur des fournées (batch) de travaux (bacs de cartes), chacune précédée de carte(s) de commande indiquant la nature du travail à effectuer (compilation dans un langage donné, exécution). Il suit sur une console le déroulement et les incidents. L'apparition des mémoires secondaires (tambours, disques, bandes magnétiques) provoque le développement d'une gestion de fichiers. Les programmes (et traducteurs) peuvent y être stockés et appelés. L'utilisateur peut y conserver et y récupérer des données. Les langages (Fortran, Cobol et à un degré moindre Algol) sont largement utilisés (le Lisp fait une entrée très discrète). La technique d'édition de liens est inventée, permettant une plus large réutilisation de modules déjà compilés notion de modularité.
Dans la même période, on s'aperçoit que les performances de l'unité centrale sont très dégradées à cause des E/S. En effet, pendant la lecture d'une carte ou l'écriture d'une ligne sur imprimante, l'U.C. (unité centrale) ne fait rien. Or il y a un écart de vitesse de 1000 à 1 ou plus... Pour résoudre ce problème, on imagine alors de décharger l'U.C. de ce travail. Un autre ordinateur off-line, beaucoup plus simple, est chargé de stocker les trains de travaux qui seront soumis sur bande magnétique, puis d'imprimer les résultats qui ont été provisoirement stockés par l'U.C., aussi sur bande. Le schéma suivant illustre les goulots d'étranglement du système.
Peu de temps après (environ 1965), ce mécanisme évolue vers l'unité d'échange (I'U.E.) qui prend en charge la gestion des E/S pendant que l'U.C. continue l'exécution du code. Le fonctionnement de l'U.E. (ou canal) est le suivant : une U.E. est un processeur capable d'exécuter des E/S de manière autonome, parallèlement au traitement proprement dit. Les deux processeurs communiquent de la façon suivante:
On note l'existence de tampons (buffers) de lecture/écriture. Le programme n'écrit plus directement sur disque ou sur imprimante, mais en mémoire réservée à cet effet. Même chose pour la lecture : les trains de travaux sont chargés préalablement dans le tampon de lecture, et sont donc immédiatement utilisables par l'U.C.
L'année 1964 voit l'apparition de I'IBM 360 qui marque un très important progrès.
Le mécanisme présenté ci-dessus améliore de façon très importante l'efficacité de l'unité centrale, et raccourcit très sensiblement les temps de réponse. Il n'est cependant pas parfait car l'U.C. peut être bloquée si elle attend une information de l'extérieur (interactivité) ou si les E/S sont très irrégulières (saturation des tampons d'E/S). De cette constatation naît la multiprogrammation lorsqu'un programme est bloqué en attente d'E/S, le processeur lui est retiré et un autre programme peut à son tour être exécuté, et ainsi de suite. Le programme arrêté est replacé en fin de la file d'attente :
Le passage d'un programme à l'autre devant être très rapide, cela nécessite que chaque programme soit présent en mémoire. La multiprogrammation consiste donc à placer plusieurs programmes, ou morceaux de programmes, en mémoire simultanément :
Les techniques d'ordonnancement des travaux (scheduling) sont développées. Les problèmes de partage de la mémoire et du processeur doivent être résolus. Les programmes et leurs accès à la mémoire doivent être contrôlés et protégés par le système d'exploitation. De plus apparaît la notion de temps partagé (time sharing) : un programme en cours d'exécution peut perdre l'usage de l'U.C. soit en cas d'attente d'une E/S, soit parce qu'il est resté suffisamment longtemps actif. Pour cela, une horloge produit à des intervalles de temps réguliers (quantum de temps) une interruption dont le traitement passe le contrôle au programme suivant. Cela permet à plusieurs utilisateurs d'être servis pratiquement en parallèle, donc d'avoir l'illusion d'occuper seuls la machine. Les programmes s'enchaînent très rapidement et oscillent continuellement entre la mémoire principale et les mémoires secondaires (disques de grande capacité et de temps d'accès très court). C'est le swapping :
Page préc.
Exemples de systèmes d'exploitation |
Début de page |
Page suiv.
Vie et mort d'un processus |