I. Introduction aux systèmes
d'exploitation
I.1. Définition d'un 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. 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 SP (Scalable POWER parallel)
d'IBM (International Business Machines Corporation). 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 par exemple) ou diminuer le temps de cycle (Intel
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 32 bits (Intel Pentium IV) ou, de plus en plus aujourd'hui, sur 64 bits
(AMD (Advanced Micro Devices) Athlon, IBM Power...). Le jeu d'instructions
varie fortement d'une réalisation à l'autre : instructions courtes RISC
(reduced instruction set computer) (Power IBM, Sparc Sun, Intel Itanium par
exemple) ou longues (Intel Pentium, AMD Athlon). 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.
Les processeurs modernes intègrent dans leur puce une mémoire
cache accessible très rapidement pour accélérer les opérations. On ajoute
également un deuxième niveau de mémoire, placée juste à côté du processeur sur
la carte mère, connue sous le nom de cache niveau 2 ou L2. Les communications
avec le processeur sont plus rapides que celles avec la mémoire car elles ne
passent pas par le bus dont la bande passante est bien inférieure au débit que
peut accepter le processeur. Lorsqu'une instruction ou une donnée est contenue
dans un cache son fonctionnement est accéléré car il n'attend plus un
transfert. Le processeur demande simultanément l'information voulue à la
mémoire et aux caches. Lorsqu'elle est disponible dans celles-ci la réponse
arrive très rapidement et la requête est abandonnée. On a donc intérêt à
posséder des caches de grande dimension car, statistiquement, la chance d'y
retrouver une information est plus grande. Idéalement toute la mémoire devrait
être un immense cache accessible très rapidement mais cela exploserait le prix
des machines. C'est le cas des superordinateurs comme les Cray qui 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 optimales 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 quatre à huit octets selon le processeur. Le mot est de deux octets
dans les micro-ordinateurs anciens. Les ordinateurs personnels et les stations
de travail utilisent des mots de quatre ou huit octets. Les superordinateurs Cray
possèdent des mots de huit octets. L'accès à la mémoire se fait de façon
matricielle, selon des lignes et des colonnes. Comme une ligne ou une colonne
qui vient d'être lue ou écrite est inhibée pendant un certain temps appelé
temps de latence, la mémoire est divisée en bancs. Deux octets dont les
adresses sont consécutives sont placés dans des bancs différents ainsi
plusieurs bancs peuvent être accédé simultanément, ce qui améliore les échanges
avec le processeur. Il ne faut pas oublier que le temps d'accès à la mémoire
est bien plus long que le temps de cycle du processeur, de l'ordre de quatre
fois au minimum. Multiplier les bancs permet d'échanger plus rapidement plusieurs
informations entre le processeur et la mémoire. Un PC comporte habituellement
quatre bancs, une grosse machine seize ou plus. 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 atteindre 8 sur les gros
ordinateurs, il est limité à un seul sur 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 distinguer le rôle des différentes mémoires qui existent
dans la machine. Les disques servent à stocker l'information de façon
permanente. Leur contenu se conserve même lorsque l'ordinateur n'est plus sous
tension. Cependant comme les transferts entre ces périphériques et le
processeur sont lents, celui-ci ne travaille jamais directement avec ces
supports. Le processeur échange ses informations avec la mémoire et la mémoire
dialogue avec les disques. Pour exécuter un programme il faut donc d'abord le
déplacer du support permanent (le disque) vers la mémoire. Puis, au cours de
l'exécution les données lues dans les fichiers sont déplacées par morceaux des
disques vers la mémoire pour être employées par le processeur. Il en est de
même, en sens inverse, pour les écritures. 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 avec les 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 bien écrit sait en
tenir compte.
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 : tous les
adressages nécessaires pour accéder aux informations que ce soit dans la
mémoire ou sur disque se font au moyen de nombres entiers. Une architecture à
mot de 32 bits permet donc d'adresser un peu plus de quatre Giga-octets et il
devient impossible d'adresser directement un système de fichiers ou une mémoire
plus grande. Il faut se déplacer par indirection au moyen d'informations relais
jamais séparées par une distance supérieure à cette valeur fatidique, ce qui diminue
fortement l'efficacité de l'ordinateur. On comprend donc pourquoi aujourd'hui
on développe des processeurs à mot de 64 bits : l'ordre de grandeur du plus
grand entier est 1,8 1019, ce qui laisse une marge certaine pour les disques et
les mémoires que l'on sait fabriquer aujourd'hui !
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 effectif 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. Certes ces données sont anciennes mais elles
permettent de comprendre l'influence de l'architecture et le peu d'intérêt
qu'il faut porter à la vitesse d'horloge, sauf lorsqu'il s'agit de processeurs
de la même famille qui ne différent que par leur cadence d'horloge. Le résultat
est intéressant quoiqu'il faille toujours considérer des tests avec la plus
extrême prudence.
Tableau 1.
Résultats de tests des processeurs
Test |
Pentium MMX |
Pentium II (PII) |
Lecture
d'un bloc de 32 Koctets |
225
Mb/s |
419
Mb/s |
Ecriture
d'un bloc de 32 Koctets |
85
Mb/s |
209
Mb/s |
Lecture
d'un bloc de 4 Kb |
1173
Mb/s |
873
Mb/s |
Ecriture
d'un bloc de 4 Kb |
85
Mb/s |
1107
Kb/s |
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
Il existe plusieurs définitions possibles des systèmes
d’exploitation.
Un système d'exploitation peut être vu comme un programme agissant
en tant qu’intermédiaire entre l’utilisateur et le matériel de l’ordinateur. Le
but principal d’un système d’exploitation est de fournir un environnement qui
permet à un utilisateur d’exécuter des programmes.
Un système informatique doit savoir répondre aux demandes
suivantes:
- 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 fichier.
- préparation et mise au point
des programmes
- exploitation
des programmes.
I.2. Fonctions d'un système
d'exploitation
Les principales fonctions du système d'exploitation peuvent être
classées en trois rubriques:
I.2.1. La machine virtuelle
- 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.
- 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.
- fonctions
d'exécution: exécution des programmes en parallèle, en séquence.
I.2.2. 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é.
I.2.3. Les outils d'exploitation
- compilateurs,
aide à la mise au point de programmes.
- outils de
sauvegarde, d'archivage, traitement des défaillances.
- é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.3. Organisation en couches d'un système
d'exploitation
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
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:
- Les
outils, les services, les compilateurs, éditeurs, communications ...
- 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.
I.4. Virtualisation de la machine
Une des premiers systèmes d'exploitation à gérer le concept de
machine virtuelle (l'adaptation du temps partagé) a été l'OS/360 d'IBM, proposé
vers 1968 sous le nom de CP/CMS (Control Program/Cambridge Monitor System),
puis sous le nom de VM/370 (Virtual Machine Facility) en 1979.
Le cœur du système d'exploitation, appelé moniteur de machine
virtuelle ou VM/370, s'exécute sur le même matériel et fournit à la couche
supérieure plusieurs machines virtuelles. Ces machines virtuelles sont des
copies conformes de la machine réelle avec ses interruptions, ses modes
noyau/utilisateur,… etc.
Chaque machine virtuelle peut exécuter son propre système
d'exploitation. Lorsqu'une machine virtuelle exécute en mode interactif un
appel système, l'appel est analysé par le moniteur temps partagé de cette
machine, CMS. Toute instruction d'entrées/sorties (E/S), toute instruction
d'accès mémoire est convertie par VM/370 qui l’exécute dans sa simulation du
matériel. La séparation complète de la multiprogrammation et de la machine
étendue rend les éléments du système d'exploitation plus simples et plus
souples. VM/370 a gagné de la simplicité en déplaçant une grande partie du code
d'un système d'exploitation dans le moniteur CMS.
I.5. Evolution des systèmes
informatiques
I.5.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 qui
se greffait sur ce système rudimentaire tout comme une fonction ou un
sous-programme se greffe aujourd'hui sur le programme principal. Les
entrées-sorties étaient rudimentaires, réduites à un ruban perforé. Les
programmes étaient é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 à dire l'un après
l'autre. 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.
Ces avancées étaient fondamentales car elles introduisaient un environnement
autour du programme à exécuter.
L'informatique moderne nait dans les années 1960. On peut résumer
rapidement ses avancées autour de l'invention des notions suivantes :
- 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 physique.
- Les
communications
I.5.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
œuvre 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.5.3. Multiprogrammation
La multiprogrammation ne doit pas être confondue avec le temps
partagé qui apparaitra plus tard. L'idée part du constat que le processeur est
mal employé à chaque fois qu'un programme est interrompu par l'attente d'une
communication avec un périphérique : plutôt que de le mettre en sommeil
pourquoi ne pas l'affecter à une autre tâche ? Un ensemble de programmes est
donc chargé simultanément en mémoire, leur exécution est chainée, c'est à dire
que le processeur exécute successivement des séquences d'instructions pour
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.
I.5.4. Les compilateurs
L'emploi des premiers ordinateurs était une affaire d'hyper-spécialistes
puisqu'on doit coder directement en langage machine voire en binaire ! Dès le
milieu des années 50 des théoriciens se demandent s'il est possible d'imaginer
un langage proche de l'expression humaine et un outil capable de le traduire en
code binaire tout en optimisant le code réalisé. 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. 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. Depuis bien
d'autres langages ont été inventé. Mentionnons le langage C, inventé pour
développer plus rapidement qu'en langage assembleur un nouveau système
d'exploitation : il s'agissait d'Unix.
I.5.5. Mémoire virtuelle
Pendant longtemps le coût des dispositifs électroniques et leur
manque de compacité ne permettait de construire que des mémoires de petite taille.
Dans les années 60, par exemple, les super-ordinateurs possédaient une mémoire
partie sous forme de micro-bobines électromagnétiques, partie sous forme de
transistors et leur dimension n'excédait pas quelques centaines de Koctets ! Le
souci était donc également d'optimiser son usage.
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). Seules les
informations nécessaires à l'activité immédiate résident, à un instant donné,
dans la vraie mémoire. Ceci permet d'exécuter des programmes dont la taille est
supérieure à la mémoire réelle de la machine. Le mauvais côté de cette
invention est qu'il faut multiplier les échanges entre le disque et la mémoire
pour la mettre à jour. Il faut donc disposer de périphériques et de contrôleurs
d'entrées-sorties rapides.
I.5.6. Les communications
Les années 80 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 alors 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 travailler ensemble
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.
I.6. Exemples de systèmes
d'exploitation
Comme son nom l'indique l'ordinateur individuel n'est employé que
par une seule personne à la fois. Celle-ci dispose de moyens de communication:
écran, clavier, souris, une imprimante et é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 important 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é. Les ressources de l'ordinateur ne
sont employées que par 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 ou graver un CD (Compact
disc) mais la simultanéité n'est pas le point de force de cette machine. Ce
parallélisme qui n'est qu'apparent s'améliore dans les dernières versions des
systèmes d'exploitation et parce que la puissance des processeurs ne cesse de
croître. Les mécanismes de sécurité nécessaires pour préserver la confidentialité
des informations sont peu ou mal employés lorsqu'ils existent.
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.
Un système d'exploitation orienté temps réel doit donc pouvoir garantir une
réponse avec une contrainte dans le temps.
Ceci introduit deux contraintes importantes :
- Les
informations doivent être acquises sur les différents dispositifs d'entrés
périodiquement. Cette période 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.
- 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.
- Il doit
également présenter la souplesse nécessaire pour que l'on puisse aisément
piloter des dispositifs au travers de cartes électroniques standards du
marché.
De tels systèmes sont appelés systèmes temps réel. Certains
systèmes d'exploitation peuvent s'en rapprocher, notamment parce que la
puissance des processeurs aujourd'hui permet à un système de répondre
relativement rapidement, mais sans disposer de toutes les fonctions qui
pourraient permettre de garantir les délais de traitement. 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é!
Le cas des systèmes embarqués est particulier : outre les
contraintes des systèmes temps réel il est impossible pour des raisons diverses;
(environnement, volume, poids..) d'employer les composants que l'on retrouve
dans la plupart des ordinateurs. Il faut alors employer des systèmes
d'exploitation spécifiques, le plus souvent allégés et ne comportant que les
fonctions utiles. Ne parlons pas des systèmes militaires et spatiaux !
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).
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 tâches 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.
Aujourd'hui deux systèmes prédominent : Windows, dans toutes ses variations, sur les postes personnels, Unix et de plus en plus sa version Linux, sur les serveurs et les gros ordinateurs (Windows est réservé aux processeurs Intel). La puissance des processeurs permet d'employer l'un ou l'autre système pour couvrir la plupart des gammes d'application, au moyen de modules spécifiques éventuellement. Windows ne dispose pas des éléments nécessaires au temps partagé mais parvient à servir plusieurs utilisateurs simultanés, s'ils sont physiquement connectés à un autre poste relié par le réseau, en employant une technologie client-serveur.
0 Commentaires