Académique Documents
Professionnel Documents
Culture Documents
SYSTEME D’EXPLOITATION
Support de cours
Alain EKONDZI
Document strictement réservé aux étudiants de 2ème année de licence et DUT informatique du CFI-CIRAS
Reproduction interdite
2
PLAN DU COURS
Chapitre I : Généralités
Chapitre I : Généralités
Par définition, le système d’exploitation (operating system) d’un ordinateur est un ensemble de
programmes qui remplissent deux grandes fonctions :
• Gérer efficacement les ressources de l’installation matérielle en assurant leurs partages entre
un ensemble plus ou moins grand d’utilisateurs ;
• Assurer un ensemble de services en présentant aux utilisateurs une interface mieux adaptée à
leurs besoins que celle de la machine physique.
En d’autres termes, le système d’exploitation construit, sur une machine physique (telle qu’elle est
livrée par le constructeur), une machine virtuelle plus facile d’emploi et plus conviviale pour
l’utilisateur d’une part, et prend en charge la gestion complexe des ressources de l’ordinateur
(processeur, mémoires, périphériques d’entrée-sortie, etc…), en optimise l’utilisation et en permet le
partage entre les utilisateurs d’autre part.
I- HISTORIQUE
A l’apparition de l’ordinateur, il y avait une absence totale de système d’exploitation dans les
machines. Les systèmes d’exploitation sont nés bien après et ont obéi, tout au long de leur évolution,
4
à une même logique : faciliter l’exploitation de l’ordinateur grâce à l’utilisation d’un certain nombre
d’outils. Ainsi donc, les systèmes d’exploitation ont évolué de la manière suivante :
a- Le traitement par lots est la première technique utilisée. Des lots de travaux étaient soumis sous
forme de cartes perforées et recopiés sur bande puis traités dans l’ordre de soumission. Avec
l’arrivée des disques durs et grâce à l’introduction d’un module appelé planificateur (scheduler),
ces travaux n’étaient plus exécutés dans l’ordre de soumission.
b- Les systèmes multiprogrammés sont nés avec le concept d’indépendance des unités
d’entrées/sorties. En effet, bien qu’il soit possible d’exécuter les travaux soumis suivant l’ordre
défini par le scheduler, l’unité centrale de traitement reste inactive pendant toute la durée de
l’entrée-sortie. C’est ainsi qu’un nouveau module a enrichi le système d’exploitation : l’allocateur
(dispatcher). Parmi les nombreux programmes qui sont en mémoire centrale, l’allocateur choisit
un à qui il alloue le processeur. Lors de son exécution, si le programme exécute une entrée-sortie,
le processeur est alloué à un autre programme.
c- Avec l’apparition des terminaux, plusieurs utilisateurs peuvent être connectés simultanément à
l’ordinateur, chacun exécutant son programme ; ainsi, des temps de réponse très courts sont exigés
par les utilisateurs. Afin de donner à chaque utilisateur l’impression d’être seul, on a introduit le
concept de temps partagé (time sharing) où une tranche de temps est attribuée à chaque utilisateur
afin que celui-ci exécute son programme. Aucun programme ne peut ainsi être pénalisé.
d- L’apparition des micro-ordinateurs a ramené les systèmes mono-utilisateurs ; à cela s’est greffé le
concept de multitâche. La connexion des ordinateurs en réseau a donné naissance aux systèmes de
réseau qui permettent le partage des ressources de plusieurs ordinateurs tout en donnant
l’impression de dialoguer avec un seul ordinateur. L’apparition des ordinateurs multiprocesseurs
a introduit, au sein des systèmes gérant ce type d’ordinateur, des modules spécifiques permettant
des traitements parallèles (multi-processing) sur une même machine.
Un programme est une suite ordonnée d’instructions, écrites dans un langage donné, définissant un
traitement exécutable sur ordinateur.
Le processeur ou unité centrale de traitement est l’agent qui exécute les instructions d’un programme.
Il dispose d’un certain nombre de registres tels que :
- Le compteur ordinal qui contient l’adresse de la prochaine instruction
- Le registre d’instruction qui contient le code de l’instruction ;
- L’accumulateur qui contient un opérande ou le résultat de l’opération ;
- Le registre d’état qui indique l’état de la machine après l’exécution d’une opération.
La notion de processus a été introduite dans les années 1960 par les concepteurs de MULTICS. L’idée
de base était de distinguer un programme de son exécution que nous appelons processus. Un
processus est une séquence d’opérations qui se déroule pour réaliser une tâche. Il dispose d’un
5
environnement ou contexte, c’est-à-dire, un ensemble d’informations qui lui sont nécessaires et
suffisantes. Cet ensemble est représenté par une structure appelée bloc de contrôle de processus
(process control block) ou BCP. Cette structure contient les informations suivantes :
- L’état du processus ;
- Le numéro qui l’identifie ;
- La valeur du compteur ordinal ;
- Les valeurs des registres ;
- Des informations relatives à la quantité de mémoire allouée au processus et des pointeurs vers
cette mémoire ;
- Des informations quantitatives telles que le temps CPU utilisé, le temps restant autorisé ;
- Des informations concernant les opérations d’entrée-sortie du processus (périphériques
alloués, opérations en attente de complétion, fichiers ouverts, etc…) ;
- Des informations concernant les files d’attente où figure le processus (numéros de priorité,
pointeurs vers ces files…).
Le BCP est sauvegardé si le processus est interrompu, ce qui permet de reprendre l’exécution du
processus en bonne et due forme.
En résumé, un programme spécifie l’exécution séquentielle d’une liste d’instructions par un agent dit
processeur ; on appelle processus cette exécution.
On appelle ressources les éléments qui contribuent à la progression d’un processus. Certaines relèvent
du matériel ; c’est le cas du CPU, de la mémoire centrale, des mémoires secondaires, des unités
périphériques, des bus, des réseaux, etc. D’autres sont de nature logicielle : les programmes
d’application (compilateurs, assembleurs, éditeurs de texte, tableurs, grapheurs, bibliothèques de
fonctions) et les processus systèmes (ordonnanceurs, distributeurs, chargeurs, éditeurs de liens) ou
les fichiers.
Une classe de ressource est le couple constitué d’une collection d’éléments regroupés sous un nom
commun et l’ensemble des opérations que l’on peut leur appliquer.
On distingue :
- les ressources préemptibles dont la libération est sous le contrôle du système ;
- Les ressources non préemptibles dont la libération est sous le contrôle du processus.
6
Une ressource peut être :
- Commune (utilisable par tous les processus) ;
- Partageable à un point d’accès (attribuable simultanément à un seul processus) ;
- Allouée à un seul processus.
La demande, l’allocation et la libération sont réalisées par le système d’exploitation (par exemple
demander ou libérer un périphérique, ouvrir ou fermer un fichier, allouer ou libérer de la mémoire).
Lorsqu’une ressource peut être à nouveau demandée après sa libération, elle est dite réutilisable.
C’est le cas en particulier des ressources matérielles.
Le système d’exploitation assure le contrôle des ressources grâce à une table qui permet d’indiquer
si une ressource est disponible ou non, et si elle est allouée, à quel processus. Ainsi, à chaque
ressource, est associée une file d’attente contenant les blocs de contrôle des processus qui l’attendent.
Chaque fois qu’un nouveau processus fait une demande de la ressource et que cette dernière n’est pas
utilisable, son bloc de contrôle est ajouté à la file d’attente.
L’ordinateur fonctionne suivant deux modes : le mode superviseur, réservé au système d’exploitation
et le mode utilisateur dans lequel tournent les programmes d’application. En effet, certaines
instructions exécutées par l’ordinateur concernent des zones sensibles ; les faire exécuter par un
utilisateur ordinaire pourrait sérieusement perturber le fonctionnement du système. C’est pourquoi
elles ne peuvent être exécutées que par le système d’exploitation. Ces instructions sont appelées
instructions privilégiées. Les autres instructions sont exécutables aussi bien par le système
d’exploitation que par les programmes d’application. Ce sont les instructions de base. Au niveau du
processeur, il existe un registre appelé PSW (Process Status Word) dans lequel sont positionnés un
certain nombre de bits indiquant l’état général de la machine, dont un bit spécial qui est interrogé
automatiquement si l’instruction à exécuter est de type privilégié. Le passage du mode utilisateur au
mode superviseur est assuré par une instruction non privilégiée appelée requête au superviseur (SVC
= supervisor Call). Elle provoque un changement au niveau du PSW où la valeur du bit de contrôle
est modifiée. C’est ce que l’on appelle une commutation du mot d’état.
L’exemple le plus connu est celui des instructions d’entrée-sortie où les programmes utilisateurs ne
peuvent pas exécuter directement une instruction de transfert physique. Ceci provoque
automatiquement un SVC qui permet au système de passer en mode superviseur et lancer l’opération
de transfert dont il va contrôler le déroulement.
II.4 INTERRUPTION
Une interruption est une commutation de mot d’état provoquée par un signal généré par le matériel.
7
Ce signal est lui-même la conséquence d’un événement, qui peut être interne au processus et résultant
de son exécution, ou bien extérieur et indépendant de cette exécution. Lorsque le CPU reçoit le signal
d’interruption, il en examine la cause grâce à quelques bits du mot d’état qui constituent le vecteur
d’interruption. A chaque cause est associé un niveau d’interruption. On distingue, en général, au
moins trois niveaux :
- Interruptions externes ;
- Déroutements ;
- Appels au système.
Le système d’exploitation peut être décrit comme structuré en couches fonctionnelles superposées les
unes aux autres. Les couches les plus bases sont celles qui sont en interaction directe avec le matériel
et les plus hautes sont celles qui servent d’interface avec l’utilisateur. Ainsi, de bas en haut, on trouve :
- Le noyau dont les fonctions principales sont l’allocation du CPU, la gestion des interruptions
et le support d’environnement des processus ;
- Le gestionnaire de mémoire centrale ;
- Le gestionnaires des entrées-sorties ;
- Le système de gestion des fichiers ;
- Le planificateur ;
- L’interface utilisateur avec l’interpréteur de commandes.
8
Les outils de service forment, avec le système d’exploitation, le logiciel de base. Ils ne font pas partie
du système d’exploitation, mais aident au développement d’applications ou à l’automatisation et/ou
à la simplification de fonctions fréquemment utilisées.
Un éditeur de texte (text editor) est un logiciel interactif qui permet de saisir un texte à partir d’un
clavier et de le stocker dans un fichier. Les informations contenues dans ce fichier sont du type texte,
c’est-à-dire un ensemble de caractères qui n’a pas de spécifications particulières. Un éditeur réalise
principalement les fonctions suivantes :
- La visualisation d’une partie du texte à l’écran ;
- Le déplacement et le positionnement du curseur n’importe où dans le texte ;
- La modification du texte par ajout, insertion, déplacement, copie, suppression ou
remplacement de chaînes de caractères ;
- La recherche de chaînes de caractères particulières ;
- Le choix d’une police particulière.
Un traducteur lit un programme écrit dans un langage de programmation et le traduit dans un langage
compréhensible par la machine (langage machine). Le programme ainsi traduit s’appelle programme
objet. Cette traduction n’est possible que si le programme source ne comporte pas d’erreurs. Dans le
cas contraire, ce sont des messages d’erreurs qui sont envoyés au programmeur qui a soumis le
programme à la traduction. On distingue trois types de traducteurs :
Un éditeur de liens (Linker ou linkage editor) est un logiciel qui permet de combiner plusieurs
programmes objets, (par exemple le programme principal et des sous-programmes), des modules de
librairie et des procédures externes pour former un programme complet exécutable.
Le rôle d’un chargeur (loader) est de charger le programme objet exécutable en mémoire centrale
pour que celui-ci soit exécuté par le CPU. C’est lui qui également traduit les adresses relatives
(comme si le programme était implanté à l’adresse 0) en adresses absolues.
Adresse absolue = adresse d’implantation (adresse où est logée la première instruction) + adresse relative
(adresse de l’instruction si le programme était implanté à l’adresse 0)
Un débogueur (debugger) est un logiciel qui facilite la mise au point de programmes (détection et
correction d’erreurs ou bogues (bugs). Il permet d’examiner le contenu de la mémoire ainsi que celui
des registres. On peut ainsi suivre l’exécution pas à pas d’un programme et comprendre d’où viennent
certaines erreurs d’exécution.
Ils sont nombreux et variés ; ils visent la simplification de certaines tâches ou encore la facilitation
de l’exploitation de l’ordinateur. Certains sont livrés avec l’ordinateur ou le système d’exploitation,
d’autres sont réalisés par des sociétés spécialisées dans l’édition des logiciels. Parmi ceux- ci on peut
citer :
- Les utilitaires de tri ;
- Les utilitaires de manipulation de fichiers (copie de support, transcription de code à code…) ;
- Les utilitaires d’optimisation de la mémoire centrale ;
- Les utilitaires de sauvegarde ;
- Les utilitaires de récupération de fichiers ;
- Les utilitaires de création et de définition de masques de saisie ;
- Les utilitaires de réorganisation du disque dur ;
- Les utilitaires de diagnostic de contrôle de matériel ;
- Les utilitaires pour la comptabilisation de l’emploi des ressources ;
- Les utilitaires de création de partitions disque ;
- Les utilitaires de choix de partition ou système au démarrage ;
- Etc…
La finalité d’un système d’exploitation est d’assurer le stockage, la recherche et la protection des
informations, de gérer de manière optimale les différentes ressources matérielles et logicielles afin
d’assurer le partage de ces ressources entre usagers ; pour cela, il doit prendre en compte les
problèmes de sécurité. En outre, le système d’exploitation doit présenter à l’utilisateur une machine
simple (machine virtuelle), cachant la complexité de la machine réelle. La mise en œuvre d’un
parallélisme entre activités doit permettre l’augmentation des performances et une interface de
dialogue doit permettre la communication avec les utilisateurs.
10
Les principales fonctions d’un système d’exploitation sont :
- La gestion des travaux ;
- La gestion des fichiers ;
- La gestion des entrées-sorties ;
- La gestion de la mémoire centrale ;
- La gestion des processus ;
- La gestion des interruptions ;
- L’allocation des ressources
- La protection du système, des ressources et des utilisateurs.
La mémoire centrale est l’organe de l’ordinateur qui stocke les programmes en cours d’exécution
ainsi que leurs données. C’est une mémoire volatile composée de mots-mémoire ayant chacun une
adresse. Ainsi donc, tout programme à exécuter doit au préalable être chargé en mémoire centrale.
Ses instructions seront ensuite traitées une à une par l’unité centrale de traitement ; les résultats des
traitements seront rangés dans la mémoire centrale.
Dans les systèmes actuels, la mémoire centrale est partagée entre plusieurs programmes de tailles
diverses. Le problème du système d’exploitation est donc de s’arranger, par différentes techniques, à
ce que toutes les demandes de chargement de programmes en mémoire centrale soient satisfaites.
I OBJECTIFS
Le programme, tel qu’il est développé par son concepteur, est une entité logique, c’est-à-dire une
suite d’instructions. Son chargement en mémoire centrale lui confère une représentation physique ;
celle-ci est liée aux contraintes de la mémoire physique. Les contraintes de la mémoire physique sont
d’une part celles relatives à l’organisation matérielle, d’autre part celles liées à la gestion de cette
mémoire physique.
I.1 ORGANISATION
Certains utilisateurs travaillant simultanément peuvent utiliser les mêmes programmes. Ainsi, le
contenu de certaines zones doit pouvoir être partagé, pour éviter la duplication des informations qui
causerait une occupation importante et inutile de la mémoire centrale.
I.2 GESTION
Chaque fois qu’une demande de chargement d’un programme est adressée au système d’exploitation,
celui-ci doit trouver de la place en mémoire centrale pour charger le programme. Pour pouvoir
satisfaire les différentes demandes, le système d’exploitation utilise des stratégies d’allocation qui
consistent à attribuer des zones mémoire. Il s’agit, en particulier, de trouver le meilleur espace
mémoire possible qu’il faut attribuer à un programme.
A la fin de son exécution, un programme doit libérer l’espace mémoire qu’il occupait. En outre,
lorsqu’il y a trop de demandes, le système d’exploitation peut être amené à sortir momentanément
certains programmes de la mémoire centrale pour les loger en mémoire secondaire. Il utilise pour cela
des stratégies de libération.
Les programmes exécutés par l’ordinateur n’ont pas tous la même taille ; à l’heure actuelle, la taille
des programmes croît de plus en plus et elle peut dépasser celle de la mémoire physique.
Le rôle du système d’exploitation est donc de fournir à l’utilisateur la possibilité de disposer de tout
l’espace mémoire qui lui est nécessaire, l’affranchissant ainsi des limitations imposées par la taille de
la mémoire centrale.
12
II- METHODES D’ALLOCATION
On distingue deux grands modes d’allocation d’espace mémoire : le mode d’allocation contiguë et le
mode d’allocation non contiguë.
Le mode d’allocation contiguë consiste à placer le programme à des adresses consécutives. L’espace
mémoire est divisé en plusieurs zones de tailles variables, mais d’un seul tenant, contenant chacune
un nombre entier de blocs et pouvant être soit vides, soit alloués. Le système d’exploitation maintient
en permanence une liste de zones libres. Quand une zone est allouée, elle est supprimée de la liste ;
lorsqu’elle est libérée, elle est ajoutée à la liste.
On perle de fragmentation interne lorsque l’espace alloué au programme n’est pas entièrement
occupé par celui-ci.
Fragmentation interne
Dans certains cas, on peut avoir plusieurs zones libres dont la somme est égale ou supérieure à la
taille du programme demandeur d’espace mémoire. Mais celles-ci étant placées à des adresses non
consécutives, il n’est pas possible de satisfaire la demande. On perle de fragmentation externe.
13
Fragmentation externe
Ce mode permet de fractionner le programme et de placer les fragments à des adresses dispersées.
Les blocs de mémoire dans lesquels sont placés les fragments de programme ne sont pas
nécessairement adjacents. Ceci évite des problèmes de réorganisation de la mémoire centrale posés
par le mode d’allocation contiguë. Mais, afin de retrouver les différents fragments de programme, le
système d’exploitation doit conserver plus d’informations. Ainsi, il doit tenir à jour des tables
indiquant les adresses où se trouvent les différents fragments.
Les méthodes d’allocation contiguë permettent de loger l’ensemble du programme dans une seule
zone de la mémoire centrale. L’organisation de la mémoire centrale varie selon qu’il s’agit d’un
système mono-programmé ou d’un système multiprogrammé. Il en est de même pour la politique
d’allocation car certains systèmes mono-programmés sont multi-utilisateurs.
Il s’agit des systèmes d’exploitation où, à chaque instant, un seul programme utilisateur est présent
en mémoire centrale. L’organisation, c’est-à-dire, la division de l’espace mémoire en zones, et la
gestion, c’est-à-dire l’occupation de l’espace par les programmes utilisateurs sont très simples.
(Schéma)
Lorsque le système est mono-utilisateur, un premier utilisateur dispose de toutes les ressources de
l’ordinateur ; lorsqu’un autre utilisateur désire faire exécuter un programme, il doit attendre que le
premier ait terminé. Dans le cas d’un système multi-utilisateur, on gère simultanément plusieurs
programmes utilisateurs. Au départ, tous les programmes sont en mémoire secondaire, puis chacun
occupe à tour de rôle la mémoire centrale pendant une tranche de temps appelée quantum. La
libération de la mémoire centrale par le programme intervient à la fin du quantum, lors d’une
opération d’entrée-sortie ou en cas de terminaison normale du programme.
(Schéma)
Conçus pour augmenter le taux d’utilisation de la mémoire centrale, ils permettent à plusieurs
programmes de résider simultanément en mémoire centrale. La mémoire centrale est divisée en
plusieurs zones (partitions) dont une réservée au système d’exploitation. Chaque programme occupe
une zone. Deux techniques d’organisation sont utilisées : les partitions de taille fixe et les partitions
de taille variable.
La mémoire centrale est découpée en partitions de tailles différentes mais fixes. Lorsqu’on alloue une
zone à un programme, celle-ci l’est entièrement pour ce programme. Les partitions étant fixées à
l’avance, il se pose un problème d’occupation de la mémoire centrale :
15
• Lorsque le programme n’occupe pas totalement la zone qui lui est attribuée, l’espace inoccupé
reste inoccupé pendant tout le temps que le programme réside en mémoire centrale. Il y a là
un gaspillage d’espace mémoire ;
• Si un programme demande un espace mémoire dont la taille est égale ou inférieure à la somme
des espaces inoccupés, celui-ci ne pourra être satisfait ; les programmes n’étant pas
relogeables.
La politique d’allocation des zones revêt donc une importance capitale. En ce qui concerne la
protection des zones, chaque adresse fournie par le programme est comparée aux adresses de début
et de fin de la zone afin d’éviter des accès à des zones non autorisées.
(Schéma)
Dans la méthode de partitions de taille variable, les zones sont créées au fur et à mesure des allocations
successives. Ainsi, lors du remplissage initial, les programmes sont chargés de façon à ne laisser
aucun espace entre eux.
La méthode des partitions de taille variable, grâce à la relocation, offre un avantage certain par rapport
à la méthode des partitions de taille fixe, mais elle présente également quelques faiblesses :
- Le temps non négligeable passé à retasser la mémoire ;
- L’exigence d’allouer à un programme une zone d’un seul tenant, ce qui est souvent difficile.
Les méthodes d’allocation non contiguë ont été conçues pour pallier les défauts des méthodes
d’allocation contiguë. Cette fois, il faut :
- Dissocier complètement l’ensemble des adresses référencées par un processus en cours
d’exécution de l’ensemble des adresses physiques disponibles en mémoire centrale ;
- Créer, entre l’espace logique du processus et l’espace physique, une correspondance qui sera
réalisée dynamiquement pendant l’exécution de ce processus.
16
L’espace logique et l’espace physique sont divisés en zones ; la correspondance entre les zones
physiques et les zones logiques se fait à l’aide d’une table. Deux possibilités sont rencontrées :
- Dans la première, les zones sont de taille variable et sont appelées segments, on parle alors de
systèmes segmentés ;
- Dans la seconde, les zones sont toutes de même taille et sont appelées pages ; on parle de
systèmes paginés.
Les systèmes d’exploitation utilisant la segmentation constituent une amélioration des systèmes
à partitions variables. La segmentation consiste à diviser le programme en modules ou segments,
chaque segment correspondant à une entité logique (procédure, bloc de données, etc..)
indépendante des autres segments. Cette indépendance permet au système d’implanter un
segment n’importe où en mémoire centrale (espace libre suffisant) sans se soucier des autres
segments.
(Schéma)
L’adresse logique est constituée d’un couple (s, d) où s est le numéro de segment et d le
déplacement (offset) à l’intérieur du segment. L’adresse physique est calculée à l’aide de la table
des segments. En effet, chaque entrée i de la table des segments contient l’adresse d’implantation
(AI) du segment i, encore appelée base et la longueur du segment, appelée limite. Le déplacement
d doit être compris entre o et la limite ; dans le cas contraire, lors d’une référence, une interruption
est générée.
(Schéma)
Les systèmes paginés sont une application du concept de mémoire virtuelle. L’idée de mémoire
virtuelle s’appuie sur trois aspects :
- La dissociation des adresses logiques (adresses virtuelles) et physique (adresses réelles) ;
- Le fonctionnement de l’espace logique d’un processus en blocs
- La non-contiguïté de l’allocation.
Le programme est donc construit dans un espace virtuel (qui n’existe pas) indépendamment de
l’espace réel qu’est la mémoire centrale. Les deux espaces pouvant être de tailles différentes, l’espace
virtuel peut donc être plus grand que l’espace réel. Ainsi à un instant donné, on ne peut avoir qu’une
partie du programme chargée en mémoire centrale. Le système d’exploitation tient à jour une table
de correspondance entre adresses logiques et adresses physique. Les deux espaces étant divisés en
17
zones de même taille, la conversion d’adresse se fait par simple remplacement de l’adresse
d’implantation logique par l’adresse d’implantation physique. Le déplacement est la même pour les
deux zones.
Toutes les zones n’étant pas présentes en même temps en mémoire centrale, la référence à une adresse
contenue dans une zone non chargée en mémoire centrale va provoquer le chargement de cette zone
(qui est en mémoire secondaire) en mémoire centrale, avec éventuellement, remplacement d’une autre
partie du programme qui était présente en mémoire centrale. On utilise pour cela des algorithmes de
choix et de remplacement.
(Schéma)
Le principe de la pagination est suivant : l’espace virtuel du programme est découpé en pages
(virtuelles) toutes de même taille (la taille est généralement une puissance de 2 (2 n). La mémoire
réelle est aussi divisée en pages (réelles) de même taille. Le programme étant stocké en mémoire
virtuelle, un mécanisme de gestion permettant un transfert de pages entre les deux mémoires est mis
en œuvre, grâce à une table de pages (une table par programme). Chaque entrée de la table contient
les informations relatives à une page. Il s’agit des informations suivantes :
- Un bit de présence qui vaut 1 si la page est présente en mémoire centrale et 0 sinon ;
- Un bit de protection (autorisation en lecture, écriture ou exécution) ;
- Un bit indicateur de modification (page modifiée/non modifiée) ;
- L’adresse en mémoire virtuelle ;
- L’adresse en mémoire réelle si la page est présente en mémoire centrale.
Le champ d’adresse est divisé en deux parties : l’une contient le numéro de page, l’autre contient la
position à l’intérieur de la page (offset). Le déplacement étant le même dans les deux pages, le passage
de l’adresse virtuelle à l’adresse réelle se fait par simple remplacement du numéro de la page virtuelle
par le numéro de la page réelle, ceci grâce à la table de pages.
(Schéma)
Lorsqu’une adresse référencée, (c’est –à-dire une page contenant cette adresse) est absente de la
mémoire centrale, on dit qu’il y a défaut de page (page default). Le système cherche alors sur disque
une copie de la page demandée, la charge en mémoire centrale et met à jour la table de pages. Cette
méthode qui consiste à charger une page si et seulement si elle est référencée est appelée pagination
à la demande (demand paging). Il existe une autre méthode de chargement de pages appelée
pagination anticipée qui consiste à charger les pages sans attendre un défaut de page.
Etant donné la différence de taille entre la mémoire virtuelle et la mémoire réelle, la nouvelle page à
charger peut remplacer un autre page déjà présente en mémoire centrale. Deux problèmes se posent
alors :
- Quelle page remplacer ?
- Que faire de la page à remplacer ?
En ce qui concerne le remplacement de pages, différents algorithmes de choix existent :
a) Random : le remplacement se fait de manière aléatoire ;
b) FIFO (ou PEPS = 1er entré, 1er sorti) c’est la première page chargée qui est remplacée ;
c) MRU = moins récemment utilisée (ou LRU = Least Recently Used) : on expulse la page
dont l’utilisation est la plus reculée dans le temps ;
d) MFU = moins fréquemment utilisée (LFU = Least Frequenlty used) : on remplace celle qui a
été le moins souvent utilisée pendant le dernier intervalle de temps ;
e) Algorithme mixte combinant les algorithmes cités.
18
La page à expulser, si elle a été modifiée, est recopiée en mémoire auxiliaire ; dans le cas contraire,
on ne fait rien.
V-UTILISATION DU CACHE
Pour réduire la différence de vitesse entre l’unité centrale de traitement et la mémoire centrale,
certains ordinateurs sont dotés d’une antémémoire ou mémoire cache (cache memory), une mémoire
plus rapide que la mémoire principale, rattachée au CPU. Ce qui permet d’augmenter les
performances.
Le CPU vient chercher les instructions dans le cache qui contient les instructions près (ou qui
viennent) d’être exécutées. La taille du cache est inférieure à celle de la mémoire principale. Celle-ci
est divisée en blocs de taille inférieure à celle d’une page (pour réduire le volume, donc le temps de
transfert entre le cache et la mémoire principale). Si l’adresse référencée est présente dans le cache,
son contenu est directement envoyé au CPU. Dans le cas contraire, on la recherche dans la mémoire
principale. Si elle y est présente, un transfert de bloc s’opère de la mémoire principale vers le cache.
Mais, en cas d’absence dans la mémoire principale, un transfert de page se fait entre la mémoire
virtuelle et la mémoire principale. Les algorithmes de remplacement des blocs sont les mêmes que
ceux des pages.
Dans les systèmes multiprogrammés, plusieurs programmes peuvent faire appel aux mêmes modules
ou utiliser les mêmes données. C’est le cas par exemple des bases de données (systèmes de
réservation, de banques, etc…), des compilateurs, des éditeurs de texte… La solution la plus simple
consisterait à dupliquer ces modules ou données pour chaque programme, ce qui a pour inconvénient,
l’occupation inutile de la mémoire centrale. C’est pourquoi les systèmes d’exploitation sont dotés de
mécanismes de gestion permettant le partage de données et modules en mémoire centrale.
Si deux programmes utilisent la même donnée, le problème ne se pose pas lorsque celle-ci est
accessible uniquement en lecture. Par contre, si elle doit être modifiée par les deux programmes, il se
pose un problème dit celui de la section critique, c’est à-à-dire, comment faire pour que les deux
programmes ne puissent donner un résultat faux à la fin de leur exécution ?
Exemple : Programme P1 Programme P2
Lire A Lire A
A = A +1 A= A*2
Ecrire A Ecrire A
Au départ, A vaut 1
Dans un système à temps partagé, un programme peut démarrer avant la fin de l’exécution d’un autre.
Si P2 est exécuté après la fin de l’exécution de P1, à la fin A vaut 4. Mais s’il démarre avant la fin de
l’exécution de P1, le résultat sera 2 ; on aura donc un résultat faux. Ainsi, pour garantir un résultat
toujours correct, il faut pouvoir être certain que P2 ne démarre avant la fin de P1 ou inversement. Si
l’un démarre, l’autre doit être bloqué jusqu’à la fin de l’exécution de celui-ci. Ce problème est connu
sous le nom d’exclusion mutuelle.
C’est le cas des routines d’accès aux fichiers, des routines d’entrées/sorties, des routines de calcul,
des compilateurs, éditeurs de textes, etc… qui peuvent être partagés entre différents programmes. On
19
a une seule copie de la routine qui est exécutée par chaque processus avec ses propres données. Le
CPU étant alloué pendant une tranche de temps à un processus, on peut, à un instant donné, avoir
plusieurs processus ayant exécuté une partie de la routine. Chacun d’eux a démarré l’exécution de la
routine avant la fin de l’exécution d’un autre processus. Pour obtenir un résultat comme si les
processus avaient exécuté à tour de rôle la routine, cette routine doit posséder une propriété
particulière : la réentrance.
Une procédure est réentrante si elle ne modifie ni son code, ni ses données (variables locales).
Généralement, on associe à chaque processus une pile dans laquelle on stocke les résultats
intermédiaires. Lorsqu’on interrompt le processus en cours, le changement de processus implique le
changement de pile, ceci permet de conserver les résultats du processus interrompu.
20
En ce qui concerne la notion de fichier, on distingue le fichier logique qui présente l’organisation
telle que vue par l’utilisateur et le fichier physique qui représente la façon dont le fichier est
réellement implanté en mémoire secondaire. Le rôle du SGF est donc d’assurer la correspondance
entre ces deux représentations. Il doit en particulier prendre en charge :
- La gestion du support physique en masquant à l’utilisateur des détails de l’organisation
physique de ses fichiers ;
- La sécurité et la protection des fichiers, c'est-à-dire la garantie de leur intégrité en cas d’incident
ou de malveillance et le respect des règles d’utilisation fixées (droits d’accès, conditions de
partage, etc…)
D’autres opérations permettent à l’utilisateur d’accéder aux informations contenues dans un fichier.
Il s’agit, en particulier, d’opérations sur les articles du fichier :
- Lire un article ;
- Écrire dans un article ;
- Modifier un article ;
- Insérer un article ;
- Détruire un article ;
- Retrouver un article.
II-FICHIERS PHYSIQUES
C’est le système d’exploitation qui est responsable de l’organisation des fichiers, de leur stockage en
mémoire secondaire et de l’accès aux informations contenues dans les enregistrements. L’unité de
stockage manipulée par le système est l’enregistrement physique ou bloc. C’est la quantité
d’information transférée entre la mémoire principale et le support de stockage permanent. D’un point
de vue physique, le fichier est découpé en blocs de longueur fixe, correspondant généralement à la
taille d’un secteur (512, 1024, 2048 octets par exemple) ou à un multiple de cette taille. Suivant la
taille des articles et des blocs, le système peut grouper plusieurs articles dans un bloc (packing).
Le système voit un fichier comme une suite de blocs. Lorsque l’utilisateur lance l’opération de
création d’un fichier, le système doit trouver un espace (ensemble de blocs) libre pour accueillir le
fichier. Lorsqu’un fichier est détruit, les blocs qu’il occupait deviennent libres. L’ensemble des blocs
libres subit des variations fréquentes du fait de la création et de la destruction des fichiers. La gestion
de ces blocs libres peut se faire de différentes façons :
- Le vecteur de bits (bit map) : le système d’exploitation gère un vecteur contenant autant de
bits que de blocs dans le disque. Chaque bit associé à un bloc est positionné à 0 si ce bloc est
libre, à 1 s’il est alloué.
Exemple : considérons un disque comportant 16 blocs numérotés de 0 à 15, avec les blocs 2, 3, 4,
8, 9, 13,14 et 15 libres. Le vecteur correspondant est 1100011100111000.
- La liste chaînée : dans chaque bloc libre, on place le numéro du bloc suivant (pointeur).
(Schéma)
22
Logiquement, un fichier devrait occuper des blocs consécutifs (allocation contiguë) ; mais dans la
réalité, c’est une opération difficile à réaliser. C’est pourquoi, on utilise des méthodes d’allocation
non contiguës plus souples et plus faciles à réaliser :
- Allocation chaînée : les blocs constituant un fichier donné sont chaînés, chaque bloc
contenant le numéro du bloc suivant ;
- Allocation indexée : ce mode évite la dispersion des pointeurs en rassemblant, dans une table,
la liste des blocs utilisés par un fichier. Il est donc possible d’accéder directement à l’un
quelconque des blocs d’un fichier.
Le répertoire est géré dynamiquement par le système d’exploitation qui peut créer, insérer, détruire,
modifier, rechercher ou fournir une liste des entrées. Grâce au répertoire, il n’est pas possible de créer
un fichier déjà existant où détruire un fichier qui n’existe pas. Le lancement de ces opérations
nécessite au préalable une vérification dans le répertoire.
Un répertoire organisé sur un niveau contient tous les noms de fichiers gérés par le système.
Sur deux niveaux, on a un répertoire système (Master file directory) qui contient les pointeurs vers
les répertoires utilisateurs.
(Schéma)
Les opérations sur les fichiers comprennent, d’une part, les opérations sur les fichiers (création,
destruction, etc.), d’autre part, les opérations sur les articles (lecture, écriture, modification, etc…).
23
En ce qui concerne les opérations de lecture, d’écriture et de modification, elles consistent à
rechercher d’abord le bloc qui contient l’article, puis à effectuer l’opération proprement dite.
L’accès aux informations est plus ou moins rapide suivant le mode. Les modes d’accès les plus
couramment utilisés sont :
- L’accès séquentiel : ce mode d’accès permet seulement de lire (ou d’écrire dans) l’article
pointé. L’accès à un article est toujours précédé de l’accès aux articles qui le précèdent. Le
mode d’accès séquentiel est un mode hérité de l’époque où l’implantation physique des
fichiers se faisait sur bande magnétique ;
- L’accès direct : l’article recherché est repéré par son numéro d’ordre, indépendamment des
autres ;
(Schéma)
Tous les systèmes de fichiers consistent en une structure nécessaire au stockage et à la gestion de
données. Ils effectuent trois fonctions principales :
- Le suivi de l’espace alloué et libre ;
- La gestion des répertoires et noms de fichiers ;
- Le suivi de l’emplacement dans lequel les différentes parties de chaque fichier sont
physiquement stockées.
Outre ces principes de base, chaque système de fichiers a ses propres caractéristiques, souvent liées
au type de système d’exploitation et à la technologie employée. Avant d’étudier quelques-uns de ces
systèmes de fichiers, nous allons revenir sur quelques notions nécessaires à la compréhension du
fonctionnement d’un système de fichiers.
Le formatage est une opération qui consiste à organiser le disque dur de façon à le préparer à recevoir
les informations et à faciliter la recherche de celles-ci. On distingue le formatage physique et le
formatage logique.
Le formatage physique est la première étape. Il est normalement effectué par le fabricant. Il divise un
disque dur en éléments physiques de base, c’est-à-dire en pistes, secteurs et cylindres. Ces éléments
définissent la manière dont les données sont physiquement enregistrées et lues à partir du disque.
24
Le formatage logique place un système de fichiers sur le disque. Il peut être fait au moyen d’utilitaires
(FDISK, FORMAT par exemple, etc…). Avant que le disque soit logiquement formaté, il peut être
divisé en partitions.
V.1.2 Partitions
Une partition est une division du disque dur. Lors du formatage logique, on peut diviser le disque en
partitions (un disque a toujours au moins une partition). Il existe deux types de partitions : les
partitions principales et les partitions étendues. La division du disque en plusieurs partitions offre
une meilleure utilisation de l’espace disque et la possibilité d’installer plusieurs systèmes
d’exploitation sur un même disque.
Une partition principale peut contenir n’importe quel système d’exploitation, ainsi que des fichiers
(applications et données utilisateurs). Une partition principale est formatée logiquement pour utiliser
un système de fichiers compatible avec le système d’exploitation sur lequel il est installé.
Les partitions étendues ont été inventées pour contourner la limite imposée de quatre partitions. Une
partition étendue est une partition qui ne contient pas directement les informations, mais dans laquelle
on peut continuer à diviser l’espace disque en créant un nombre illimité de partitions logiques qui,
elles, contiendront les données.
(Schéma)
V.1.3 Amorçage
Lorsque l’on met l’ordinateur sous tension, ce sont les instructions contenues dans le BIOS qui sont
exécutées. Dans la dernière partie des instructions du BIOS, figure la routine d’amorçage. C’est cette
routine d’amorçage du BIOS qui tente de lancer le système d’exploitation en lisant l’enregistrement
d’amorçage du BIOS qui tente de lancer le système d’exploitation en lisant l’enregistrement
d’amorçage principal (MBR = Master Boot Record) à partir du premier secteur du premier disque
dur physique. Le MBR contient un programme d’amorçage principal et une table de partitions
décrivant les partitions du disque. Une fois le programme d’amorçage principal lu, le BIOS lui
transfère le contrôle. Celui-ci se charge ensuite d’examiner la table de partitions pour voir quelle
partition (principale) est active. Une fois cette partition active déterminée, le chargement du système
d’exploitation commence, celui-ci est suivi du démarrage du système. Ceci a lieu à partir de
l’enregistrement d’amorçage du premier secteur de la partition active.
Remarque : Certains systèmes d’exploitation peuvent être amorcés à partir d’une partition logique
(OS/2 par exemple).
25
V.2 PANORAMA
Le système de fichiers FAT est celui qui est normalement utilisé par DOS et Windows 95/98. Il peut
être utilisé par Windows NT et OS/2. Le système FAT se caractérise par l’utilisation d’une table de
216 (65536) entrées maximum et de clusters (ensembles de secteurs physiques du disque,
généralement de 512 octets) qui représentent la plus petite unité de stockage de données. Ainsi, une
structure de données permet au système de gérer l’espace disque, les zones libres, occupées et leur
allocation à des fichiers ou répertoires. Lorsque le système de fichiers a besoin d’espace disque, il
s’alloue des clusters.
Le système FAT utilise un répertoire racine qui peut recevoir un nombre maximal d’entrées de
répertoires autorisées et qui doit se trouver en un endroit spécifique. Lorsque l’on crée un fichier ou
un sous-répertoire, les informations y relatives sont stockées dans le répertoire racine sous forme
d’entrée de répertoire. Ainsi, une entée de répertoire FAT contient les informations telles que le nom
et la taille du fichier, la date et l’heure à laquelle les dernières modifications ont été apportées, le
numéro du cluster de départ et les attributs du fichier (caché, système, etc.).
Le système FAT est un système de fichiers très mauvais en matière de sécurité. On ne peut pas faire
d’audit, pas de gestion des droits, mais la fonction UNDELETE est implantée.
Le système FAT (FAT 16) ne peut gérer qu’une partition de 2Go maximum. Pour une partition de
1Go, la taille du cluster est de 32Ko ; ainsi, un fichier de 100 octets utilise un cluster entier (31 Ko
perdus). Plus la taille du cluster d’une partition est grande, plus il y’a perte d’espace.
Le système FAT32 est le système de fichiers utilisé par les versions mises à jour de Windows 95 et
Windows 98 (et même OS/2 et LINUX). Il est basé sur des entrées des tables d’allocation de fichiers
de 32 bits plutôt que de 16 bits pour FAT 16. FAT32 est capable de gérer des volumes allant jusqu’à
2 Téraoctets ; il utilise des clusters plus petits (par ex, 4ko pour des volumes allant jusqu’à 8 Go).
C’est un système de fichiers utilisé par Windows NT. Il n’est pas recommandé avec des disques de
capacité inférieure à 400 Mo car il utilise une grande quantité d’espace pour les structures du système.
Sur NTFS, la table de fichiers permanente (MFT= Master File Table) constitue la structure centrale.
Des copies multiples de la partie critique de la table de fichiers sont conservées de manière à se
protéger d’une perte de données éventuelle.
NTFS peut gérer jusqu’à 16 milliards de Go. Il utilise des clusters pour stocker des données, mais il
n’y a plus dépendance entre la taille des clusters et celle du volume. On peut spécifier des clusters de
taille inférieure à 512 octets. Ce qui réduit la quantité d’espace perdu, ainsi que la fragmentation des
fichiers.
26
NTFS gère la réparation automatique des secteurs défectueux qui sont détectés et signalés de manière
à ce qu’ils ne soient pas utilisés. En matière de sécurité, NTFS permet d’associer des droits (lecture,
écriture, effacement, etc.) à chaque fichier, groupe de fichiers ou répertoires, ainsi qu’à chaque
utilisateur. Il permet de faire des audits sur les fichiers ou répertoires, ce qui permet de savoir qui a
effectué une opération sur un fichier. NTFS possède également des fonctions de tolérance de pannes
et de RAID.
C’est le système de fichiers utilisé par le système d’exploitation OS/2 d’IBM, HPFS trie les
répertoires sur la base des noms de fichiers et utilise une structure plus efficace pour organiser le
répertoire. Ce qui se traduit par un accès aux fichiers plus rapide.
Quant à l’utilisation de l’espace disque, HPFS attribue les données à des secteurs plutôt qu’à des
clusters. Pour conserver la trace des secteurs utilisés et ceux qui ne le sont pas, HPFS organise un
volume en bande de 8 Mo, avec une allocation de bitmaps de 2 Ko entre les bandes. Les bandes
améliorent la performance car les têtes de lecture/écriture n’ont pas à revenir à la piste zéro chaque
fois que le système d’exploitation a besoin d’accéder à des informations relatives à l’espace volume.
a) Linux Ext2
Ce système de fichiers a été développé pour les systèmes d’exploitation Linux (version gratuite
d’UNIX). Il gère une taille de volume d’un maximum de 4 téraoctets.
b) NetWare
Ce système de fichiers a été spécialement conçu pour être utilisé avec les serveurs NetWare.
27
Chapitre IV LA GESTION DES ENTREES-SORTIES
Les opérations d’entrée/sortie permettent à l’ordinateur d’échange les informations avec l’extérieur.
Elles sont réalisées par des programmes inclus dans le système d’exploitation et qui constituent ce
qu’on appelle le système d’entrée/sortie. Le rôle de ce module est de faire face à un certain nombre
de problèmes liés aux opérations d’entrée/sortie tels que :
- La diversité fonctionnelle de unités périphériques (disque, imprimante, clavier, etc…) :
- la différence de vitesse entre les différentes unités ;
- La différence entre les méthodes d’accès aux unités
- la différence des conditions de partage de périphérique (le disque est partageable par plusieurs
processus alors que le terminal n’est partageable qu’entre processus d’un utilisateur, l’imprimante est
partageable dans le temps, etc. …) ;
- le contrôleur d’erreur ;
- la complexité des systèmes de liaison entre périphériques et unité centrale (DMA, canaux, bus ;
unités de commande, unités de télécommunication, etc.) ;
- la protection des utilisateurs ;
- la nécessité d’une indépendance de programmes vis à vis des unités périphériques.
Côté utilisateur, il s’agit d’entrées-sorties logiques (ou virtuelles) à l’aide de commande de haut
niveau telles que READ, WRITE, PRINT. Ces opérations, le système d’exploitation les transforme
en entrées-sorties physiques (ou réelles) car il est seule habilité à effectuer les opérations d’entrées-
sorties. Ces opérations sont effectuées en mode système, mode dans lequel on exécute des instructions
privilégiées (telles que sont les instructions d’entrée-sortie).
I- ENTREES-SORTIES PHYSIQUE
Les deux opérations de base à réaliser sont d’une part, de sélectionner et d’adresser individuellement
les périphériques d’entrée-sortie et, d’autre part, d’effectuer un transfert d’information, vers ou depuis
le périphérique.
La première de ces opérations est essentiellement effectuée au niveau du matériel ou des signaux de
contrôle, les adresses des périphériques et les données sont transmis sur des lignes.
Le second fait intervenir des éléments matériels et des modules du système. Parmi les méthodes
utilisées pour le transfert, on peut citer celles utilisant l’accès direct à la mémoire ou les canaux de
commande.
I.1 ACCES DIRECT A LA MEMOIRE
I .2 CANAL DE COMMANDE
Sur des machines plus élaborées, les circuits de contrôle sont remplacés par un processeur autonome,
capable d’exécuter des programmes (avec toutefois un jeu restreint d’instructions). On appelle ce
processeur un canal de commande (command channel) et on parle de programme de canal. Les
programmes de canal sont rangés en mémoire centrale. Le système d’exploitation initialise une
opération d’entrée-sortie en voyant une commande spéciale au canal de commande,
qui lui indique où trouver le programme de canal et qui en lance l’exécution. L’exécution du
programme de canal et celle de l’entrée-sortie se poursuivent indépendamment de l’unité centrale de
traitement. Il faut noter que le canal de commande s’occupe également de la vérification de l’intégrité
des informations échangées.
Les types de périphériques sont extrêmement nombreux. Ils se distinguent par la vitesse, le mode de
transfert, le type d’informations transférées, etc. Un type de périphérique existe en plusieurs modèles
qui peuvent être produits par des constructeurs différents. Comme on le voit, chaque périphérique a
ses propres particularités.
Pour résoudre le problème de la diversité des unités et les conséquences qui en découlent, le système
d’exploitation s’efforce de traiter les périphériques de la même manière. Pour cela les processus
utilisateurs ne doivent pas directement traiter avec les périphériques d’entrée/sortie réels, mais avec
des intermédiaires appelés périphérique d’entrée/sortie virtuels ou flots, une correspondance est
établie entre flots et périphériques réels. Une table de descripteur de flots indique pour chaque flot le
périphérique correspondant. Cette table indique également si les périphériques sont actuellement
alloués ou non.
Les traiteurs spécifiques aux différents périphériques sont assurés par des modules spécialisés appelés
pilotes ou conducteurs de périphériques (device driver). C’est dans ces modules que les
caractéristiques spécifiques de périphériques sont prises en compte.
Avec l’utilisation des périphériques d’entrée-sortie virtuels, du point de vue de l’utilisateur, il n’ya
aucune différence entre écrire sur un disque ou sur une imprimante.
Au niveau utilisateur on dispose d’un jeu d’instructions d’entrée/sortie virtuelles (READ, WRITE,
PRINT). Mais au niveau machine l’exécution de ces instructions d’entrée/sortie n’est assurée que par
le système d’exploitation ; c’est-à-dire l’exécution d’une entrée/sortie se fait par l’activation d’une
29
requête au superviseur (system call, supervisor call, SVC). Après la reconnaissance de l’appel au
superviseur, il y une interruption qui est générée. Il s’en suit alors un certain nombre d’opération :
- Reconnaissance de l’opération : non du flot, nature de l’opération, quantité d’informations à
transférer, la source et la destination du transfert.
- Consultation de la table de description de flots pour déterminer quel périphérique réel est concerné ;
test de la consistance des paramètres d’une part avec le type, d’autre part avec le contenu de
descripteur du périphérique.
- Consultation de la file d’attente associée au périphérique ; 3 cas possibles (utilisables, en attente ou
en travail). Dans le cas des systèmes multiprogrammés, il se peut que d’autres processus soient déjà
en attente du même périphérique ; le bloc de contrôle du processus est alors ajouté à la file d’attente
du périphérique.
- Si le périphérique est utilisable, il y activation du périphérique qui réalise effectivement l’opération,
(par accès direct à la mémoire ou programme de canal).
- Lorsque l’entrée sortie est terminée, le périphérique concerné génère une interruption, il s’en suit
l’exécution d’un traitant (handler).
- Vérification, par le traitant, de la terminaison correcte de l’opération d’entrée-sortie.
A chaque type de périphérique est associée une table appelée descripteur de périphérique qui décrit
les caractéristiques du périphérique. Si celui-ci comprend plusieurs unités (cas du contrôleur de
terminaux à plusieurs lignes), une table appelée descripteur d’unité sera associée à chaque unité.
Chaque demande d’entrée-sortie est transformée en un paquet d’informations (stocké dans un pool
mémoire) qui contient des informations telles que :
- L’adresse mémoire d’une zone tampon ;
- La longueur de l’entrée-sortie ;
- Le type de l’entrée-sortie (lecture ou écriture) ;
- L’adresse du programme d’un mot d’état destiné à recevoir le statut final de l’exécution de
l’opération ;
- Le numéro du drapeau que le système positionnera à la fin de l’opération ;
- En option, l’adresse d’une routine fournie par le programme que le système exécutera à la fin
de l’opération.
30
Le CPU est l’organe qui effectue des traitements dans l’ordinateur. A un instant donné, il ne peut
effectuer qu’un seul traitement. Ainsi donc, il ne peut y avoir, à un instant donné, qu’un seul processus
en exécution, quel que soit le nombre de processus sollicitant une exécution par le CPU. Seul est
exécuté le processus auquel le CPU est alloué ; les autres doivent attendre que le CPU leur soit alloué.
Le processus en exécution est choisi parmi plusieurs processus ; ce choix est effectué en fonction
d’une politique d’allocation qui tient compte d’un certain nombre d’éléments. De nombreux systèmes
d’exploitation ont été développés à travers le monde, chacun avec ses caractéristiques ; deux grandes
tendances se dégagent :
- Systèmes mono-tâches. Ils exécutent un processus jusqu’à la fin avant de passer à un autre. Il
s’agit en particulier de systèmes monoprogrammés (un seul programme chargé en mémoire
centrale) ;
- Systèmes multi-tâches. Ils gèrent plusieurs processus (ou tâches) à la fois, ceux-ci se partagent
alternativement le contrôle du CPU. Ce sont des systèmes multiprogrammés.
Remarque : les notions de mono-tâche et multi-tâche ne doivent pas être confondues avec celles de
mono-utilisateur et multi-utilisateur.
I-SYSTEMES MONO-TÂCHES
Un système mono-tâche gère un seul processus à la fois. Lorsque le système alloue le CPU au
processus, le CPU est entièrement à sa disposition jusqu’à la fin de son exécution. Il peut arriver, qu’à
un instant donné, le processus suspende momentanément son exécution, perdant ainsi le contrôle du
CPU, parce qu’il est en attente d’une ressource autre que le CPU (cas d’une entrée-sortie par
exemple), ce dernier ne sera pas alloué à un autre processus mais restera inactif. L’exécution
reprendra dès que le processus sera en possession de la ressource attendue. Ce n’est qu’à la fin de
l’exécution du processus en cours que le CPU sera alloué à un autre processus.
Soit un processus P associé au programme PGM en exécution ; si le programme PGM contient des
instructions d’entrée-sortie, l’exécution des calculs et des entrées-sorties est donnée par le schéma
suivant :
(Schéma)
II-MULTIPROGRAMMATION SIMPLE
L’objectif de la multiprogrammation est le partage des ressources de l’ordinateur entre les différents
travaux en présence. Parmi ces ressources qui ont des vitesses très différentes, on peut citer le CPU.
L’idée est de ne pas laisser inactif pendant un long temps. Ainsi, lorsqu’un processus qui détient le
contrôle du CPU est en attente d’une autre ressource, on peut lui retirer ce contrôle et allouer le CPU
à un autre processus qui est en attente du CPU. On obtient ainsi un parallélisme entre l’utilisation du
CPU et celle d’une autre ressource.
En multiprogrammation simple, le processus qui prend le contrôle du CPU garde le contrôle jusqu’à
ce qu’un des événements suivants ait lieu :
31
Lorsqu’un de ces événements se produit, le CPU est alloué à un autre processus. Dans le cas d’une
entrée sortie, le processus qui a perdu le contrôle du CPU reprendra le contrôle de celui-ci plus tard.
(Schéma)
Dans les systèmes à temps partagé, une cause supplémentaire de perte de main s’ajoute : la tranche
de temps (time slice). Afin de ne pas pénaliser certains utilisateurs en laissant un seul processus
prendre le contrôle du CPU, l’allocateur répartit le temps CPU entre les différents processus. Ces
processus sont classés par ordre de priorité. Cette priorité est attribuée par le planificateur selon
l’urgence du traitement et les ressources requises ; elle est ensuite modifiée dynamiquement sur la
base de certains critères de choix entre deux exécutions partielles.
Ainsi donc, le processus perd la main dans les trois cas suivants :
- Terminaison normale ;
- Exécution d’une entrée-sortie ;
- Expiration du temps alloué.
Les états d’un processus sont toujours en exécution (ou élu ou actif), prêt (ou éligible) et bloqué (ou
en attente). Mais le schéma de transition des états est le suivant :
(Schéma)
Chaque processus pris en compte par le système s’accompagne d’un ensemble d’informations que
l’on appelle le contexte (ou environnement). Le contexte est rangé dans une structure appelée Bloc
de contrôle du processus (process control block ou BCP). Cette structure contient les informations
suivantes :
- L’état du processus ;
- Le numéro qui l’identifie ;
- La valeur du compteur ordinal ;
- Les valeurs des registres
- Des informations relatives à la quantité de mémoire allouée au processus et des pointeurs vers
cette mémoire ;
32
- Des informations quantitatives telles que le temps CPU utilisé, le temps restant autorisé ;
- Des informations concernant les opérations d’entrée-sortie du processus (périphériques alloués,
opérations en attente de complétion, fichiers ouverts…) ;
- Des informations concernant des files d’attente où figure le processus (périphériques alloués,
opérations en attente de complétion, fichiers ouverts…) ;
- Des informations concernant les files d’attente où figure le processus (numéros de priorité,
pointeur vers ces files…)
Le BCP est sauvegardé si le processus perd le contrôle du CPU, ce qui permet de reprendre
l’exécution du processus comme s’il n’avait pas été interrompu à la prise en main suivante du CPU.
IV-ALGORITHMES D’ORDONNANCEMENT
C’est l’allocateur qui est responsable de l’attribution du CPU aux différents processus. Le choix du
processus dépend de l’algorithme d’ordonnancement défini par les concepteurs du système
d’exploitation.
L’algorithme de choix utilise un certain nombre de paramètres pour prendre des décisions :
- Le concept de préemption : lorsqu’un processus « important » passe dans l’état prêt, il faut
que l’algorithme décide si l’on arrête l’exécution du processus en cours (même s’il n’a pas
encore épuisé sa tranche) pour donner la préférence au processus « important » et dans quel
délai cette opération doit se faire.
Les processus sont rangés par ordre croissant dans la liste des processus prêts. C’est le premier sur la
liste qui est choisi ; il garde le contrôle du CPU soit jusqu’à ce qu’il se termine, soit jusqu’à ce qu’il
se bloque lui-même, soit jusqu’à l’expiration de la tranche de temps. C’est le planificateur qui attribue
les priorités. Généralement chaque processus (ou classe de processus) a une priorité de base ; ensuite,
cette priorité est modifiée dynamiquement pour permettre à tous les processus de prendre le contrôle
du CPU.
Les processus sont ordonnancés selon l’ordre d’arrivée. C’est le processus le plus ancien qui est
sélectionné pour prendre le contrôle du CPU.
Appelé également algorithme SJF (Shortest Job First), il sélectionne le processus dont le il suppose
que le temps de traitement sera le plus court. En cas d’égalité, l’ordonnancement FCFS peut être
utilisé. Le SJF présente l’inconvénient de favoriser les processus les plus courts. Cela peut conduire
à des situations de famine.
C’est la version préemptive du SJF ; on l’appelle SRT (Shorstest Remaining Time). Chaque fois
qu’un nouveau processus entre dans le système, l’ordonnanceur compare la valeur estimée de son
temps de traitement à celle du temps restant du processus en cours. Si le temps du processus arrivant
est inférieur, celui-ci prend le contrôle du CPU.
e- Le tourniquet
Cette méthode n’utilise pas les priorités. Ici, on prend le premier de la liste des processus prêts, on lui
donne une tranche de temps CPU puis on le met en queue de liste à l’expiration de la tranche de
temps.
(Schéma)
(Schéma)
Certains systèmes sont spécialisés dans la conduite d’applications particulières. Ce qui modifie
légèrement leurs structures et fonctionnement. On peut citer par exemple :
- Des systèmes temps réel ;
- Des systèmes transactionnels.
34
On peut définir une ressource comme un élément nécessaire pour mener à bien l’exécution d’un
processus.
Les ressources peuvent être matérielles (CPU, mémoire, dispositifs d’entrée-sortie, etc…) ou
logicielles (éditeurs, compilateurs, bibliothèques de fonctions, etc…). Ces ressources sont en quantité
limitée et doivent être partagées entre différents processus. Le système doit donc mettre en place des
stratégies de répartition et d’allocation afin de satisfaire les demandes formulées par les différents
processus. Ces stratégies tiennent compte de plusieurs critères. En effet, les ressources peuvent être
classées de différentes manières :
• Assurer une bonne utilisation des ressources. Comptabiliser et fournir des statistiques sur
l’exploitation des ressources principales ;
• Permettre à chaque processus d’obtenir des ressources nécessaires dans des limites de temps
raisonnables ;
• Exclure mutuellement les processus qui demandent une même ressource non partageable et
éviter les situations de blocage (attente sans fin d’une ressource par plusieurs processus).
Certaines ressources sont regroupées en classe de ressource. On appelle classe de ressource le couple
constitué d’une collection d’éléments regroupés sous un nom commun et de l’ensemble des
opérations que l’on peut leur appliquer. On peut par exemple parler de classe imprimante, classe
mémoire centrale, etc… Une demande de ressource peut se faire pour une classe ou une unité d’une
classe. Suivant le cas, la demande peut être satisfaite ou non. Pour cela, le système gère une table qui
permet d’indiquer si la ressource est disponible ou non, et, si elle est allouée, à quel processus. Pour
chaque ressource, il est indiqué la quantité totale gérée par le système et la quantité déjà utilisée.
Lorsqu’une demande ne peut être satisfaite, celle-ci (c’est-à-dire le BCP du processus) est rangée
dans la file d’attente associée à la ressource.
(Schéma)
Dans certains cas. On autorise une opération supplémentaire sur certaines ressources : la réquisition.
Lorsqu’une ressource est allouée et qu’une demande survient de la part d’un processus prioritaire,
cette ressource peut être retirée au processus en cours et attribuée au processus, Naturellement, l’état
de la ressource doit être sauvegardé en cas de réquisition, de sorte qu’elle puisse ensuite être rendue
au premier processus.
35
Démarrage d’un ordinateur consiste en un ensemble d’opérations préalables avant toute utilisation
d’’un ordinateur. Parmi celles-ci, il y a le chargement du système d’exploitation en mémoire centrale.
Sans la présence du système d’exploitation (ou une partie de celui-ci) en mémoire centrale, il est
impossible d’utiliser l’ordinateur. L’opération de chargement a lieu soit à partir d’une ROM soit sur
un support externe (disque, CD, bande…). Le démarrage d’un micro-ordinateur ne nécessite
généralement pas de connaissances très poussées, tandis que celui d’un gros ordinateur est effectué
par une équipe spécialisée.
Lorsque l’on met l’ordinateur sous tension, ce sont les instructions intégrées dans le BIOS (Basic
Input/Output System) qui sont exécutées, c'est-à-dire, un programme qui contient les informations de
démarrage est exécuté par le CPU. Ce programme contient une routine qui permet de lancer le
système d’exploitation stocké dans un enregistrement spécifique d’un disque. Dans le BIOS, est
indiqué l’ordre dans lequel sont examinés les disques susceptibles d’héberger le système
d’exploitation. Un programme d’amorçage examine la table de partitions du disque pour déterminer
à partir de quelle partition (principale) peut-on démarrer le système d’exploitation. Une fois cette
partition déterminée, le chargement du système d’exploitation peut commencer ; celui-ci est suivi du
démarrage effectif du système. La dernière partie du démarrage consiste en l’exécution de certains
fichiers qui contiennent des informations de configuration (informations sur les quotas, les droits, le
nombre maximum d’utilisateurs simultanés, etc.
La fin du démarrage est indiquée par un message d’invitation (ou un menu particulier) que le système
affiche, ouvrant ainsi à l’utilisateur l’ensemble des services qu’il propose. C’est à partir de ce moment
que l’utilisateur peut dialoguer avec le système.
L’interface utilisateur est le module du système d’exploitation qui permet le dialogue homme-
machine. Du côté de l’utilisateur on s’adresse au système en lançant une commande ; celle-ci est
ensuite examinée, interprétée puis exécutée. La réponse du système est l’affichage du résultat de
l’exécution de la commande. Une fois la commande exécutée, pour permettre à l’utilisateur de
soumettre une nouvelle commande, le système affiche un message invitant l’utilisateur à soumettre
de nouvelles requêtes.
Suivant les systèmes, l’interface utilisateur se présente sous l’une des deux formes suivantes :
l’interface basée sur le langage de commandes et l’interface graphique. Certains systèmes combinent
les deux.
a) Commandes Principales
b) Commandes cataloguées
Pour éviter d’entrer toujours les mêmes commandes, il est possible de grouper un ensemble de
commandes en leur donnant un nom.
Exemple : on peut remplacer la séquence COMPILE, LINK, LOAD, RUN par EXEC.
Jusqu’au début des années 80, toutes les interfaces utilisateurs étaient basées sur des langages de
commandes où pour chaque action à effectuer, l’utilisateur devait connaître le nom de la commande
et la taper sur un clavier. A partir de travaux effectués dans les laboratoires de XEROX Park, un
nouveau type d’interface utilisateur est né : celui des interfaces graphiques (GUI : Graphical User
Inter), basés sur l’utilisation d’un écran graphique. Ainsi, de nouveaux concepts sont apparus, les
principaux étant ce de fenêtres, d’icônes, de menus déroulants, de souris. Etc… L’utilisateur n’est
plus obligé de connaître le nom d’une commande ou de la taper car celle-ci est proposée dans un
menu ; il ne lui reste plus qu’à la choisir pour que celle-ci soit exécutée par le système.
On distingue deux modes d’exécution des travaux : le mode conversationnel et le mode différé.
a) Le mode conversationnel
C’est généralement le mode réservé pour des travaux courts ou des mises au point des programmes.
L’utilisateur lance un travail (commande par commande) et attend une réponse immédiate à chaque
commande. Ce mode de soumission est adapté au système à temps partagé.
b) Le mode différé
Appelé généralement batch (par abus de langage), ce mode est réservé aux gros travaux de production
dont le résultat n’est pas attendu dans l’immédiat ; ce qui permet d’optimiser la charge de la machine.
C’est le système qui choisit le meilleur moment de lancement du travail.
Le travail (job) à soumettre est préparé complètement à l’avance sous forme d’une suite d’étapes
distinctes, chaque étape correspondant à une action globale à réaliser. Le dialogue avec l’utilisateur
étant coupé dès la soumission du travail, il importe donc à l’utilisateur de spécifier, dans le fichier de
commandes, toutes les informations nécessaires à l’exécution du travail.
37
III.2 LA GESTION DES TRAVAUX
Les travaux soumis au système peuvent l’être suivant les deux modes décrits ci-dessus. Cette
soumission s’accompagne d’un certain nombre d’éléments et se déroule en plusieurs étapes.
Un travail passe par les étapes suivantes : l’introduction, la planification, l’exécution et la sortie.
L’étape de planification (scheduling) a pour rôle de planifier les jobs en fonction de divers
paramètres :
• Les classes de travaux et leurs priorités de planification (chaque classe possède une priorité
vis-à-vis des autres classes) ;
• Le nombre de travaux possibles dans le système.
NB : les éléments (critères de sélection) que l’on vient de citer peuvent être modifiés par un opérateur.
Une fois le job sélectionné, c’est l’étape d’exécution qui commence. Au cours de cette étape le
système va :
• Affecter les ressources nécessaires (mémoires, fichiers, etc…) ; certaines ressources peuvent
être explicitement déclarées lors de la soumission ou implicitement consommées par le
système ;
• Charger les modules du programme ;
• Exécuter le travail en concurrence avec les autres ;
• Libérer les ressources à la fin de l’exécution.
La dernière étape est la sortie où la fin de l’exécution est signalée et les fichiers de résultats sont
imprimés.
Remarque : Le passage dans les différentes étapes ci-dessus décrit est celui d’un déroulement
normal. En effet, après s’être introduit dans le système, un travail peut être bloqué par l’opérateur ou
un autre travail, ce qui le prive d’une sélection éventuelle. En phase d’exécution, un travail peut être
temporairement suspendu par l’opérateur ou le système. Ainsi, son exécution ne reprendra qu’une
fois cette suspension levée