Chapitre suivantIndex des CoursChapitre 1

Les systèmes d'exploitation

 

I-1. Définition du système d'exploitation

I-1.1. Rappels sur l'architecture des ordinateurs

Les trois éléments essentiels d'un ordinateur sont, du moins pour ce qui nous concerne, le processeur, la mémoire et le dispositif de gestion des entrées-sorties. Ils communiquent entre eux par l'intermédiaire du bus. Schématiquement un ordinateur peut être symbolisé comme suit :



    figure 1.1: schéma de principe d'un ordinateur    


Le bus est le circuit d'échange des informations. Son débit ou bande passante est un paramètre important pour définir la rapidité d'une machine. Souvent, dans les micro-ordinateurs, elle est trop faible par rapport à la rapidité du processeur. Celui-ci attend fréquemment les informations en provenance de la mémoire ou des contrôleurs d'entrées-sorties. Dans le schéma ci-dessus on ne les a pas distingués mais un écran et un disque ne sont pas branchés sur le même contrôleur. Par exemple on trouve les mêmes processeurs PowerPC dans les MacIntoshs et certaines machines RS6000 d'IBM.  La rapidité du bus et sa bande passante ne sont pourtant pas les mêmes, ce qui est une explique des différences de performances comme de prix. Les ordinateurs les plus performants possèdent un bus qui permet de transférer en parallèle 256 bits ou plus, les moins performants 32 bits seulement.  Il faut donc  plus de cycles pour transférer une information de même longueur (c'est à dire contenant le même nombre de bits) de la mémoire vers le processeur et  la rapidité effective de la machine n'a rien à voir avec celle du processeur.

Un processeur moderne peut contenir plusieurs unités de calcul, additionneur, multiplicateur entier ou flottant. Certains peuvent effectuer des opérations plus complexes comme plusieurs additions et  multiplications flottantes simultanément. Le processeur peut donc réaliser plusieurs instructions élémentaires parallèlement. Les plus puissants possèdent une structure, appelée pipe-line qui permet d'enchaîner, dans certains cas, une opération à chaque cycle d'horloge alors que la précédente n'est pas terminée. Ceci accélère considérablement le débit de calcul. Cette complexité explique que la cadence de l'horloge ne permette pas de comparer des processeurs d'architecture différente. Deux directions se font jour pour augmenter les performances: compliquer l'architecture interne du processeur mais conserver un cycle relativement lent (IBM Power 2 à moins de 300 Mhz par exemple) ou diminuer le temps de cycle ( DEC Alpha à plus de 500 MHz par exemple) mais avec une architecture plus simple. Il n'existe pas de meilleur choix: suivant les programmes l'une ou l'autre architecture se révèle la meilleure. Les unités de commande travaillent selon les processeurs sur des mots de   16 bits (Intel 80286), le plus souvent sur 32 bits (Intel 80486, Pentium). Les plus puissants travaillent même sur des mots de 64 bits (IBM Power RISC 2, DEC Alpha...). Il faut aussi savoir que le jeu d'instructions varie fortement d'une réalisation à l'autre : instructions courtes RISC (Alpha, PowerPC...) ou longues (Intel...). Le code d'un langage évolué correspond donc à un nombre plus ou moins grand d'instructions machine et la comparaison des performances est beaucoup plus compliquée que la simple mesure des cycles d'horloge.

Dans les processeurs de bas de gamme on peut ajouter un coprocesseur arithmétique. Celui-ci n'est utile que pour les calculs portant sur les nombres flottants que le processeur de base est incapable d'effectuer sans dérouler un grand nombre d'opérations élémentaires. Il est de plus en plus souvent intégré au processeur.

Un deuxième niveau de mémoire accessible plus rapidement que la mémoire conventionnelle est connue sous le nom de cache-mémoire. Les processeurs modernes   en possèdent, directement intégré dans la puce du processeur. Les communications avec le processeur sont rapides car elles ne passent pas par le bus. Lorsqu'une instruction ou une donnée est contenue dans un cache le fonctionnement du processeur est accéléré car il n'attend plus un transfert. Les ordinateurs les plus rapides comme les Cray ne possèdent pas de caches. La mémoire est construite avec les dispositifs les plus rapides, identiques à ceux utilisés dans les caches des machines ordinaires. Les performances sont optimum mais le coût est absolument prohibitif!

La mémoire est organisée, dans tous les ordinateurs, en groupes de 8 bits appelés octets ou bytes en anglais. Chaque octet possède une adresse numérique. Cependant le quantum manipulé par le processeur est le mot qui regroupe de un à huit octets selon le processeur. Le mot est de deux octets dans les micro-ordinateurs anciens. Les stations de travail Unix utilisent des mots de quatre ou huit octets. Les Superordinateurs CRAY possèdent des mots de huit octets. La mémoire est souvent divisée en bancs qui couvrent une certaine plage d'adresse. Plusieurs bancs peuvent être accédés simultanément et ceci améliore les échanges avec le processeur. En effet le temps d'accès à la mémoire est bien plus long que le temps de cycle du processeur, quatre fois par exemple sur le modèle Cray le plus récent. Multiplier les bancs permet d'échanger plus rapidement plusieurs informations entre le processeur et la mémoire. Chaque octet est accompagné d'un certain nombre de bits qui servent au contrôle d'erreurs et à leur correction lors des échanges. Ce nombre peut atteiur les micro-ordinateurs. La fiabilité, les capacités de fonctionner en environnement dégradé, sont liées à ce nombre. On comprend donc pourquoi, indépendamment de sa rapidité, le prix de la mémoire varie avec les modèles de machines.

Il faut bien distinguer le rôle des différentes mémoires qui existent dans la machine. Les disques ou disquettes servent à stocker l'information permanente. Leur contenu existe toujours même lorsque l'ordinateur n'est plus sous tension. Cependant comme les transferts entre ces périphériques et le processeur supports. Le processeur échange ses informations avec la mémoire uniquement. Pour exécuter un programme il faut donc d'abord le déplacer du support permanent (le disque) vers la mémoire. Ceci est également vrai, comme nous le verrons au chapitre II, pour les gros fichiers de données lues ou crées par le processeur. Il existe un mécanisme caché en deux étapes qui fait obligatoirement transiter les échanges par la mémoire. Cette hiérarchie se retrouve également dans les échanges entre la mémoire et le processeur lorsqu'il existe des caches. Le processeur recherche ses informations d'abord dans ceux-ci. Ceci met en œuvre des algorithmes complexes car il faut savoir gérer les cas où les données recherchées ne s'y trouvent pas. Enfin il faut également considérer le rôle des registres, véritable mémoire interne du processeur. L'utilisateur n'y accède pas directement mais un compilateur de programme bien écrit sait en tenir compte.

En résumé il convient de ne pas confondre la taille de la mémoire qui définit les possibilités logicielles de la machine et la taille des disques qui indique sa capacité à stocker des informations permanentes.

Le couple longueur du mot, longueur du registre d'adresse (ou compteur ordinal) est la première notion de l'architecture physique visible de l'extérieur. En particulier il permet de définir les tailles maximum des programmes et des tableaux. Le troisième paramètre important pour l'utilisateur est la largeur du bus qui définit combien de bits peuvent être transférés en parallèle. La rapidité de travail effective d'une machine y est très sensible.

Les contrôleurs sont construits pour assurer les communications avec les périphériques. Ils sont spécialisés dans leur usage et possèdent leur propre mémoire. Un contrôleur d'écran stocke ainsi une partie des informations qu'il présente à l'utilisateur. Un ou des processeurs auxiliaires présents sur la carte assurent le fonctionnement de base.

Le problème fondamental est de réussir à faire fonctionner cet ensemble, à assurer les échanges d'information entre les différents éléments qui constituent la machine et surtout, du point de vue de l'utilisateur, à dialoguer avec lui. C'est le rôle du système d'exploitation.

A titre d'exemple, voici quelques performances mesurées entre deux machines qui diffèrent essentiellement par leur processeur. La première est équipée d'un Pentium MMX, la seconde d'un Pentium II, tous les deux à 233 MHz. Les disques sont les mêmes ainsi que la mémoire. Le programme de mesure est Wintune 95 et le système d'exploitation Windows 95. Le résultat est intéressant quoiqu'il faille toujours considérer des tests avec la plus extrême prudence.

Test

Pentium MMX

Pentium II

Commentaires

lecture d'un bloc de 32 K octets

225 Mb/s

419 Mb/s

 

Ecriture d'un bloc de 32 K octets

85 Mb/s

209 Mb/s

 

lecture d'un bloc de 4 KB

1173 Mb/s

873 Mb/s

caches probablement inhibés

Ecriture d'un bloc de 4 KB

85 MB/s

1107 kB/s

idem

Que signifie ce test ? Comme l'architecture interne des deux processeurs n'est pas la même ces différences peuvent provenir de la taille des caches (plus grands pour le PII) comme de l'efficacité des instructions. On a cependant le sentiment que le PII ne prend toute son efficacité que lorsque la taille des blocs échangés est suffisamment grande. Et ceci dépend beaucoup des codes des programmes mais aussi de celui du système d'exploitation. Les gains peuvent donc être fort décevants lorsqu'on change de processeur sans se préoccuper des programmes.

I-1.2. Définition du système d'exploitation

Un système informatique doit savoir répondre aux demandes suivantes:

 

q  gestion de l'information: stockage, désignation, recherche, communications... Le stockage comprend la gestion des périphériques. Désignation et recherche sont liées notamment à l'architecture du système de fichiers. Ces notions seront abordées aux chapitres IV et V.

q   

q  préparation et mise au point des programmes

 

q  exploitation des programmes

Conceptuellement si on représente l'ensemble des fonctions d'un système d'exploitation sous forme de couches, on pourrait les décrire comme suit :



    figure 1.2 :

Couches du système d'exploitation    


Le logiciel d'application, celui développé par l'utilisateur ou installé à la demande, comme un traitement de texte, par exemple, utilise des fonctions intrinsèques au système d'exploitation. L'utilisateur y a également accès soit directement soit par l'intermédiaire d'utilitaires livrés avec le système. La machine physique n'est accessible qu'au travers du logiciel de base. Ce schéma n'est pas tout à fait rigoureux. Il est délicat de tracer la limite entre logiciels applicatifs et de base. Un système sophistiqué d'utilitaires de gestion des fichiers comme PCTools pour micro-ordinateurs IBM compatibles est un applicatif car il est ajouté par l'utilisateur. Compris dans la livraison initiale il serait considéré comme logiciel de base !

A l'intérieur même du logiciel de base, on peut distinguer deux couches:

q   

q  Les outils, les services, les compilateurs, éditeurs, communications ...

 

q  Le système d'exploitation

Là encore la distinction n'est pas nette entre certains outils et le système d'exploitation. Les communications peuvent également être considérées comme partie du système.

Les principales fonctions du système d'exploitation peuvent être classées en trois rubriques:

a - La machine virtuelle

q  fonctions de gestion de l'information: structuration, conservation, désignation (mémoire virtuelle, fichiers...). Ceci concerne aussi bien l'information stockée sur les mémoires périphériques que dans celle de l'ordinateur. Nous l'étudierons dans les chapitres IV et V.

q  transferts entre les différents éléments de la machine. Ceci concerne les échanges entre les différentes parties: mémoire, processeur, périphériques... Voir la figure 1.1.

q  fonctions d'exécution: exécution des programmes en parallèle, en séquence... Ceci sera évoqué au chapitre II et III.

b - la gestion et le partage des ressources

  • gestion des ressources physiques: allocation de la mémoire principale et de la mémoire secondaire (fichiers), gestion des organes d'entrées-sorties.
  • partage et échange de l'information entre utilisateurs
  • protection mutuelle entre utilisateurs, sécurité. Voir les chapitres IV et V.

c - les outils d'exploitation

  • compilateurs, aide à la mise au point de programmes (chapitre VI)
  • outils de sauvegarde, d'archivage, traitement des défaillances (chapitre IV).
  • éditeurs, outils divers...

La plupart des utilisateurs ne connaissent que ce troisième niveau. Sa richesse, sa facilité d'emploi, sa souplesse définissent la qualité d'un système d'exploitation du moins pour le non-spécialiste.

I-2. Quelques exemples de systèmes d'exploitation

I-2.1. Ordinateur individuel

Comme son nom l'indique l'ordinateur individuel n'est utilisé, à un moment donné, que par une seule personne. Celle-ci dispose de moyens de communication: écran, clavier, d'une souris, d'une imprimante, éventuellement d'une tablette graphique... Des mémoires secondaires appelées aussi unités de stockage: disque, disquette ou bande magnétique permettent de conserver l'information de façon permanente. La taille de la mémoire principale est un paramètre importante pour définir quels programmes peuvent être employés.

Le système d'exploitation gère cet ensemble de façon plus ou moins transparente pour l'utilisateur. Il permet de donner des ordres à la machine et d'en recevoir en retour des informations qui sont le résultat du traitement demandé. Il n'y a peu de partage des ressources car la personne, devant l'écran, est l'unique usager de la machine. Quelques fonctions peuvent s'exécuter simultanément. Par exemple il est possible d'afficher une horloge tout en utilisant un traitement de textes. Ce parallélisme n'est qu'apparent comme nous le verrons au chapitre III.

L'utilisateur ne peut pas toujours exécuter plusieurs programmes à la fois. Windows 3.1 (ou avant),  MacOs ne le permettent  pas : seul le programme affiché dans la fenêtre active est exécuté.  Windows 95/98 est assez peu efficace.

Le système d'exploitation est simple. Ses possibilités sont limitées. Par exemple il n'est pas prévu de mécanisme de sécurité pour préserver la confidentialité des informations. Toute personne qui met en route la machine peut manipuler n'importe quelle information stockée sur les disques. Des utilitaires de protection peuvent être ajoutés mais comme il ne sont pas intégrés au système d'exploitation il est assez aisé de les contourner. Certains constructeurs tentent de pallier cette déficience en ajoutant une clef qui empêche de mettre la machine sous tension.

I-2.2. Commande de procédés industriels. Temps réel

Un ordinateur qui contrôle un procédé industriel doit veiller sur un ensemble de paramètres physiques et engager des actions en fonction de leurs valeurs. Les délais de réponse peuvent être très courts et doivent être toujours garantis. Ceci est particulièrement vrai en ce qui concerne la sécurité: au cas où certains paramètres sortiraient de leur plage de valeurs normales il est indispensable de réagir de façon appropriée en un temps défini.

Ceci introduit deux contraintes importantes:

  • Les informations doivent être acquises sur les différents dispositifs d'entrés périodiquement. Cette période t doit être respectée précisément ainsi qu'il a été défini dans le cahier des charges. Le traitement de ces informations est effectué en un temps maximum T. Ce temps peut être défini soit port d'entrée par port d'entrée soit pour l'ensemble des mesures à acquérir mais il est évident que le système ne pourra fonctionner correctement que si, dans tous les cas, T est plus petit, voire beaucoup plus petit que t. Nous l'évoquerons au chapitre suivant.
  • Les fonctions de sécurité sont prioritaires, certaines le sont plus que d'autres. Il faut donc disposer des moyens matériels et logiciels pour gérer ces priorités et pouvoir, le cas échéant, interrompre toute activité moins prioritaire.

De tels systèmes sont appelés systèmes temps réel. Certains systèmes d'exploitation peuvent s'en rapprocher, tel Unix, mais sans disposer de toutes les fonctions qui pourraient permettre de garantir les délais de traitement. Il faut les ajouter.

Enfin n'oublions pas que les commandes de processus industriel doivent être particulièrement fiables, en relation avec le niveau de sécurité exigé, ce qui peut nécessiter des dispositifs électroniques et logiques supplémentaires. Dans certains cas plusieurs ordinateurs effectuent le même travail, comparent en permanence leurs résultats et prennent une décision ... à la majorité!

I-2.3. Systèmes transactionnels

La caractéristique fondamentale d'un système transactionnel est de gérer un ensemble d'informations structurées de grande dimension, de l'ordre de plusieurs giga-octets, appelé base de données. Ces informations sont consultées, modifiées simultanément à partir d'un grand nombre de points d'accès, terminaux ou micro-ordinateurs.

Les contraintes d'intégrité sont énormes. L'exécution d'un ordre ou transaction doit préserver la cohérence de la base. Par exemple il est nécessaire d'afficher l'état exact des places disponibles dans un train tout en évitant qu'un siège puisse être réservé plusieurs fois au même moment à partir de deux terminaux différents. Ces systèmes doivent être très fiables puisque leur arrêt, même très court bloquerait un nombre important de personnes. En cas d'interruption du service il faut pouvoir redémarrer les nombreuses activités parallèles de façon cohérente sans perte d'information, dans l'état exact où était le système avant cette interruption.

On mesure les performances en nombre de transactions par secondes (TPS).

I-2.4. Systèmes en temps partagé

L'invention du temps : partagé est le fruit d'une simple constatation: l'homme est beaucoup plus lent que la machine et prend un temps non négligeable pour élaborer une requête ou analyser les réponses de l'ordinateur. Dans toute phase d'interaction la machine attend.

La fonction d'un système temps partagé est donc de donner à tous ces acteurs humains l'impression qu'ils sont chacun seul en face de la machine. Chacun doit avoir le sentiment que l'ordinateur est à sa disposition; la qualité du service sera appréciée en termes de temps de réponse. Il faut donc ajouter les services adéquats pour tenir compte du fait que l'ordinateur est utilisé simultanément par un grand nombre de personnes. On combine donc dans un tel système les aspects évoqués pour les ordinateurs individuels et transactionnels. Il faut ajouter un programme gestionnaire qui partage le temps disponible entre les différents utilisateurs. Par exemple, si on estime que 90% du temps passé devant un terminal est un temps de réflexion indispensable entre requêtes successives, 10% des utilisateurs seulement sont réellement actifs à un moment donné. Si le programme gestionnaire alloue des tranches de temps de 50 ms à chacun, le temps d'attente moyen est donc de 0,5s environ pour ces dix utilisateurs (ce ne sont jamais les mêmes). La machine peut être utilisée en fait par cent personnes.

De tels systèmes ne sont pas adaptés aux travaux qui nécessitent peu de dialogues. On remplace alors le terminal par un ensemble de fichiers utilisés soit en lecture soit en écriture. Ces programmes sont exécutés en traitement par lot ou batch. Leur déroulement est volontairement ralenti par rapport aux taches qui dialoguent avec les hommes. On diminue donc la priorité - déjà évoquée pour les systèmes temps réel - de ces calculs. Les systèmes en temps partagé sont souvent employés pour le temps réel et le transactionnel, en leur ajoutant le cas échéant les quelques fonctionnalités qui leur manquent.

I-3. Evolution des systèmes d'exploitation

I-3.1. Un rapide historique

Les premiers ordinateurs ne possédaient pas vraiment de système d'exploitation. Le moniteur était chargé avec l'unique programme à exécuter. Les entrées-sorties étaient rudimentaires, réduites à un ruban perforé, les programmes écrits en langage machine, c'est à dire directement codés en suite de chiffres, exécutés pas à pas et modifiés directement en mémoire au moyen d'un jeu de clés!

Vers 1950 est apparu le moniteur d'enchaînement. Il permettait l'exécution d'une série de travaux en séquence. C'est l'ancêtre du traitement par lot. Il possédait déjà des fonctions de protection: maximum de temps par travail, supervision des périphériques, protection de la zone mémoire utilisée, gestion et abandon des travaux erronés.

L'informatique moderne naît dans les années 1960:

  • Apparition des processeurs d'entrées-sorties
  • Multiprogrammation, c'est à dire possibilité d'exécuter plusieurs programmes simultanément.
  • Compilateurs
  • Temps partagé
  • Mémoire paginée virtuelle. Elle permet de faire fonctionner un ensemble de programmes dont la taille est supérieure à celle de la mémoire
  • Les communications

I-3.2. Les entrées-sorties

Les échanges entre la mémoire et le processeur sont très rapides. Le débit des périphériques est beaucoup plus lent, surtout lorsqu'il met en oeuvre des éléments mécaniques. D'où l'idée de tampons (ou buffers), zones spéciales de la mémoire réservées au stockage de l'information en attente de transfert. Dans les machines les plus performantes les contrôleurs d'E/S sont de véritables ordinateurs affectés uniquement à cette tâche. 

I-3.3. Multiprogrammation

La multiprogrammation ne doit pas être confondue avec le temps partagé. Un ensemble de programmes est chargé simultanément en mémoire. Leur exécution est chaînée, c'est à dire que le processeur exécute successivement des séquences d'instructions de chacun. Le passage de l'un à l'autre est optimisé de façon à occuper au mieux la partie la plus précieuse de la machine: le processeur. L'unité centrale est affectée à une nouvelle tâche chaque fois qu'un programme est en attente d'échanges, c'est à dire effectue des entrées-sorties.

La commutation des tâches doit être très rapide. Il faut aussi que le débit des échanges entre la mémoire et le processeur soit suffisant pour que ceci ne soit pas le facteur de blocage. La bande passante du bus doit donc être grande.

Un système multitâche est complexe car il faut sauvegarder le contexte de travail de chaque programme lorsque son exécution est interrompue. De plus il n'est pas aisé de se prémunir contre des blocages possibles lorsque toutes les tâches se mettent en attente d'une ressource déjà réservée. Ce problème sera évoqué au chapitre III.3.

I-3.4. Les compilateurs

Un compilateur traduit un programme écrit dans un langage aussi naturel que possible en un code binaire compréhensible par l'ordinateur. Il peut éventuellement optimiser son déroulement. Par exemple, tous les compilateurs savent détecter dans les boucles les instructions qui ne dépendent pas de celles-ci et sont donc répétées inutilement. Ils les déplacent automatiquement. De même ils savent utiliser les jeux de registres du processeur pour minimiser les transferts de et vers la mémoire. Le premier compilateur est apparu en 1961. Il s'agit de Fortran, langage orienté vers le calcul scientifique (FORmulae TRANslation), développé à l'époque dans l'unique but de vérifier s'il était possible d'écrire un tel outil. On sait ce qui est advenu de ce travail qui n'avait au départ aucun but applicatif! Il ne faut pas confondre un compilateur avec un interpréteur - Basic fut le premier - qui lit puis décode chaque instruction successivement au moment de son exécution. Ceci sera évoqué au chapitre VI. 

I-3.5. Mémoire paginée virtuelle

La mémoire virtuelle sera évoquée au chapitre V. Très schématiquement il s'agit d'un dispositif qui permet de simuler la mémoire de l'ordinateur sur un disque (zone de swap), seule la partie active de la mémoire, à un instant donné, résidant dans celle-ci. Ceci permet, à un instant donné, de charger en mémoire des programmes dont la taille totale est supérieure à la mémoire réelle de la machine. Ceci signifie qu'il existe de nombreux échanges entre le disque et la mémoire puisqu'il faut souvent charger des pages de code manquantes. Il faut donc disposer de périphériques et de contrôleurs d'entrées-sorties rapides. 

I-3.6. Les communications

Les années 1980 ont été marquées par le développement des échanges d'informations entre ordinateurs. Les systèmes se sophistiquent jusqu'à faire éclater l'organisation en étoile qui prévalait jusqu'alors: tous les terminaux, tous les périphériques étaient reliés à une machine unique qui centralisait toutes les fonctions.

Les réseaux, en conjonction avec l'effondrement du prix des mémoires et des processeurs et l'augmentation vertigineuse de leur rapidité, vont amener à la notion d'informatique distribuée. Les machines sont déplacées près des hommes. Il apparaît la notion de serveur, machine virtuelle répartie éventuellement sur plusieurs machines physiques, répondant aux requêtes d'utilisateurs distribués géographiquement sur un grand territoire: serveur de fichiers, serveur de calcul, de messagerie... Le réseau devient le bus d'une espèce de machine virtuelle à l'échelle d'un campus ou d'une entreprise.

La demande croissante de puissance fait apparaître les machines multiprocesseurs et les ordinateurs massivement parallèles. Dans tous les cas ceci revient à faire coopérer plusieurs processeurs (de quelques uns à quelques milliers) pour exécuter une ou plusieurs tâches. Le gros problème, loin d'être résolu aujourd'hui, est de faire coopérer cet ensemble. Les machines multiprocesseurs sont limitées par les conflits dans l'accès à une mémoire commune. On montre qu'il est inutile de dépasser quelques dizaines de processeurs dans le meilleur des cas car le gain devient de plus en plus faible et se révèle trop onéreux.

Les ordinateurs parallèles sont des machines où chaque processeur dispose de sa propre mémoire. Le point critique est l'échange des informations entre ces processeurs qui doivent coopérer. Il n'existe pas de compilateur capable de générer automatiquement le code parallèle et leur programmation demande de grands efforts. Ils sont encore largement expérimentaux même si tous les grands constructeurs commencent à en produire.

index des coursChapitre suivant

Révisé le :23-Sep-2007| ©2007 www.technologuepro.com