Vous êtes sur la page 1sur 51

REPUBLIQUE DEMOCRATIQUE DU CONGO

MINISTERE DE L’ENSEIGNEMENT SUPERIEUR ET UNIVERSITAIRE


INSTITUT SUPERIEUR D’INFORMATIQUE ET TELECOMMUNICATIONS
ISICOM/KOLWEZI

NOTE DE COURS : SYSTEMES D’EXPLOITATION


Destiné aux étudiants de Bac 2 Informatiques
Par Jean-Axel Mbaya

FEVRIER 2024
1
INTRODUCTION
Pourquoi un système d’exploitation
Le système d’exploitation est l’élément essentiel qui relie la machine, composée
d’éléments physiques comme le microprocesseur, le disque dur ou les barrettes
mémoire, et l’utilisateur qui souhaite effectuer des calculs. Sans système d’exploitation,
chaque utilisateur serait obligé de connaître le fonctionnement exact de la machine
sur laquelle il travaille et il serait, par exemple, amené à programmer directement un
contrôleur de périphérique USB pour pouvoir enregistrer ses données sur une clé USB.
Sans le contrôle du système d’exploitation, les utilisateurs pourraient aussi détruire
irrémédiablement certaines données stockées sur un ordinateur, voire détruire certains
périphériques – comme le disque dur – en programmant des opérations illicites.
Les systèmes d’exploitation jouent donc un rôle majeur dans l’utilisation d’un
ordinateur et si l’outil informatique s’est répandu dans le monde entier, c’est certes
grâce à l’abaissement des prix d’achat et grâce à l’augmentation de la puissance des
ordinateurs, mais c’est surtout grâce aux progrès réalisés lors des cinquante dernières
années dans la programmation des systèmes d’exploitation : avec une machine de
puissance équivalente, la moindre opération sur un ordinateur qui aujourd’hui nous
paraît triviale était alors proprement impossible à réaliser !

Pourquoi étudier les systèmes d’exploitation ?


Avant de se lancer à corps perdu dans l’étude des systèmes d’exploitation, il est
raisonnable de se demander ce que cette étude peut nous apporter. Précisons tout
d’abord que ce document est à l’origine le support écrit d’un cours proposé en Bac 2 à
ISICOM. Les raisons évoquées ci-dessous s’adressent donc à tous les étudiants non
spécialisés en informatique qui exerceront rapidement des métiers d’ingénieur à
responsabilité.
Tous les ingénieurs issus de grandes écoles généralistes auront à utiliser l’outil
informatique dans leur métier. Bien entendu, suivant le métier exercé ou suivant
l’évolution de la carrière de chacun, cette utilisation sera plus ou moins fréquente et
certains ne feront que tapoter de temps en temps sur leur clavier alors que d’autres
passeront des heures à se battre avec (contre) la machine.
Quel que soit le profil choisi, tous les ingénieurs de ISICOM se retrouveront dans une
des trois 3 catégories suivantes.
❖ L’utilisateur : comme son nom l’indique, la seule préoccupation de l’utilisateur est
d’utiliser sa machine. Son désir le plus vif est que celle-ci se mette à fonctionner
normalement quand il l’allume et que ses logiciels favoris lui permettent de
travailler correctement.
❖ Le décideur : il prend les décisions vitales concernant les choix stratégiques et
commerciaux de l’informatique d’entreprise. C’est lui qui décidera par exemple
s’il vaut mieux acheter un gros ordinateur relié à 50 terminaux ou s’il est
préférable d’acheter 50 micro-ordinateurs connectés en réseau. Souvent le
décideur se fonde sur les besoins exprimés par les utilisateurs pour prendre sa
décision.

2
❖ Le programmeur : il cherche à tirer le meilleur parti de la machine qu’il
programme tout en perdant le moins de temps possible en développements. Le
programmeur cherche aussi à préserver ses programmes du temps qui passe et
tente de les réutiliser de machine en machine afin de ne pas tout recommencer à
chaque fois.
L’utilisateur et les systèmes d’exploitation
L’utilisateur doit connaître le fonctionnement et les capacités des systèmes
d’exploitation car c’est pour lui l’unique façon de savoir ce qu’il est en droit d’attendre
d’un ordinateur. En pratique, lorsqu’un utilisateur exprime ses besoins, il fait souvent
référence à des logiciels (ou à des machines) qu’il utilise déjà ou dont il a entendu
parler. Il est très rare qu’un utilisateur exprime ses besoins en dehors de tout contexte
commercial, c’est-à-dire sans citer d’exemples de logiciel ou de marque.
Connaître le fonctionnement des systèmes d’exploitation et des ordinateurs permet
donc à l’utilisateur d’exprimer ses besoins informatiques réels et non un sous-ensemble
réduit de ces besoins. Par ailleurs, connaître le fonctionnement de la machine permet
généralement d’adopter la bonne attitude quand celle-ci ne fonctionne pas exactement
comme on le désire et cela évite souvent d’entreprendre des actions quasi-mystiques,
voire totalement ésotériques, comme il arrive d’en voir dans certains cas.
Bien entendu, pour l’utilisateur, seuls les principes de fonctionnement comptent et il n’a
pas besoin de connaître les détails concernant tel ou tel système d’exploitation. Il est
néanmoins capital d’étudier un système d’exploitation complexe et efficace qui offre le
plus de services possibles (comme Unix par exemple) et l’utilisateur ne peut donc se
contenter d’étudier le système d’exploitation qu’il utilise habituellement.
Les décideurs et les systèmes d’exploitation
Le décideur doit s’enquérir des besoins des utilisateurs et prendre la décision d’achat
informatique (par exemple) adéquate. La connaissance des systèmes d’exploitation est
ici capitale pour – au moins – deux raisons : la réponse aux besoins des utilisateurs et
la pérennité des choix informatiques.
Pour répondre aux besoins des utilisateurs, le décideur doit connaître les possibilités
des machines et l’ensemble des logiciels disponibles (systèmes d’exploitation compris).
Il doit aussi connaître les différentes possibilités matérielles, les réseaux, etc. Par
ailleurs, il peut ou doit aider les utilisateurs à mieux définir leurs besoins en faisant
abstraction des références commerciales habituelles.
Par ailleurs, il ne faut pas que les choix du décideur lient le sort de son entreprise à un
fournisseur particulier, comme, par exemple, un fabricant d’ordinateurs : les fournisseurs
savent pertinemment qu’il est difficile pour une entreprise de changer de type de
machine et ils agissent alors en situation de quasi-monopole. Ils jouent sur le fait que
cela revient moins cher à l’entreprise de payer très cher ce matériel plutôt que de
changer de fournisseur.

3
Les programmeurs et les systèmes d’exploitation
La première préoccupation du programmeur est de ne pas refaire ce qui a déjà été fait,
c’est-à-dire de ne pas perdre de temps à (ré)écrire du code qui existe déjà. La
connaissance des systèmes d’exploitation est bien entendu extrêmement importante
dans ce cas-là et ceux-ci se présentent alors comme des bibliothèques de services
disponibles.
Tout bon programmeur doit prendre en compte deux autres problèmes : le portage ou
la portabilité de ses programmes et le choix du système d’exploitation à utiliser.
La portabilité d’un programme est l’ensemble des actions permettant d’adapter un
programme développé sur une machine donnée avec un système d’exploitation donné à
une autre machine dotée éventuellement d’un autre système d’exploitation.
Si le portage s’effectue immédiatement (ou au moins simplement), le programme est dit
portable.
Un des intérêts des systèmes d’exploitation est justement de rendre les programmes
plus facilement portables, en s’intercalant entre la réalité physique des machines et les
programmes des utilisateurs. Par exemple, en écrivant des programmes en langage C, le
programmeur n’a pas besoin de se soucier de la machine sur laquelle il travaille et il
pourra probablement porter son programme sur d’autres machines.
Le choix d’un système d’exploitation est donc crucial et, en particulier, il est préférable
de choisir le système qui assure le portage le plus facile sur le maximum de machines et
de systèmes d’exploitation.
Notons que le choix d’un système d’exploitation ne doit pas être confondu avec le choix
de la machine sur laquelle ce système fonctionne et, même si la plupart des
constructeurs de machine tentent d’imposer leur propre système en prétendant
qu’aucun autre système ne fonctionne sur les machines en question, le système
d’exploitation est un programme comme un autre : à ce titre, il se doit d’être portable et
ce serait une aberration de choisir un système d’exploitation non portable pour
développer des applications portables...

4
PLAN DU COURS
Introduction générale
Chapitre 1 : Rappel sur l’architecture des ordinateurs
Chapitre 2 : Le système d’exploitation
Chapitre 3 : Evolution des systèmes d’exploitation
Chapitre 4 : La gestion des processus
Chapitre 5 : La gestion de la mémoire
Chapitre 6 : Le système de fichiers
Conclusion

5
Chapitre 1 : RAPPEL SUR L’ARCHITECTURE DES ORDINATEURS
Introduction
L’architecture de l’ordinateur est le domaine qui s’intéresse aux différents composants
internes des machines, en explicitant leur construction et leurs interactions. Un
ordinateur est un outil complexe qui peut effectuer des tâches variées et dont les
performances globales dépendent des spécifications de tous ses éléments. Comprendre
son architecture permet de savoir dans quelle mesure les caractéristiques propres à
chaque composant influencent la réactivité de la machine en fonction de son usage :
pourquoi ajouter de la mémoire accélère-t-il l’ordinateur ? Pourquoi le temps d’accès
d’un disque dur n’est-il qu’un des paramètres permettant de mesurer son efficacité ?
Comment les processeurs font-ils pour aller toujours plus vite ?
Au cours de ce chapitre, nous nous limiterons à fournir les éléments permettant de
comprendre le fonctionnement d’un ordinateur et le rôle d’un système d’exploitation.
Quelques mots clés à utiliser :
Microprocesseur, processeur, mémoire, entrées/sorties, bus, registres, unité arithmétique
et logique (ALU, Arithmetic and Logic Unit), unité de gestion de mémoire (MMU, Memory
Management Unit), cache, coprocesseur, horloge, périphériques, contrôleur de
périphériques, interruptions, jeu d’instructions, adresse physique, adresse virtuelle,
page, segment.
2.1 Représentation symbolique et minimaliste d’un ordinateur
D’une façon symbolique, un ordinateur est représenté comme nous le montre la figure
ci-dessous et il se compose généralement : d’un en processeur qui effectue les calculs,
d’une unité de mémoire volatile qui permet de stocker les données et d’un certain
nombre de périphériques qui permettent d’effectuer des entrées / sorties sur des
supports non volatiles comme un disque dur, une clé USB ou un CD-ROM. Ces
composants dialoguent entre eux par l’intermédiaire d’un bus de communication.

Fig. 1 : Modèle d’architecture de Von Neumann


2.2 Représentation fonctionnelle d’un ordinateur
Afin de bien comprendre les conséquences de l’architecture des ordinateurs sur le
développement des systèmes d’exploitation, nous allons adopter une représentation
légèrement plus compliquée : l’architecture élémentaire d’un ordinateur représentée sur
la figure ci-dessous. Elle se compose d’un microprocesseur, d’une horloge, de

6
contrôleurs de périphériques, d’une unité de mémoire principale, d’une unité de
mémoire cache et de plusieurs bus de communication.

Fig. 2 : Structure fonctionnelle d’un ordinateur


• Le processeur : qui effectue tous les calculs, le contrôle des opérations, le
décodage des instructions...
• Le bus interne : il permet aux différents éléments du processeur de communiquer
entre eux.
• L’horloge : contrôle de la cadence de traitement des opérations qu’effectue ou
exécute le processeur, sa valeur est exprimée en Mhz ou Ghz
• La mémoire principale ou la mémoire vive, généralement appelée RAM (Random
Access Memory, traduisez mémoire à accès direct), est la mémoire principale du
système d'un espace permettant de stocker de manière temporaire des données
lors de l'exécution d'un programme.1
• La mémoire cache : stocke temporairement des informations, des données et des
programmes qui sont utilisés régulièrement par votre processeur. Lorsque ces
données sont requises, le processeur se tournera automatiquement vers la
mémoire cache à la recherche d'un accès plus rapide à ces données.2
• Les contrôleurs de périphériques : En réalité, le processeur ne communique pas
directement avec les périphériques : ceux-ci sont reliés à des contrôleurs de
périphériques et c’est avec eux que le processeur dialogue. Un contrôleur peut
gérer plusieurs périphériques et le processeur n’a pas besoin de connaître
précisément ces périphériques : s’il souhaite, par exemple, écrire une donnée sur
le disque dur, il le demande au contrôleur de disque dur et c’est ce dernier qui
se débrouille pour effectivement satisfaire la demande du processeur. Le
processeur transmet alors la donnée à écrire au contrôleur, le contrôleur la
stocke dans une mémoire tampon qu’il possède et la transmettra au disque dur.
• Les bus de communication : Un ordinateur possède généralement de nombreux
bus de communication spécialisés que l’on symbolise souvent comme étant un
seul bus. Il est traditionnel d’en citer au moins trois : le bus de données sur
lequel sont transférées les données à traiter, le bus d’adresses qui sert
uniquement à transférer les adresses des données en mémoire et le bus de
commandes qui permet de transférer des commandes entre le processeur et les

1
https://www.google.com/search?q=memoire+vive+ou+memoire+principale&sca
2
https://www.google.com/search?q=m%C3%A9moire+cache&sca
7
périphériques. Par exemple, lorsque le processeur désire lire une information
dans la mémoire principale, il envoie l’adresse de cette information sur le bus
d’adresses ; le bus de commande indique au contrôleur de la mémoire principale
qu’il doit donner l’information au processeur ; le contrôleur renvoie alors
l’information demandée sur le bus de données.
Mise à part ces 3 types de bus, nous avons encore :
o Le bus système, ou bus processeur, ou encore bus mémoire, souvent
connu sous le nom de FSB (Front Side Bus) permet de connecter le
processeur à la mémoire de type RAM ainsi qu’à d’autres composants. Les
communications sur ce bus système sont gérées par un composant
particulier de la carte mère : le Northbridge. C’est ce composant qui
conditionne souvent le chipset de la carte mère.
o Le bus de cache ou BSB (Back Side Bus) réalise la connexion entre le
processeur et la mémoire cache secondaire (cache L2 et cache L3) quand
celle-ci n’est pas directement intégrée au processeur.
o Le bus PCIe (Peripheral Component Interconnect Express) permet la
connexion de périphériques variés comme une carte vidéo, . . .

2.3 Performances des ordinateurs


Cette section sur les performances n’est pas directement liée à l’étude des architectures
des machines, ni à l’étude des systèmes d’exploitation. Néanmoins, les systèmes
d’exploitation interviennent aussi dans la mesure des performances des ordinateurs et
nous (r)établirons ici quelques vérités importantes pour le choix d’un ordinateur :
➢ La mesure des performances d’un processeur : cette mesure intéresse a priori le
constructeur d’ordinateurs car elle lui permet de choisir un processeur adapté
aux besoins de ses clients.
Notez que c’est malheureusement souvent cette mesure qui sert d’argument
publicitaire pour la vente d’ordinateurs.

➢ La mesure des performances d’une architecture d’ordinateur : cette mesure


intéresse assez peu de personnes et elle représente en fait la capacité du
constructeur d’ordinateurs à intégrer efficacement les composants d’un
ordinateur autour du processeur. Cette mesure devrait tenir compte des
performances du bus de communication, des performances des zones de
mémoire, du disque dur, etc. Elle donne en fait la mesure de la performance
maximale d’un ordinateur, quels que soient les moyens utilisés pour la mesurer.

➢ La mesure des performances d’un couple (ordinateur, OS) : cette mesure


intéresse en premier lieu l’utilisateur car elle représente directement la
performance qu’il peut attendre de sa machine et car elle correspond à la
sensation de rapidité (ou de lenteur) qu’à l’utilisateur devant son ordinateur.
Insistons sur le fait que le système d’exploitation intervient dans cette mesure et
que, donc, de mauvais résultats concernant cette mesure ne signifient pas
nécessairement que l’ordinateur ou les programmes utilisés sont mauvais.

8
1.4 Le BIOS ou l'UEFI
Le BIOS (Basic Input/Output System) est un ensemble de programmes enregistrés dans
la ROM. Il contient les programmes et les pilotes de démarrage utilisés pour permettre à
l'ordinateur de se mettre en route, il intègre aussi des routines de diagnostic et
d'autotest (POST : Power On Self Test).

Le matériel seul n'est pas autonome cependant ; il est même totalement inutile sans
qu'une partie logicielle permette d'en tirer parti. C'est le but du système d'exploitation
et des applications qui, de manière similaire, ne peuvent fonctionner sans un ordinateur
pour les exécuter.
Cette symbiose entre matériel et logiciel ne se fait pas d’elle-même. Lorsque l'ordinateur
est mis sous tension pour la première fois, une configuration initiale est requise. Ce rôle
est assumé par le BIOS ou UEFI, un logiciel intégré à la carte principale qui s'exécute
automatiquement à la mise sous tension. Sa tâche principale est de rechercher des
logiciels auxquels il peut céder le contrôle.
Dans le cas du BIOS, cela implique de rechercher le premier disque dur avec un secteur
de démarrage (également appelé master boot record ou MBR), de charger ce secteur de
démarrage, et l'exécuter. A partir de là, le BIOS n'est généralement plus impliqué
(jusqu'au prochain démarrage). Dans le cas de l'UEFI, le processus implique d'analyser
les disques pour trouver une partition EFI dédiée contenant d'autres applications EFI à
exécuter.
Le BIOS/UEFI contient également un logiciel appelé Setup, conçu pour permettre de
configurer certains aspects de l'ordinateur. Il permet notamment de choisir quel
périphérique de démarrage est préféré (par exemple, vous pouvez sélectionner une clé
USB ou un lecteur de CD-ROM au lieu du disque dur par défaut), de régler l'horloge
système, etc. Le démarrage du programme d'installation implique généralement
d'appuyer sur une touche très peu de temps après la mise sous tension de
l'ordinateur. Cette touche est souvent Del ou Esc, parfois F2, F5, F8 ou F10. La plupart
du temps, le choix est affiché à l'écran lors du démarrage. Sinon, il est préférable de
consulter le manuel de votre carte mère ou de votre ordinateur.
De nos jours, la plupart des nouveaux ordinateurs démarrent en mode UEFI par défaut,
mais ils prennent généralement également en charge le démarrage du BIOS pour une
compatibilité ascendante avec les systèmes d'exploitation qui ne sont pas prêts à
exploiter l'UEFI. C'est ce qu'on appelle le mode/module de support de
compatibilité (CSM). Mais plusieurs fabricants ont soit annoncé qu'ils cesseraient de
prendre en charge le mode BIOS existant dans leur implémentation UEFI, soit ils l'ont
déjà fait. Cette transition ne s’est toutefois pas faite sans discussions ni sans critiques.

9
Chapitre 2 : LES SYSTEMES D’EXPLOITATION

INTRODUCTION
Le système d'exploitation (SE) est un ensemble de programmes fondamentaux sur un
appareil informatique qui sert d'interface entre le matériel et les logiciels applications. Il
est souvent désigné par l'abrégé OS pour operating system en anglais. Le système
d'exploitation va gérer les disques durs, les périphériques, la mémoire, l'affichage, etc. et
permettre à l'utilisateur de lancer des programmes (messagerie, traitement de texte, …).
Le SE soustrait le matériel au regard du programmeur et offre une présentation
agréable des fichiers. Un SE a ainsi deux objectifs principaux :
• présentation : Il propose à l'utilisateur une abstraction plus simple et plus agréable
que le matériel : une machine virtuelle ;
• gestion : il ordonne et contrôle l'allocation des processeurs, des mémoires, des icônes
et fenêtres, des périphériques, des réseaux entre les programmes qui les utilisent. Il
assiste les programmes utilisateurs.
Il protège les utilisateurs dans le cas d'usage partagé.

Mots clés de ce chapitre : machine virtuelle, ressources, gestionnaire de ressources, CPU,


appel système, système monolithique, système en couches, noyau, micro-noyau,
services.

2. 1 DEFINITIONS ET CONSEQUENCES
Il y a différents ouvrages qui traitent sur ce sujet mais qui ne se mettent pas
d’accord sur la définition à donner au système d’exploitation. C’est pourquoi nous
donnerons ici quelques définitions formelles pour élucider nos idées sur le sujet.
Quelle que soit la définition que l’on peut au système d’exploitation, nous devons
retenir les deux approches distinctes des systèmes d’exploitation, à savoir : faciliter
l’accès à la machine, d’une part et de l’autre part, contrôler l’accès aux ressources de la
machine.
➢ Le système d’exploitation est une machine virtuelle
Le système d’exploitation en tant qu’une machine virtuelle, offre une interface de
programmation à l’utilisateur qui n’a donc pas besoin de connaître le fonctionnement
réel de la machine : l’utilisateur demande au système d’effectuer certaines tâches et le
système se charge ensuite de dialoguer avec la machine pour réaliser les tâches qui lui
sont demandées.
Dans cette optique, la machine réelle est en fait cachée sous le système d’exploitation
et ce dernier permet donc un dialogue abstrait entre la machine et l’utilisateur. Par
exemple, l’utilisateur se contente de dire « je veux écrire mes données dans un fichier
sur le disque dur » sans se préoccuper de l’endroit exact où se trouvent ces données, ni
de la façon dont il faut s’y prendre pour les copier sur le disque dur.

➢ Le système d’exploitation est un gestionnaire de ressources


Les ressources d’une machine sont tous les composants qui sont utilisés pour
effectuer un travail et qu’un utilisateur de la machine pourrait s’approprier. À ce titre,
tous les périphériques comme la mémoire ou les disques durs sont des ressources. Les

10
registres du processeur ou le temps passé par le processeur à faire des calculs 1sont
aussi des ressources.
Le système d’exploitation est un gestionnaire de ressources, c’est-à-dire qu’il contrôle
l’accès à toutes les ressources de la machine, l’attribution de ces ressources aux
différents utilisateurs de la machine et la libération de ces ressources quand elles ne
sont plus utilisées. Ce contrôle est capital lorsque le système permet l’exécution de
plusieurs programmes en même temps 2 ou l’utilisation de la machine par plusieurs
utilisateurs à la fois. En particulier, il doit veiller à ce qu’un utilisateur ne puisse pas
effacer les fichiers d’un autre utilisateur ou à ce qu’un programme en cours d’exécution
ne détruise pas les données d’un autre programme stockées en mémoire. Un autre
aspect capital du contrôle des ressources est la gestion des conflits qui peuvent se
produire quand plusieurs programmes souhaitent accéder en même temps aux mêmes
données.
La Commodité et l’efficacité
Les deux définitions ci-dessus adoptent deux points de vue diamétralement opposés et
le grand dilemme dans le développement des systèmes d’exploitation a été le choix
entre la commodité et l’efficacité.
Certes il est agréable de disposer d’un ordinateur commode, mais il ne faut pas oublier
que les ordinateurs sont de plus en plus fréquemment utilisés pour effectuer des tâches
critiques. Ainsi, autant il peut être acceptable qu’un ordinateur individuel « plante » de
temps en temps, autant il est rassurant de savoir que les ordinateurs contrôlant les
avions ou les opérations de chirurgie assistée sont d’une stabilité à toute épreuve,
quitte à ce que cela soit au détriment d’un commodité d’utilisation.
Il convient donc, d’une part, de garder ce dilemme à l’esprit pour effectuer des choix
raisonnables en fonction des circonstances, d’autre part, d’œuvrer pour le
développement de systèmes d’exploitation qui soient à la fois commodes et efficaces.

Mode utilisateur et mode noyau


Le système d’exploitation peut utiliser cette propriété pour faciliter le contrôle qu’il
exerce : il s’exécute en mode noyau alors que tous les autres programmes sont exécutés
en mode utilisateur. Ces programmes utilisateur ont ainsi par essence des pouvoirs
limités et certaines opérations leurs sont interdites.
Par exemple, en n’autorisant l’accès aux différentes ressources de la machine
qu’aux programmes s’exécutant en mode noyau, le système d’exploitation protège ces
ressources et contraint les programmes utilisateur à faire appel à lui (pas
nécessairement
de façon explicite) pour accéder aux ressources de la machine.

2. 2 LES CARACTERISTIQUES FONDAMENTALES D’UN SYSTEME D’EXPLOITATION


On peut classer les systèmes d'exploitation selon leurs caractéristiques fonctionnelles,
tel que le nombre de tâches (programmes) exécutées simultanément, le nombre
d’utilisateurs servis, le nombre de sessions ouvertes simultanément, … Le tableau
suivant présente les principales caractéristiques d’un système d’exploitation.

11
2. 3 LES APPELS SYSTEME
Sur les systèmes d’exploitation utilisant le mode noyau, tout programme utilisateur
doit faire explicitement appel aux services du système d’exploitation pour accéder à
certaines ressources.
A ces termes, le système d’exploitation propose une interface de programmation, c’est-
à-dire qu’il permet d’accéder à un certain nombre de fonctionnalités qu’il exécutera
pour l’utilisateur. Les appels système sont l’interface proposée par le système
d’exploitation pour accéder aux différentes ressources de la machine.
Par exemple, il est nécessaire de faire appel au système d’exploitation pour créer
un fichier sur le disque dur et cela via un appel système, si nous demandons que ce
fichier soit créé dans un répertoire qui nous est interdit d’accès, par exemple un
répertoire appartenant à un autre utilisateur, l’appel système va refuser de créer le
fichier.
Exécution d’un appel système
Un appel système provoque en fait une interruption logicielle et il suffit alors de
programmer la machine pour que la routine correspondant à l’interruption fasse partie
du système d’exploitation.
En pratique, il est fréquent que toutes les interruptions aient la même routine associée :
le système d’exploitation. Suivant le type d’interruption (matérielle ou logicielle) et
suivant la nature de l’interruption (erreur, travail terminé, etc.), le système décide alors
quelle action il doit entreprendre.
Toutefois, et afin de ne pas trop pénaliser les programmes effectuant des appels
système, le système d’exploitation utilise généralement des intermédiaires rapides et il
rend la main au programme avant d’avoir effectivement accompli l’action demandée.
Par exemple, si un programme demande l’écriture de données dans un fichier sur
disque dur, le système d’exploitation va copier ces données dans une mémoire tampon
qui lui appartient et va ensuite rendre la main au programme. Le système d’exploitation
écrira ces données sur le disque dur à un autre moment.

12
Pour l’instant, il est capital de retenir les faits suivants :
– un appel système permet de demander au système d’exploitation d’effectuer
certaines actions ;
– un appel système interrompt le programme qui l’exécute ;
– un appel système est exécuté en mode noyau même si le programme ayant
demandé son exécution est exécuté en mode utilisateur.
2. 4 STRUCTURE D’UN SYSTEME D’EXPLOITATION
Noyau des systèmes d’exploitation
Le système d’exploitation d’une machine n’est en pratique pas constitué d’un seul
programme. Il se compose d’au moins deux parties que l’on nomme souvent le noyau
(kernel en anglais), qui est le cœur du système (core en anglais), et les programmes
système. Le noyau est exécuté en mode noyau et il se peut qu’il corresponde à
plusieurs processus différents (2 ou 3 sous les systèmes Unix, par exemple).
Le modèle à couches
La relation entre la machine, le système d’exploitation et les programmes des
utilisateurs est toujours représentée sous forme d’empilement d’un certain nombre de
couches aux frontières bien définies : le système d’exploitation reliant la machine et
l’utilisateur, il s’intercale naturellement entre les couches représentant ces derniers.

Fig. 3 Représentation en modèle des couches d’un système d’exploitation


En pratique, il est toujours difficile de distinguer où finit le système d’exploitation et où
commence l’environnement utilisateur. Formulé différemment, il est toujours difficile de
dire si un programme s’exécutant en mode utilisateur fait partie du système
d’exploitation ou pas. En revanche, la limite entre le noyau et les programmes système
est claire : le noyau est toujours exécuté en mode noyau !
L’interface proposée par le noyau est l’ensemble des appels système et, comme tout
programme s’exécutant en mode utilisateur, les programmes système utilisent ces
appels.
L’objectif du modèle à couches est de s’éloigner de plus en plus des spécificités de
l’ordinateur et de son système d’exploitation pour s’approcher de plus en plus de
l’abstraction fonctionnelle dont a réellement besoin l’utilisateur.
13
Sur les systèmes bien conçus, chaque couche s’appuie ainsi sur la couche précédente
pour proposer de nouveaux services et il devient possible, par exemple, de transporter
le même environnement de travail d’un système d’exploitation à un autre : il suffit pour
cela que le « dessus » de la couche située en dessous soit le même.
2. 5 LES DIFFERENTS TYPES DE SYSTEMES D’EXPLOITATION
a. Les systèmes monolithiques
Le SE est un ensemble de procédures, chacune pouvant appeler toute autre à tout
instant. Pour effectuer un appel système, on dépose dans un registre les paramètres de
l'appel et on exécute une instruction spéciale appelée appel superviseur ou appel
noyau. Son exécution commute la machine du mode utilisateur11 au mode superviseur
ou noyau12 et transfère le contrôle au SE. Le SE analyse les paramètres déposés dans
le registre mentionné plus haut et en déduit la procédure à activer pour satisfaire la
requête. A la fin de l'exécution de la procédure système, le SE rend le contrôle au
programme appelant.
Généralement, un tel SE est organisé en 3 couches :
• une procédure principale dans la couche supérieure, qui identifie la procédure de
service requise
• des procédures de service dans la couche inférieure à la précédente qui exécutent les
appels système
• des procédures utilitaires dans la couche basse qui assistent les procédures système.
Une procédure utilitaire peut être appelée par plusieurs procédures systèmes.
N.B. une erreur à un endroit du noyau peut entraîner un dysfonctionnement à un autre
endroit qui, a priori, n’a rien avoir.
Ces inconvénients entraînèrent le développement de systèmes d’exploitation fondés sur
d’autres modèles.
b. Les systèmes à couches
Les systèmes à couches appliquent au noyau le principe des couches tel que nous
l’avons expliqué ci-dessus. L’idée consiste à charger chaque couche du noyau d’une
tâche bien précise et à proposer une interface pour les couches au-dessus.
Chaque couche masque ainsi les couches situées en dessous d’elle et oblige la couche
située au-dessus à utiliser l’interface qu’elle propose. L’avantage est évident : les
couches sont totalement indépendantes les unes des autres et seule l’interface entre
chaque couche compte. Cela permet de développer, de débugger et tester chaque
couche en se fondant sur les couches inférieures qui sont sûres.
Même si ce principe est séduisant, il est très complexe à mettre en œuvre et les
systèmes ainsi structurés sont souvent très lourds et peu performants.

• La couche 0 concerne l'allocation du processeur, passant d'un processus à un


autre en cas d'interruption ou d'expiration du temps alloué (voir plus loin le
chapitre "Allocation du/des processeur(s)"),

14
• Au-dessus, la couche 1 considère que tous les processus sont séquentiels, sans
se soucier du fait qu'ils tournent sur un monoprocesseur. La couche 0 fournit
donc à la couche 1 la multiprogrammation du CPU. La couche 1 gère
l'attribution de la mémoire principale aux processus ainsi que les échanges avec
la mémoire secondaire ("swapping"),
• La couche 2 gère les communications entre chaque processus et la console de
l'opérateur. Au-dessus de cette couche, chaque processus a sa propre console
(n'oublions pas que les terminaux écrans n'existent pas encore !!!),
• La couche 3 gère les E/S et les flots de données vers et à partir des buffers. Au-
dessus de cette couche, chaque processus n'est plus concerné que par des
organes d'E/S abstraits, d'utilisation plus facile,
• La couche 4 est constituée par les programmes utilisateurs. Ils ne sont plus
concernés par la gestion du processeur ou de la mémoire, par les E/S ou par la
console,
• La couche 5 est le processus utilisateur

c. Les micro-noyaux

Nous avons vu que les noyaux des systèmes monolithiques ont tendance à être
volumineux. Par ailleurs, si un service particulier est très rarement utilisé, il doit
néanmoins être présent dans le programme du noyau et il utilisera donc de la mémoire
de façon inutile.

Pour éviter ces problèmes, une solution consiste à réduire le noyau à quelques
procédures essentielles et à reporter tous les autres services dans des programmes
système. Le noyau ainsi réduit s’appelle souvent micro-noyau.

Ce travail est néanmoins considérable car il suppose une refonte totale des systèmes
d’exploitation habituels : ceux-ci ayant été développés au fil des ans, il se peut que des
services très importants, mais apparus tardivement, soient implantés à la périphérie du
noyau et que, donc, l’isolement de ces services demande la réécriture complète du
noyau.

Un autre inconvénient des micro-noyaux réside dans la communication entre les


différents services. Cette partie fondamentale permet le dialogue entre le noyau et les
services (tels que le réseau, l’accès aux disques. Chaque service étant cloisonné dans
son espace d’adresses, il est impératif d’établir ce mécanisme de communication entre
le micro noyau et les services. Cette couche de dialogue, qui n’existe pas dans un noyau
monolithique, ralentit les opérations et conduit à une baisse de performance.

Cela permet néanmoins de clarifier les choses et de concevoir des systèmes très
généraux se fondant uniquement sur des services essentiels, comme le partage du
temps.

La plupart des systèmes à micro-noyau en profitent aussi pour inclure des services pour
les machines multiprocesseurs ou pour les réseaux de processeurs

d. Les systèmes mixtes

Certains systèmes monolithiques tentent d’alléger leurs noyaux en adoptant quelques


principes des systèmes à couches ou des micro-noyaux. Par exemple, le système
15
d’exploitation Linux permet de charger de façon dynamique des modules particuliers
qui sont agglomérés au noyau lorsque celui-ci en a besoin.

Ce procédé est assez pratique car, d’une part, il permet de ne pas réécrire le système
d’exploitation et donc de profiter de l’expérience des systèmes Unix et, d’autre part, il
minimise la mémoire utilisée par le noyau : les modules ne sont chargés que lorsque
c’est nécessaire et ils sont déchargés quand le système n’en a plus besoin.

2. 6 LES SORTES DES SYSTEMES D’EXPLOITATION DE NOS JOURS

Il existe aujourd'hui une série de Systèmes d'exploitation d'utilisation générale, en plus


d'une variété de systèmes d'exploitation plus ou moins orientés vers l'un ou l'autre
domaine d'utilisation, parmi ces derniers :

o Les systèmes pour mainframes reconnus pour leur capacité à gérer un grand
nombre de programmes faisant chacun de nombreuses entrées-sorties. On les
retrouve aussi aujourd'hui dans le rôle de serveurs Web et commerce
électronique.
o Les systèmes personnels souvent dédiés à des applications bureautiques et
accès à internet (Windows 7, Windows 8, MacOs, Linux...)
o Les systèmes temps réel, se caractérisent par le respect de contraintes
temporelles (applications dans le monde industriel où l'instant où une action se
déroule a de l'importance : chaîne de montage) (VxWorks, QNX, LynxOS,
RTLinux,...)
o Les systèmes embarqués ordinateurs qui rendent des services simples « sur
mesure ». Un système d'exploitation simplifié suffit, on peut se passer de
multiprogrammation et donc de la surcharge de code système qu'elle implique
(PalmOS, WindowsCE, linux...)
o Les systèmes pour smart card les systèmes pour multimédia qui doivent
répondre à de nouvelles exigences en termes de stockage de fichiers, mais aussi
en termes d'ordonnancement temps réel
o Les systèmes multiprocesseurs recourent à plusieurs processeurs sur la même
plateforme (systèmes d'exploitation spéciaux : variantes de systèmes serveur,
améliorées au niveau de la connectivité)

2. 7 LES SERVICES DES SYSTEMES D’EXPLOITATION

Dans ce paragraphe, nous esquissons rapidement les différents travaux que doit
effectuer un système d’exploitation moderne.
Ces travaux sont généralement nommés « services » et ils seront détaillés dans les
chapitres suivants. La plupart de ces travaux sont pris en charge par le noyau du
système d’exploitation.
La gestion des processus : la gestion des processus n’a de sens que sur les
machines
fonctionnant en temps partagé. Elle comprend la création et la destruction
dynamique de processus.
La gestion de la mémoire : afin de simplifier la gestion des processus, les
systèmes d’exploitation modernes travaillent dans un espace mémoire virtuel,
c’est-à-dire avec des adresses virtuelles qui doivent être traduites pour
correspondre à des adresses physiques.
16
Cela permet d’allouer à chaque processus (y compris au noyau) son propre
espace mémoire de telle sorte qu’il a l’illusion d’avoir la machine pour lui tout
seul.
La gestion des entrées/sorties : les entrées/sorties permettent de faire transiter
des données par l’ordinateur et d’utiliser ces données pour faire des calculs. Ces
données peuvent provenir de périphériques, de processus présents sur la
machine ou de processus présents sur d’autres machines (via un réseau).
Le système de fichiers : le système de fichiers est un élément essentiel des
systèmes d’exploitation moderne : il permet d’accéder aux différents
périphériques et il propose une interface abstraite pour manipuler des données.
La gestion des communications entre machines : il est aujourd’hui impensable de
disposer d’ordinateurs à usage professionnel sans que ceux-ci soient reliés entre
eux par un réseau local. Par ailleurs, l’utilisation de réseaux internationaux
comme l’Internet se répand et le système d’exploitation doit donc prendre en
charge la gestion des communications par réseaux.

2. 8 DEMARRAGE D’UN SYSTEME D’EXPLOITATION

Nous terminons cette présentation de la structure des systèmes d’exploitation par une
description du processus permettant le démarrage d’un système. Lors de ce démarrage,
plusieurs étapes sont nécessaires pour permettre de donner la main au noyau du
système d’exploitation.

Lors du démarrage de la machine, la mémoire principale se trouve dans un état


indéterminé. Un programme de démarrage (bootstrap en anglais) doit être exécuté pour
charger le noyau depuis le disque et démarrer celui-ci. Ce programme de démarrage est
généralement stocké dans une mémoire non volatile (souvent dénotée ROM, pour Read-
Only Memory). Cette mémoire ROM utilise une technologie différente de la mémoire
principale, et son contenu n’est pas perdu lors de la mise hors tension de la machine.
En pratique, le type de mémoire utilisé n’est pas seulement en lecture seul (Read-Only)
mais supporte des mises à jour occasionnelles nécessitant un programme spécial (on
parle alors d’un firmware, et d’une mise à jour de firmware)

Le processeur reçoit lors du démarrage (ou du redémarrage) de la machine une


interruption dite de remise à zéro. Il charge alors son compteur de programme à la
première adresse de la mémoire ROM. Cette adresse contient la première instruction du
programme de démarrage. Ce dernier va en général effectuer tout d’abord un certain
nombre de vérifications de la machine (comme par exemple l’absence d’erreur au niveau
de la mémoire principale), initialiser les registres matériels, les bus de communication, et
les gestionnaires de périphériques.

Ensuite, ce programme va devoir récupérer sur le disque le code du noyau à


proprement parler, pour le copier en mémoire principale et enfin brancher vers sa
première instruction. Sur la plupart des systèmes, cette étape se déroule en deux temps
: le programme de démarrage est seulement capable de lire le tout premier bloc d’un
support de stockage (en général un disque dur ou SSD) dans lequel un programme de
chargement plus complet est stocké. C’est ce dernier qui va charger le code du noyau
depuis son emplacement effectif sur le disque (le noyau n’est pas stocké dans le
premier bloc, mais dans le système de fichier ; sous Linux ce fichier est généralement
17
stocké dans le répertoire /boot, par exemple /boot/vmlinuz-3.13.0-32-generic). Sous
Linux, le gestionnaire de démarrage GRUB joue ce rôle. Il permet par ailleurs de gérer le
démarrage de plusieurs systèmes (comme Solaris, Windows, etc.) ou bien de permettre
le démarrage de différents noyaux pour un même système, ce qui est parfois utile pour
les développeurs. On notera que lors de l’exécution de GRUB, avant l’exécution du
noyau Linux lui-même, les modules de Linux permettant d’utiliser le système de fichier
ne sont pas chargés. GRUB inclue donc ses propres modules pour pouvoir utiliser les
systèmes de fichiers les plus courant et y localiser le fichier contenant le code du noyau.

18
Chapitre 3 : EVOLUTION DES SYSTEMES D’EXPLOITATION ET DES
ORDINATEURS
Les ordinateurs et les systèmes d’exploitation sont aujourd’hui des objets complexes et
il est parfois difficile de comprendre les motivations des personnes qui les ont
développés.

Ce chapitre retrace l’évolution des ordinateurs et des systèmes d’exploitation tout au


long des quarante dernières années et il devrait permettre de comprendre quels ont été
les choix stratégiques importants.

Outre cet aspect culturel de l’évolution des ordinateurs, il est capital de bien
comprendre que les systèmes d’exploitation ont tenté de satisfaire les exigences des
utilisateurs d’ordinateurs et que, donc, leur développement n’est pas l’œuvre d’une
intelligence supérieure qui aurait tout planifié, mais bien le résultat des efforts parfois
contradictoires de nombreuses personnes dans le monde entier.

Il est aussi capital de comprendre que les systèmes d’exploitation et l’architecture des
ordinateurs ont évolué ensemble et qu’il n’est pas possible de concevoir l’un sans
l’autre : les demandes des développeurs de systèmes d’exploitation ont amené les
constructeurs d’ordinateurs à modifier les architectures de ces derniers et les
nouveautés technologiques des architectures des ordinateurs ont permis aux
développeurs de systèmes d’exploitation de progresser.

2. 1 Les origines et les mythes (16xx–1940)

La plupart d’ouvrages parlant de l’informatique, situent souvent l’origine des


ordinateurs au XVIIe ou au XVIIe siècle, en faisant référence à Blaise Pascal avec sa
Pascaline (calculatrice inventée par Blaise Pascal).

La pascaline permettait de réaliser des additions et des soustractions.


Mais comme l’époque ne connaissait pas encore le système de mesures internationales
et qu’il s’agissait avant tout de simplifier les calculs de la vie courantes, différentes
versions étaient proposées.

La tabulatrice d’Hollerith lisait des cartes perforées et en traitait le contenu à l’aide d’un
tableau de connexions. Ces connexions étant fixes (dans les premiers temps), les cartes
peuvent être considérées comme les jeux de données à manipuler par un programme
inscrit de manière permanente au travers de ces connexions.

À partir de 1920 le tableau de connexions sera amovible ce qui permettra de. . .


changer de programme. Un parallèle amusant serait de devoir changer le CPU selon le
programme que vous souhaitez exécuter.

19
Fig. 4 La Pascaline, la première calculatrice de l’histoire

3. 2 LA PREHISTOIRE (1940–1955)
Même si les apports antérieurs aux années 1940 sont importants, toutes les machines
créées jusqu’alors étaient des calculettes ou des calculateurs dotés de composants
mécaniques ou électromécaniques. Nous considérerons ici que le premier ordinateur est
la première machine entièrement électronique et réellement programmable.
Persécuté en 1952 en raison de son homosexualité, Alan Turing (1912-1954, il est le
premier a posé les bases fondamentales de l’informatique théorique et s’interroge sur la
« calculabilité » des algorithmes, il cherche en particulier à déterminer si tout ce qui est
calculable humainement peut être calculé par l’ordinateur et réciproquement) décédera
dans l’ignorance de la communauté scientifique anglaise qui l’avait pourtant largement
applaudi. En 1966 la création du prix Turing récompensant des travaux originaux dans
le domaine informatique commencera à rétablir sa place au sein de la communauté
scientifique. Cette réhabilitation se poursuivra en 2009 avec les excuses du Premier
Ministre britannique Gordon Brown au nom de la justice anglaise pour les traitements
infligés à Alan Turing et « ayant entraîné son décès prématuré ».

Le premier ordinateur fut construit en Pennsylvanie en 1946 et permettait d’effectuer


des calculs de tirs d’artillerie. Il utilisait 18000 tubes à vide et était absolument
gigantesque : 30 m de long, 2,80 m de haut et 3 m de large ! Doté d’une mémoire de
20 mots de 10 chiffres, il était capable d’effectuer 5000 additions ou 350
multiplications par seconde, qui répondait au nom de ENIAC (Electronic Numerical
Integrator And Computer)

Fig.5 Image d’illustration du tout premier ordinateur, ENIAC (Electronic Numerical


Integrator And Computer)

20
Noté que John Von NEUMANN (1903-1957), est considéré comme le père de
l’informatique moderne, par le fait les concepts édictés par lui dans les années 40,
continuent aujourd’hui de régir la conception des ordinateurs.

La programmation sur ces machines (Eniac), s’effectuait directement en manipulant des


interrupteurs et des contacteurs. Il n’y avait donc pas de support pour mémoriser les
programmes et la programmation devait donc être refaite à chaque changement de
programme.

L’avantage (le seul !) de ce procédé est que, en cas d’erreur, l’ordinateur restait dans
l’état qui avait conduit à l’erreur et il était donc possible de faire du débogage à vif !

Ces ordinateurs étaient en fait entièrement gérés par un petit groupe de personnes et il
n’y avait pas de différence entre les concepteurs, les constructeurs, les programmeurs,
les utilisateurs et les chargés de la maintenance. La notion de service était donc
totalement absente et, comme par ailleurs les programmes devaient être «
reprogrammés » à chaque fois, la notion de système d’exploitation aussi.

En 1951, le UNIVAC (Universal Automatic Computer, voyait le jour et il était


suffisamment fiable et abordable pour la commercialisation et avant lui s’était le EDVAC
(Electronic Discret Variable Computer), conçu en 1949 et mis en service la même année
que Univac, le successeur direct de Eniac, qui était indéniablement un ordinateur par
rapport au Eniac qui était comparé à un calculateur.

Fig. 6 UNIVAC

3. 3 LES ORDINATEURS A TRANSISTOR (1955–1965)

D’autres ordinateurs ont vu le jour sur le même principe jusqu’en 1959, mais ils
ont rapidement intégré des fonctionnalités indispensables comme les mémoires, les
langages de programmation de type assembleur ou l’utilisation de cartes perforées pour
stocker les programmes.

Les cartes perforées voyaient et le jour ainsi que les transistors, les cartes perforées
permettaient de réutiliser des programmes déjà écrits et, en particulier, de moins se
soucier des entrées/sorties : pour chaque périphérique, un programmeur écrivait un
petit programme permettant de lire et d’écrire sur ce support et ce petit programme
était ensuite inclus dans des programmes plus gros. Ces petits programmes s’appellent

21
des gestionnaires de périphériques (device driver) et représentent la première notion de
service, donc la première étape vers un système d’exploitation.

L’apparition des transistors a permis de construire des ordinateurs plus puissants et


surtout plus petits. Par ailleurs, les transistors étaient beaucoup plus fiables que les
tubes à vide et il devenait envisageable de vendre des ordinateurs ainsi construits. Cette
époque voit donc la séparation entre, d’une part, les concepteurs et les constructeurs
et, d’autre part, les programmeurs et les utilisateurs.

3. 4 Les circuits intégrés (1965–1980)


Le traitement hors-ligne des entrées/sorties entraîna le développement de deux
gammes d’ordinateurs différentes : d’une part, des gros ordinateurs très coûteux
spécialisés dans les calculs et, d’autre part, des petits ordinateurs beaucoup moins
chers spécialisés dans les entrées/sorties.
La première gamme était essentiellement utilisée par l’armée, les universités ou la
météorologie nationale. La seconde gamme était utilisée par les banques, les assureurs
et les grandes administrations.
Ces deux gammes étaient malheureusement incompatibles et une banque désireuse
d’acheter du matériel plus perfectionné ne pouvait pas changer de gamme sans au
préalable redévelopper tous les programmes qu’elle utilisait. Les constructeurs
d’ordinateur décidèrent alors de produire des ordinateurs compatibles, ce qui fut
notamment possible grâce à l’utilisation de circuits intégrés.
La coexistence de ces deux gammes représente bien les deux approches des systèmes
d’exploitation : les gros ordinateurs devaient être utilisés au mieux pour faire des
calculs et tous les efforts tendaient vers l’efficacité des traitements ; réciproquement, les
petits ordinateurs devaient être pratiques d’utilisation et tous les efforts tendaient vers
la commodité.

3. 5 L’informatique moderne (1980–1995)


L’informatique moderne se traduit essentiellement par la généralisation de l’utilisation
des ordinateurs. Paradoxalement, cette généralisation s’est faite au mépris des systèmes
d’exploitation, car comme il devenait possible de donner un ordinateur à chaque
utilisateur, le rôle du système d’exploitation a vite été sous-estimé. Ainsi, de
nombreuses sociétés ont préféré acheter de grandes quantités de petites machines
dotées de systèmes d’exploitation rudimentaires plutôt que de croire en l’utilisation
intelligente de l’outil informatique.
Ces choix, datant des années 1980, continuent et continueront de pénaliser les sociétés
ainsi dotées et de favoriser leur inertie face aux innovations.

Les ordinateurs personnels


Les ordinateurs personnels datent du début des années 1980. On parle parfois de
micro-ordinateurs, mais cette considération est aujourd’hui dépassée : la taille d’un
ordinateur n’est pas proportionnelle à sa puissance. Il est d’ailleurs difficile de
distinguer de nos jours un ordinateur personnel d’un ordinateur professionnel.
Les ordinateurs personnels sont naturellement groupés en deux catégories : les PC et
les Macintosh. L’origine de cette distinction n’est pas déterminée et, une fois de plus, il
devient aujourd’hui très difficile de distinguer un PC d’un Mac. D’ailleurs, bon nombre
de personnes pensent qu’un PC est un ordinateur qui exécute les programmes
Windows, ce qui n’a rien à voir !

22
MS-DOS et Unix
Les deux systèmes d’exploitation qui se sont propagés pendant cette période sont MS-
DOS et Unix. Une fois de plus, ces deux systèmes représentent les deux extrêmes des
systèmes d’exploitation : la commodité contre l’efficacité. MS-DOS est un système
rudimentaire très facile à utiliser. Unix est un système complexe et redoutablement
efficace, mais de prime abord parfois rude. Peu à peu, MS-DOS s’est rapproché d’Unix et
Unix a fait des efforts pour devenir plus accessible.
C’étaient les premiers systèmes d’exploitation, qui étaient utilisés dans cette période.

3 6 LES SYSTEMES D’EXPLOITATION D’AUJOURD’HU


Ici est pour nous l’occasion de présenter en quelques lignes les systèmes d’exploitation
qui sont utilisés couramment de nos jours.

Les caractéristiques présentées ici sont susceptibles de ne pas être totalement


d’actualité car les systèmes évoluent assez rapidement de version en version.

a. Les systèmes de type Unix

Unix, officiellement UNIX, est une famille de systèmes d'exploitation multitâche et multi-
utilisateur dérivé de l'Unix d'origine créé par AT&T, le développement de ce dernier
ayant commencé dans les années 1970 au centre de recherche de Bell Labs mené par
Kenneth Thompson.

Le système Unix est un système d'exploitation multi-utilisateurs, multi-tâches, ce qui


signifie qu'il permet à un ordinateur mono ou multiprocesseurs de faire exécuter
simultanément plusieurs programmes par un ou plusieurs utilisateurs. Il possède un ou
plusieurs interpréteurs de commandes (Shell) ainsi qu'un grand nombre de commandes
et de nombreux utilitaires (assembleur, compilateurs pour de nombreux langages,
traitements de texte, messagerie électronique, ...). De plus il possède une grande
portabilité, ce qui signifie qu'il est possible de mettre en œuvre un système Unix sur la
quasi-totalité des plates-formes matérielles.
De nos jours les systèmes Unix sont très présents dans les milieux professionnels et
universitaires grâce à leur grande stabilité, leur niveau de sécurité élevé et le respect
des grands standards, notamment en matière de réseau.
Voici quelques systèmes d’exploitation de type Unix :
4.4BSD : système développé par l’université de Berkeley et dont une grande partie est
gratuite,
Minix : système gratuit développé à partir de la version 7 de l’Unix des laboratoires
Bell ;
Linux : ce système est gratuit et peut être installé sur de nombreuses machines, comme
les PC, les MacIntosh, les DEC alpha ou les stations de travail SUN ;
NetBSD : tout comme Linux, ce système – fondé sur 4.4BSD – est gratuit et il peut être
installé sur un grand nombre de machines ;
OpenBSD : issu de NetBSD, il en conserve les caractéristiques mais se focalise sur les
architectures de types PC et SPARC. Ses objectifs sont avant tout la sécurité et la
cryptographie des données ;
FreeBSD : fondé sur 4.4BSD, ce système est aussi gratuit et le plus répandu de la
famille BSD ;
Irix : système utilisé sur les stations de travail SGI ;

23
Solaris : système utilisé sur les stations de travail SUN ou plutôt Oracle ;
HP-UX : système utilisé sur les stations de travail HP ;
AIX : système développé par IBM ;
Ultrix : système utilisé sur les stations Digital VAX et Decstation à base de processeur
MIPS ;
True64 Unix : autrefois appelé OSF/1 puis Digital Unix, ce système est utilisé sur les
DEC Alpha.

Le fonctionnement du système Unix est très simple à comprendre. En effet, c’est un


système composé de trois principaux éléments :

• Le noyau : c’est le responsable de la planification des tâches et de la


gestion du stockage des données
• Le Shell : c’est l’élément qui connecte et interprète les commandes des
utilisateurs
• Les applications et outils qui procurent des fonctionnalités supplémentaires
au système d’exploitation Unix

Ce système dispose d’un ou de nombreux interpréteurs de commandes (Shell), ainsi que


de plusieurs commandes et utilitaires (compilateurs pour plusieurs langages,
assembleurs, messagerie électronique, traitements de texte, …).

b. Les systèmes d’exploitation de Microsoft

La société Microsoft a développé deux grands systèmes d’exploitation qui ont eu


beaucoup de succès à savoir :

MS-DOS, et Windows, avec les versions clients comme Windows 95, Windows 98,
Windows NT, Windows XP, Windows Vista, Windows Seven, Windows 8, Windows 10 et
la plus récente Windows 11 ainsi que les versions servers, comme Windows Server
2000, Windows server 2003, Windows 2008, Windows server 2012, …2021

✓ MS-DOS, abréviation de Microsoft Disk Operating System est le système


d'exploitation de type DOS développé par Microsoft pour l'IBM PC d'abord, puis les
compatibles PC. Il s'agit d'un système fonctionnant en mode réel, mono-tâche et
mono-utilisateur, et équipé par défaut d'une interface en ligne de commande.
MS-DOS utilise une interface de ligne de commande qui vous permet de saisir des
commandes ou d'exécuter des programmes en tapant des noms ou des chiffres. Cela
signifie que vous avez un accès direct au matériel de l'ordinateur, à la mémoire et à
tous les fichiers stockés sur les disquettes ou le disque dur. Vous pouvez également
contrôler la sortie de l'ordinateur par le biais de textes, de graphiques et de sons.

Les quelques commandes courantes utilisées par le système MS-DOS :


➢ CD : Changement de répertoire ;
➢ DIR : Affichage de la liste des fichiers/dossiers du répertoire actuel ;
➢ COPY : Copie des fichiers/dossiers d'un emplacement à un autre ;
➢ TYPE : Affichage du contenu d'un fichier à l'écran ;
➢ DEL : Suppression des fichiers/dossiers du disque ; et

24
➢ EDIT : Édition de fichiers texte à l'aide d'un éditeur de ligne de commande plus
simple.

✓ WINDOWS est le système d'exploitation de Microsoft, successeur de MS-DOS, et


c’est depuis 1995 avec le système Windows 95, qu’il a commencé comme système
d’exploitation. Mais c’est depuis 1981, qu’on utilisait déjà Windows pas comme
système d’exploitation mais comme un programme qui accompagné le MS-DOS pour
le graphique ou comme interface graphique, tout de même les commandes
devraient être mémorisées par l’utilisateur.

La principale différence entre MS-DOS et Windows est que Windows est une interface
graphique qui affiche les menus et les options que les utilisateurs choisissent d'une
souris, alors que MS-DOS offre une interface de ligne de commande basée sur le texte
dans laquelle les utilisateurs saisissent directement des instructions en lignes de
commandes.

c. LE SYSTEME LINUX

Linux est un système d’exploitation open source et gratuit, distribué sous licence
publique générale GNU. Tout utilisateur peut donc l’utiliser, mais aussi le modifier en y
ajoutant des fonctions, ou redistribuer son code source. La plupart de ses distributions
sont également gratuites. Une vaste communauté de développeurs professionnels ou
amateurs contribuent au noyau Linux, et travaillent à résoudre des bogues et failles de
sécurité du système d’exploitation.

La composition d’un système d’exploitation Linux est la suivante :

• Un noyau : cet élément gère les ressources du système et s’occupe de la


communication avec le matériel. Ce composant principal du système
d’exploitation se charge de la gestion de la mémoire, des processus et des
fichiers.
• Un espace utilisateur systèmes : il s’agit d’un composant réservé aux tâches
système telles que la configuration et l’installation de logiciels. Il inclut l’interface
système qui reçoit les commandes informatiques, l’environnement de bureau, et
les processus qui s’exécutent en arrière-plan.
• Des applications : celles-ci sont indispensables pour effectuer des tâches. Ces
applications incluent divers logiciels tels que les outils de bureautique, langages
de programmation et suites professionnelles. La plupart des distributions Linux
disposent d’une base de données centralisée pour rechercher et télécharger des
applications supplémentaires.

Fonctionnalités

• Exécution de commandes (vérifie la commande passée et l’exécute) ;


• Redirections Entrées/Sorties (renvoi des données dans un fichier au lieu de
l’inscrire sur l’écran) ;
• Processus de connexion (gère la connexion de l’utilisateur) ;
• Langage de programmation interprété (permettant la création de scripts) ;
• Variables d’environnement (accès aux informations propres au système en cours
de fonctionnement).

25
d. Le système MAC OS

Mac OS est le système d’exploitation développé par Apple, dont la version la plus
récente est MacOS Monterey. Celui-ci est destiné aux ordinateurs Apple (MacBook Air,
MacBookPro, iMac, etc.). Mac OS fait partie de la famille de systèmes d’exploitation
UNIX.
Le système d’exploitation propose un mode sombre, et un système de navigation fluide,
à l’aide de gestes simples et intuitifs, à appliquer sur le trackpad. L’OS intègre aussi des
options d’accessibilité telles que VoiceOver ou Synthèse vocale.
Mac OS intègre également un Centre de notifications, où vous pouvez consulter
vos alertes, configurer différents modes de concentration (ne pas déranger, étudier,
repos…) et accéder à différents widgets (météo, bourse, calendrier…).

Comme l’ensemble des systèmes d’exploitation, Mac OS dispose de mises à jour


régulières, afin de proposer de nouvelles applications et fonctionnalités, mais également
de corriger les bugs et les failles de sécurité potentielles.
Pour identifier la version de Mac OS installée sur votre Mac, il vous suffit d’accéder au
menu Pomme, puis de cliquer sur À propos de ce Mac. Le nom du système Mac OS
s’affichera à l’écran.

e. Le système Android
Est un système d'exploitation mobile open source fondé sur le noyau Linux et
développé par un consortium d'entreprises, le Open Handset Alliance, sponsorisé
par Google.

Les services offerts par Android facilitent notamment l'exploitation des réseaux de
télécommunications GSM, Bluetooth, Wi-Fi et UMTS, la manipulation de médias,
notamment de la vidéo H.264, de l'audio MP3 et des images JPEG ainsi que d'autres
formats, l'exploitation des senseurs tels que les capteurs de mouvements, la caméra, la
boussole et le récepteur GPS, l'utilisation de l'écran tactile, le stockage en base de
données, le rendu d'images en 2D ou 3D en utilisant le processeur graphique,
l'affichage de page web, l'exécution multitâche des applications et l'envoi de
messages SMS.

26
Chapitre 4 : LA GESTION DES PROCESSUS

INTRODUCTION

Un processus est l’abstraction d’un programme en cours d’exécution. Une abstraction


est toujours difficile à représenter et c’est ce qui explique que bon nombre d’ouvrages
restent très discrets sur la gestion des processus. Toutefois, le concept de processus est
capital pour la réalisation d’un système d’exploitation efficace.

La notion de processus n’a cependant de sens que pour les systèmes d’exploitation
fonctionnant en temps partagé ou en multiprogrammation. Si un système d’exploitation
ne peut pas commuter d’un processus A à un processus B avant que le processus A ne
se termine, il est inutile de concevoir une gestion complexe des processus : il suffit de
les exécuter dans l’ordre. Cette remarque insiste sur une caractéristique mise en avant
dans ce document : un système d’exploitation digne de ce nom doit fonctionner en
temps partagé.

4 .1 CONCEPT DE PROCESSU
a. DEFINITION

Les processus sont des séquences d’instructions binaires manuelles ou automatiques, logées
dans la mémoire d’un ordinateur et qui s’exécutent par le processeur (CPU) de ce dernier. Tout
processus a un début et une fin : il est également soit actif, soit en attente d’un événement.
Par exemple, tout programme lancé manuellement par un utilisateur enclenche un processus.
Certains processus, très courts, sont employés à l’initialisation du système, comme « init », qui
se déclenche lorsqu’un utilisateur allume son ordinateur. D’autres restent actifs ou en veille.

En pratique, l’annotation qui permet de déterminer la prochaine instruction à exécuter


d’un programme s’appelle le compteur ordinal ou compteur d’instructions. Le contexte
d’un processus ne se résume pas simplement à ce compteur et il comprend d’autres
paramètres que nous décrivons dans les lignes qui suivent.

Un processeur n'est capable de traiter qu'un seul processus à la fois. Un sous-ensemble


du système d'exploitation, appelé ordonnanceur, organise les tâches et les fait
commuter tout à tour pour donner l'impression qu'elles s'exécutent toutes
simultanément.
Le système d'exploitation conserve des informations sur chaque processus pour pouvoir
les interrompre et les relancer selon ce que décide l'ordonnanceur. Ces informations
regroupent entre autres :
- un numéro d'identification du processus (PID)
- l'état du processus, son compteur ordinal et les autres registres
- l'emplacement mémoire du code, des données et de la pile
- des pointeurs vers les ressources utilisées, fichiers, E/S, ...
- et une quantité innombrable d'informations : pointeur vers le processus
parent, priorité, compteur de threads, durée d'exécutions, informations
d'attentes etc.
Toutes ces informations peuvent être regardées comme les composants d'un processeur
virtuel agent d'exécution du processus.

27
b. Création d'un processus
La création d'un processus peut intervenir

• Au démarrage du système
• Par un appel d'un autre processus
• Par une action d'un utilisateur (lancement d'application)

c. Etats d’un processus

Durant son séjour dans un SE, un processus peut changer d’état à plusieurs reprises.
Ces états peuvent être résumés dans le schéma suivant :

Schéma de l’état d’un processus


• Nouveau (création) : Le processus vient d’être créé.
• Prêt (Eligible) : le processus est placé dans la file d’attente des processus prêts, en
attente d’affectation du processeur.
• En exécution (Elu) : le processus a été affecté à un processeur libre. Ses instructions
sont en exécution.
• En attente (Bloqué) : Le processus attend qu’un événement se produise, comme
l’achèvement d’une opération d’E/S ou la réception d’un signal.
• Terminé (Terminaison) : le processus a terminé son exécution.

d. Bloc de contrôle de processus


La plupart des systèmes d’exploitation gardent en mémoire une table contenant toutes
les informations indispensables au système d’exploitation pour assurer une gestion
cohérente des processus. Cette table s’appelle le Bloc de Contrôle de Processus ou le
Process Control Bloc (en anglais) et elle est stockée dans l’espace mémoire du noyau du
système d’exploitation, ce qui signifie que les processus ne peuvent pas y accéder. Cette
table se décompose en blocs élémentaires correspondants aux différents processus.

28
Le rôle du PCB est de reconstituer tout le contexte du processus, il se représente sous
le format suivant :

Les informations contenues dans le PCB, et permettant de reconstituer le


contexte d’un processus, sont multiples. On peut citer entre autres :
• L’état du processus : Il peut avoir l’une des valeurs suivantes : Nouveau, Prêt,
en exécution ou en attente.
• Le compteur d’instructions : Le compteur indique l’adresse de la prochaine
instruction à exécuter par le processus.
• Les registres du processeur : Les registres varient en nombre et en type en
fonction de l’architecture de l’ordinateur. Ils englobent des accumulateurs, des registres
d’index, des pointeurs de pile et des registres à usage général. Ces informations doivent
être sauvegardées avec le compteur d’instructions quand il se produit une interruption,
afin de permettre au processus de poursuivre correctement son exécution après la
reprise.
• Informations sur l’ordonnancement du processeur : Ces informations
comprennent la priorité du processus, les pointeurs sur les files d’attente de
l’ordonnancement
• Informations sur la gestion de la mémoire : Ces informations peuvent inclure les
valeurs de registres de base et limites, les tables de pages ou les tables de segments
selon le système de mémoire utilisé.
• Informations sur l’état des E/S : Les fichiers ouverts, la liste des périphériques
d’E/S.
4. 2 L’ORDONNANCEMENT DES PROCESSUS
a. LES NIVEAUX D'ORDONNANCEMENT DES PROCESSUS
L'ordonnancement est à envisager à trois niveaux : à court, à moyen et à long terme.
1. L'ordonnancement à long terme "job schedulling" (ordonnancement des travaux)
décide des processus que le système peut mener en parallèle. Ils doivent être assez
nombreux pour que le processeur soit inactif le plus rarement possible (quand tous les
29
processus attendent des E/S) sans pour autant être trop abondants et saturer la
mémoire principale du système.
o Dans un traitement par lots, les processus attendent sur le disque
dans une file d'attente jusqu'à ce que le scheduler ou ordonnanceur
d'admission décide de les prendre en charge.
o Dans un système interactif à temps partagé, le système accepte en
principe toutes les requêtes de processus que les utilisateurs
provoquent en lançant leurs applications.
Une fois le processus admis dans le système, il n'en sort que lorsqu'il est terminé ou s'il
est détruit par le système d'exploitation suite à une erreur grave ou à la demande de
l'utilisateur (commande kill sous Unix ou via le gestionnaire des tâches sous Windows)
2. L'ordonnancement à moyen terme est assuré par l'ordonnanceur de mémoire aussi
appelé permutateur ou swapper. Son rôle est de permuter les processus placés en
mémoire et ceux qui, faute de place, ont été temporairement entreposés sur le disque.
Ces permutations ne peuvent toutefois pas être trop fréquentes pour ne pas gaspiller la
bande passante des disques.
3. L'ordonnanceur à court terme aussi appelé dispacher, répartiteur ou ordonnanceur
du processeur choisit à quel processus sera alloué le processeur et pour quel laps de
temps.
Ces commutations des processus sont très fréquentes.
b. LE CHANGEMENT DE CONTEXTE
Le changement de contexte est l’opération qui, d’une part, sauvegarde le contexte du
processus à qui on retire le processeur et qui, d’autre part, rétablit le contexte du
processus qui vient d’être choisi pour bénéficier du processeur.
Le changement de contexte assure à un processus qu’il retrouvera toutes les
informations dont il a besoin pour reprendre l’exécution de son programme là où il a
été interrompu.
Les changements de contexte arrivent très souvent : après chaque quantum de temps,
chaque fois que le noyau du système d’exploitation prend la main et chaque fois qu’un
processus est dessaisi du processeur avant la fin du quantum qui lui était attribué
(parce qu’il attend une entrée/sortie, par exemple). L’opération de changement de
contexte doit donc être très rapide et, en pratique, elle est souvent assurée en grande
partie par les couches matérielles de la machine.

c. CRITERES D'ORDONNANCEMENT DES PROCESSUS

La politique d’ordonnancement qu’un système d’exploitation applique reflète l’utilisation


qui est faite de la machine que ce système gère. Par exemple, le système d’exploitation
d’une machine destinée à faire de longs calculs sans aucune interaction avec les
utilisateurs évitera d’utiliser de petits quanta de temps : il peut considérer que le temps
de réaction de la machine n’est pas important et laisser 1 seconde à chaque
processus pour exécuter tranquillement son programme.

Inversement, le système d’exploitation d’une machine utilisée pour des tâches


interactives, comme l’édition de texte, devra interrompre très souvent les processus

30
pour éviter qu’un utilisateur n’attende trop avant de voir ses actions modifier l’affichage
à l’écran.

Si nous nous reportons à l’historique des systèmes d’exploitation, nous pouvons


distinguer 5 critères pour effectuer un bon ordonnancement :

➢ Efficacité : même si cette contrainte est moins présente aujourd’hui, le but ultime
est de ne jamais laisser le processeur inoccupé ;
➢ Rendement : l’ordinateur doit exécuter le maximum de programmes en un temps
donné ;
➢ Temps d’exécution : chaque programme doit s’exécuter le plus vite possible ;
➢ Interactivité : les programmes interactifs doivent avoir un faible temps de
réponse ;
➢ Equité : chaque programme a droit à autant de quanta que les autres.
Nous ne reviendrons pas sur le fait que certains de ces critères sont contradictoires et
nous dirons donc qu’un bon algorithme d’ordonnancement essayera de remplir au
mieux ces critères.
4. 3 LES ALGORITHMES D’ORDONNANCEMENT
a. L’algorithme du Premier Arrivé Premier Servi (FCFS)
L’algorithme de schedulind du processeur le plus simple est l’algorithme du Premier
Arrivé Premier Servi (First Come First Served : FCFS). Avec cet algorithme, on alloue le
processeur au premier processus qui le demande. L’implémentation de la politique FCFS
est facilement gérée avec une file d’attente FIFO. Quand un processus entre dans la file
d’attente des processus prêts, son PCB est enchaînée à la queue de la file d’attente.
Quand le processeur devient libre, il est alloué au processeur en tête de la file d’attente.
Exemple : Trois processus P1, P2 et P3 arrivent dans cet ordre au système. Leurs
durées d’exécution sont respectivement : 24, 3, 3 unités de temps. Pour représenter
l’historique d’occupation du processeur, on utilise le diagramme suivant, appelé
diagramme de Gantt.
Diagramme de Gantt :
0 24 27 30

P1 P2 P3

Ce diagramme montre que le processus P1 occupe le processeur de l’instant 0 jusqu’à


l’instant 24. A l’instant 24, le processeur devient occupé par le processus P2, puis à
l’instant 27 il sera suivi du processus P3. Le temps d’attente est égal à 0 pour le
processus P, 24 pour le processus P2 et 27 pour le processus P3. Le temps d’attente
moyen est égal à : (0+24+27)/3, soit 17 unités de temps.

b. L’algorithme du Plus Court d’abord (SJF)

Cet algorithme (en anglais Shortest Job First : SJF) affecte le processeur au processus
possédant le temps d’exécution le plus court. Si plusieurs processus ont la même durée,
une politique FIFO sera alors utilisée pour les départager. Exemple : On soumet au
système quatre processus P1, P2, P3 et P4 dont les durées d’exécution sont données
par le tableau suivant :

31
Processus Durée d’exécution
P1 6
P2 8
P3 7
P4 3

L’algorithme du travail le plus court donnera alors le résultat suivant :

Diagramme de Gantt :

P4 P1 P3 P2

0 3 9 16 24
Le temps moyen d’attente est = (0+3+9+16)/4=7. Alors que si on avait choisi une
politique FCFS, le temps moyen serait de : 10.25 unités de temps.

c. L’algorithme avec priorité:

Cet algorithme associe à chaque processus une priorité, et le processeur sera affecté au
processus de plus haute priorité. Cette priorité varie selon les systèmes et peut aller de
0 à 127. Les priorités peuvent être définies en fonction de plusieurs paramètres : le
type de processus, les limites de temps, les limites mémoires, etc.

Exemple : On dispose de 5 processus ayant des priorités différentes, comme le montre


ce tableau :

Processus Durée d’exécution Priorité


P1 10 2
P2 1 4
P3 2 2
P4 1 1
P5 5 3

Diagramme de Grant :

P2 P5 P1 P3 P4

0 1 6 16 18 19

Le temps moyen d’attente est = (0+1+6+16+18)/5=8.2 unités de temps.

d. L’algorithme Round Robin ou l’algorithme de Tourniquet

Chaque processus reçoit tour à tour un intervalle de temps appelé quantum. Au terme
de ce quantum ou, si le processus s'achève ou se bloque avant cet instant,
l'ordonnanceur attribue directement le processeur au processus suivant. L'algorithme
est simple et équitable. C'est généralement cet ordonnancement circulaire qui est utilisé
dans les systèmes à temps partagé. La valeur du quantum est couramment fixée aux
alentours de 20 à 50 ms.

32
Des quanta plus courts provoqueraient trop de commutations de processus et la
proportion du temps consacré à ces changements de contexte deviendrait trop
importante. Si par contre, on optait pour des quanta plus longs, ce seraient les temps
de réponse aux processus interactifs qui en pâtiraient.

Conclusion

En conclusion, il est important de retenir que, d’une part, la politique d’ordonnancement


des processus dépend de l’utilisation qui va être faite de la machine et que, d’autre
part, la politique d’ordonnancement mise en place sur les systèmes Unix est un bon
compromis pour une utilisation polyvalente d’un ordinateur.

33
CHAPITRE 5 : LA GESTION DE LA MEMOIRE

INTRODUCTION

La mémoire principale est le lieu où se trouvent les programmes et les données quand
le processeur les exécute. On l’oppose au concept de mémoire secondaire, représentée
par les disques, de plus grande capacité, où les processus peuvent séjourner avant
d’être exécutés. La nécessité de gérer la mémoire de manière optimale est toujours
fondamentale, car en dépit de sa grande disponibilité, elle n’est, en général, jamais
suffisante. Ceci en raison de la taille continuellement grandissante des programmes.
Nous verrons qu’il y a plusieurs schémas pour la gestion de la mémoire, avec leurs
avantages et inconvénients.

5. 1 CONCEPTS
a. Définition

Une mémoire est un circuit permettant d’enregistre, de conserver et de restituer des


informations, elle se présente sous forme d’un ensemble de cases. Chaque case possède
une adresse et peut contenir un mot de données d’une longueur m qui est toujours une
puissance de 2.

La mémoire physique, on fait allusion à la mémoire principale ou la Ram, et les adresses


physiques, sont les adresses de cette mémoire (RAM)

La mémoire logique, c’est l’espace d’adressage d’un programme et les adresses


logiques, sont les adresses dans cet espace.

b. Adresse relative et adresse absolue

Au moment de la compilation génère des adresses relatives (appelées aussi logiques)


comptée à partir de 0. Ces adresses relatives sont comprises entre 0 et max-1. Ceci
signifie, a priori, qu’un programme exécutable doit être chargé à l’adresse de la
mémoire centrale pour pouvoir s’exécuter.

En réalité, l’adresse de chargement d’un processus ne peut être connue qu’au moment
du chargement, lors du chargement, le système d’exploitation se charge de trouver une
(ou plusieurs) zones mémoire libre suffisamment grande pour pouvoir « loger » le
processus à charger. Les adresses occupées par le processus sont appelées adresses
absolues ou adresses physiques.

Au moment de l’exécution, et à chaque accès à la mémoire centrale, les adresses


relatives manipulées par le processus sont transformées en adresses absolues. Cette
transformation est l’une des fonctions prises en charge par le système d’exploitation.

c. Rôle du gestionnaire de la mémoire

La gestion de la mémoire a deux rôles principaux : d’abord le partage de mémoire


physique entre les programmes et les données des processus prêts, et ensuite la mise
en place des paramètres de calcul d’adresses, permettant de transformer une adresse

34
virtuelle en adresse physique. Pour ce faire le gestionnaire de la mémoire doit remplir
plusieurs tâches :

✓ Connaître l’état de la mémoire (les parties libres et occupées de la


mémoire).
✓ Allouer de la mémoire à un processus avant son exécution.
✓ Récupérer l’espace alloué à un processus lorsque celui-ci se termine.

5. 2 LES SERVICES DU GESTIONNAIRE DE LA MEMOIRE

Le gestionnaire de mémoire est chargé d’assurer la gestion optimale de la mémoire. Son


fonctionnement varie suivant les systèmes d’exploitation, mais les systèmes
d’exploitation modernes et efficaces proposent généralement les services suivants :
l’allocation et la libération de mémoire, la protection de la mémoire, la mémoire
partagée, les fichiers mappés et la pagination.

❖ L’allocation et la libération de mémoire

L’allocation de mémoire permet à un processus d’obtenir une zone mémoire disponible.

Afin de répondre aux demandes des processus, le gestionnaire de mémoire doit :


– maintenir à jour une liste des pages mémoire libres ;
– chercher dans cette liste les pages à allouer au processus ;
– programmer la MMU afin de rendre ces pages disponibles ;
– libérer les pages attribuées à un processus lorsque celui-ci n’en a plus besoin.

❖ La protection
La protection de la mémoire est un service essentiel des systèmes d’exploitation. Il n’est
pas acceptable aujourd’hui qu’une erreur dans un programme d’édition de textes, par
exemple, provoque l’arrêt d’une machine essentiellement utilisée pour faire des calculs.
La principale fonction de la protection de la mémoire est d’empêcher un processus
d’écrire dans une zone mémoire attribuée à un autre processus et, donc, d’empêcher
qu’un programme mal conçu perturbe les autres processus. Pour accomplir cette tâche,
le système d’exploitation doit programmer la MMU « Memory Manager Unit » afin qu’un
processus ne puisse avoir accès qu’aux pages mémoire qui lui appartiennent.
Si un processus tente d’accéder à une page qui ne lui appartient pas, la MMU prévient
instantanément le système d’exploitation (via une interruption) et ce dernier peut
envoyer un signal au processus fautif.

❖ La mémoire partagée
La mémoire partagée permet à deux processus d’allouer une zone de mémoire
commune. Cette zone peut être ensuite utilisée pour échanger des données sans appel
du système d’exploitation : ce mécanisme est donc très rapide, mais nécessite en
général d’être régulé par un mécanisme de synchronisation.
Comme pour les autres services du gestionnaire de mémoire, cette tâche est
grandement simplifiée par l’utilisation d’adresses virtuelles.
Un usage pratique de zones mémoire partagées sous Unix est par exemple exploité par
le jeu Doom porté sur Linux. Cette version utilise un segment de mémoire partagée
pour échanger les nouvelles images à afficher avec le serveur X, ce qui accélère
considérablement l’affichage.

35
La conduite par défaut du gestionnaire de mémoire est d’empêcher tout processus
d’accéder à l’espace mémoire d’un autre. Il est donc indispensable de faire appel à des
fonctions particulières pour demander l’allocation d’une zone de mémoire partagée.

❖ Les fichiers mappés


Les fichiers mappés sont des fichiers dont le contenu est associé à une partie de
l’espace adressable d’un processus. La lecture effective du fichier n’est réalisée qu’au
moment de la lecture de la mémoire. Par ailleurs, le système est libre de réallouer la
mémoire physique utilisée après cette lecture, puisque le contenu de cette mémoire
n’est pas perdu : il est toujours possible de relire le fichier.
Ce service utilise une fois de plus la MMU : comme la MMU est capable d’intercepter
tous les accès à des pages mémoires invalides, il suffit de déclarer les pages mémoires
associées à un fichier comme invalides.
Lorsqu’un processus tentera de lire l’une de ces pages, il produira un défaut de page
qui sera détecté par le système d’exploitation. Ce dernier, au lieu d’envoyer un signal au
processus comme il le fait habituellement, allouera une page de mémoire physique,
chargera dans cette page le contenu du fichier et rendra la page demandée valide afin
que le processus puisse y accéder.
Ce service est utilisé sur certains systèmes Unix et sous Windows afin de charger les
bibliothèques de fonctions utilisées par la plupart des programmes. L’intérêt est double
: le système peut toujours décharger les bibliothèques si cela est nécessaire et il n’a pas
besoin de charger plusieurs fois les bibliothèques utilisées par plusieurs processus.

❖ La pagination
L’utilisation d’adresses virtuelles permet au système d’exploitation de gérer la mémoire
principale par zones de grandes tailles (habituellement 4 ko) appelées des pages. Cette
gestion permet d’utiliser aussi bien des zones de la mémoire principale que des zones
de la mémoire secondaire. Une conséquence directe de principe est que les processus
peuvent demander l’allocation de plus de mémoire qu’il n’y en a de disponible dans la
mémoire principale.
Certes, il serait possible dans ce cas-là de créer un grand fichier et de le mapper en
mémoire. Cette solution n’est toutefois pas pratique pour plusieurs raisons : tout
d’abord, le programmeur doit explicitement demander une telle association ; ensuite, la
commande malloc() ne peut être utilisée pour gérer la mémoire associée au fichier.
Pour résoudre ce problème, différentes solutions ont été proposées et la solution qui
est aujourd’hui la plus répandue est la pagination. Dans les sections suivantes, nous
abordons rapidement les solutions historiques et nous détaillons le principe de
pagination.

5 3 ALLOCATION CONTIGUË DE LA MEMOIRE


La mémoire principale peut loger le SE et les différents processus utilisateurs. La
mémoire est habituellement subdivisée en deux partitions : une pour le SE résident et
l’autre pour les processus utilisateurs.

36
➢ Allocation multi-partitions :
Dans un environnement multiprogrammé, plusieurs processus logent dans la mémoire
en même temps. On doit alors prendre en charge le problème de leur allouer la
mémoire disponible. L’un des schémas les plus simples revient à subdiviser la mémoire
en partitions de taille fixe. Chaque répartition peut contenir exactement un processus.
Ainsi le degré de la multiprogrammation est limité par le nombre de partitions. Quand
une partition devient libre, on sélectionne un processus de la file d’attente des
processus prêts et on le charge dans la partition libre. Quand le processus se termine,
la partition devient libre pour un autre processus. Cette technique a été implémentée
sur le OS/360 d’IBM, mais elle est actuellement dépassée. Une autre méthode consiste
à obliger le SE à maintenir une table indiquant les partitions de mémoire disponibles et
celles qui sont occupées. Quand un processus arrive en demandant de la mémoire, on
recherche un espace suffisamment grand pour contenir ce processus. Si nous en
trouvons un, nous allouons seulement la quantité de mémoire nécessaire, laissant le
reste disponible pour satisfaire les futures requêtes. Exemple : L’état de la mémoire d’un
système est décrit par la figure suivante. Le système a une file de travaux décrit par le
tableau suivant :
Etat de la mémoire

Système 0
d’exploitation
400K

2160k libres

2560K

File d’attente des travaux :


Processus Mémoire Temps d’exécution
P1 600 K 10
P2 1000 K 5
P3 300 K 20
P4 700 K 8
P5 500 K 15

Voici quelques représentations après les entrées des processus


P1, P2 et P3 : P2 termine :

37
Ainsi à chaque instant, on dispose d’une liste de tailles de blocs disponibles et la file
d’attente des processus prêts. Le SE peut scheduler la file d’attente selon un algorithme
de scheduling. La mémoire est allouée aux processus jusqu’à ce qu’il n’existe aucun bloc
de mémoire suffisamment grand pour contenir ce processus. Mais comment allouer un
espace de taille n à un processus à partir d’une liste de trous libres ? On peut utiliser
l’un des trois algorithmes suivants : first-fit, best-fit, worst-fit.

• Algorithme First-fit (Le premier trouvé) : On alloue au processus le premier trou


suffisamment grand.

• Algorithme Best-fit (Le meilleur choix) : On alloue au processus le trou le plus petit
suffisamment grand ; c’est à dire celui qui provoquera la plus petite miette possible. Cet
algorithme nécessite le parcours de toute la liste des espaces libres.

• Algorithme Worst-fit (Le plus mauvais choix) : On alloue au processus le trou le plus
grand. Cet algorithme nécessite le parcours de toute la liste des espaces libres.

Exemple : L’état de la mémoire d’un système est décrit par la figure suivante. On
suppose qu’un processus P demande un espace mémoire de 80K.

38
➢ La fragmentation

Les algorithmes d’allocation de la mémoire contiguë précédents, produisent la


fragmentation de la mémoire. En effet, suite aux différentes entrées et sorties de
processus, des miettes séparées se froment dans la mémoire.

Si le processus P désire entrer dans le système en occupant 500K, il ne pourrait pas


bien que l’espace total disponible est de 700 K.

La solution au problème de la fragmentation peut être le compactage. Le principe est


de rassembler tous les trous en un seul bloc.

5 4 LES MECANISMES DE DECOUPAGE DE LA MEMOIRE

La mémoire centrale peut-être découpée de trois façons :

• La segmentation : les programmes sont découpés en parcelles ayant des


longueurs variables appelées « segments ».
• La pagination : elle consiste à diviser la mémoire en blocs, et les programmes en
pages de longueur fixe.
• Une combinaison de segmentation et de pagination : certaines parties de la
mémoire sont segmentées, les autres sont paginées.

39
A. LA PAGINATION
Une autre solution au problème de la fragmentation consiste à permettre que l’espace
d’adressage logique d’un processus ne soit plus contigu, autorisant ainsi l’allocation de
la mémoire physique à un processus là où elle est disponible. La technique de la
pagination est une manière d’implémenter cette solution.

Principe :
La pagination consiste à découper la mémoire physique en blocs de taille fixe, appelés
cadres physiques ou cadres de pages. La mémoire physique est également subdivisée
en blocs de la même taille appelée pages. Quand on doit exécuter un processus, on
charge ses pages dans les cadres de pages à partir de la mémoire auxiliaire.

On divise chaque adresse générée par le processeur en deux parties : numéro de page
P et déplacement dans la page D.

P D

On utilise le numéro de page comme indice à une table de pages. La table de pages
contient l’adresse de base de chaque page dans la mémoire physique. Cette adresse de
base est combinée avec le déplacement dans la page afin de définir l’adresse physique.
La taille de la table de page est une puissance de 2 variant entre 512 octets et 8192
octets, selon l’architecture de l’ordinateur. Le choix d’une puissance de 2 comme taille
de page facilite la traduction d’une adresse logique en un numéro de page et un
déplacement dans la page. Si la taille de l’espace adresse logique est de 2m et la taille
de la page est de 2n unités d’adressage (mots ou octets), les m-m bits de poids forts
d’une adresse logique désignent le numéro de page et les n bits de poids faible
désignent le déplacement dans la page.

Structure d’une table de page :


Chaque SE possède sa propre méthode pour stocker la table de pages. La plupart
allouent une table de page pour chaque processus. On stocke un pointeur sur la table

40
de pages avec les autres valeurs des registres dans le PCB. Lors d’une commutation de
contexte, et quand le processus redémarre, sa table de pages est rechargée.

Protection :
La protection de la mémoire dans un environnement paginé est accomplie avec des bits
de protection associés à chaque cadre de page. Normalement, ces bits sont stockés
dans la table de pages. Un bit peut définir que l’on accède à une page en lecture et
écriture, ou en lecture seulement.

Pagination multiniveau :
La plupart des SE modernes supportent un espace adresse logique très grand (232 à
264). Dans un tel environnement, la table de pages elle-même devient excessivement
grande. Par exemple, si l’espace adresse est de 232, et si la taille d’une page est de 4Ko
(212), alors la table de pages peut posséder jusqu’à 1 million d’entrée (232/212). Il
convient alors de subdiviser la table de pages en parties plus petites. Par exemple, on
peut utiliser un schéma de pagination à 2 niveaux, dans lequel la table de pages elle-
même est paginée.

Pages partagées :
Un autre avantage de la pagination est la possibilité de partager du code commun.
Cette caractéristique est particulièrement importante dans un environnement partagé.
Imaginons un système qui supporte 40 utilisateurs, chacun d’eux exécutant un éditeur
de textes.

B. LA SEGMENTATION
La segmentation rejoint la pagination pour consacrer un principe important dans les SE
actuels, à savoir la séparation entre la vue de l’utilisateur de la mémoire et la mémoire
physique. La vue de l’utilisateur de la mémoire n’est pas le même que la mémoire
physique réelle ; le SE se charge de convertir l’une dans l’autre. Il est admis que le
programmeur n’imagine pas la mémoire comme un tableau linéaire d’octets. Il préfère
voir la mémoire comme un ensemble de segments de taille variable, sans qu’il y ait un
ordre entre les segments.
La segmentation consiste à découper l’espace logique en un ensemble de segments.
Chacun des segments est de longueur variable ; la taille dépend de la nature du
segment dans le programme. Chaque segment possède un numéro et une longueur.
Pour cibler une zone mémoire spécifique, on doit donc désigner deux paramètres : un
numéro de segment et un déplacement.

De ce point de vue, la segmentation est différente de la pagination, puisque dans la


pagination, l’utilisateur ne spécifie qu’une seule adresse qui est décodée par le SE en un
numéro de page et un déplacement. En segmentation la conversion d’une adresse
logique en une adresse physique est faite grâce à une table de segments. Chaque
entrée de la table de segment possède deux valeurs :
• La base : c’est l’adresse de début du segment en mémoire.
• La limite : spécifie la taille du segment.

5 5 LA MEMOIRE VIRTUELLE
Les techniques de gestion de la mémoire vue précédemment possèdent le même
objectif : maintenir plusieurs processus en mémoire simultanément afin de permettre la
multiprogrammation. Cependant, elles tendent à demander que le processus se trouve
en mémoire dans sa totalité avant de pouvoir être exécuté. La mémoire virtuelle est une

41
technique autorisant l’exécution de processus pouvant ne pas être complètement en
mémoire. Le principal avantage de ce schéma est que les programmes peuvent être plus
grand que la mémoire physique. Le concept de mémoire virtuelle a été mis au point
après que l’on a constaté que dans de nombreux cas, on n’a pas besoin d’un
programme dans sa totalité. Exemples : • Les programmes possèdent souvent du code
pour manipuler des situations exceptionnelles. Ce code n’est alors que très rarement
exécuté. • On alloue souvent aux tables et tableaux plus de mémoire que ce dont ils ont
réellement besoin. On peut déclarer un tableau 100x100, alors qu’on n’utilise que
10x10 éléments.

➢ Pagination à la demande:
La mémoire virtuelle est communément implémentée avec la pagination à la demande.
Quand un processus doit être transféré en mémoire, la routine de pagination devine
quelles pages seront utilisées avant que le processus soit mis en mémoire axillaire de
nouveau. Au lieu de transférer en mémoire un processus complet, la routine de
pagination ramène seulement les pages qui lui sont nécessaires. Ainsi, elle évite que
l’on charge en mémoire des pages qui ne seront jamais employées, en réduisant le
temps de swaping et la quantité de mémoire dont on a besoin. Avec cette technique, le
SE doit disposer de moyens pour distinguer les pages qui sont en mémoire, et celles
qui sont sur disque. Par exemple, on peut utiliser dans la table des pages un bit
valide/invalide pour décrire si la page est chargée en mémoire ou non.
Que se passe-t-il si un processus essaie d’utiliser une page qui n’est pas en mémoire ?
L’accès à une page marquée invalidé provoque un défaut de page. En essayant
d’accéder à cette page, il y a un déroutement vers le SE. La procédure permettant de
traiter ce défaut de page est la suivante :
• S’assurer que la référence de la page est correcte.
• S’assurer que la page désirée est bien en mémoire auxiliaire.
• Trouver un cadre de page libre et charger la page.

➢ Remplacement de pages:
Lorsque le SE se rend compte au moment de charger une page qu’il n’existe aucun
cadre de page disponible, il peut faire recours à un remplacement de page. Ainsi le
code complet d’une procédure de traitement d’un défaut de pages est le suivant :
1. Trouver l’emplacement de la page désirée sur disque.
2. Trouver un cadre de page libre. S’il existe un cadre de pages libre, l’utiliser, sinon
utiliser un algorithme de remplacement de pages pour sélectionner un cadre de page
victime.
3. Enregistrer la page victime dans le disque et modifier la table de page.
4. Charger la page désirée dans le cadre de page récemment libéré et modifier la table
de pages.
5. Redémarrer le processus utilisateur.

➢ Algorithmes de remplacement de pages :

Il existe plusieurs algorithmes différents de remplacement de pages. En général, on


souhaite celui qui provoquera le taux de défauts de pages le plus bas. On évalue un
algorithme en l’exécutant sur une séquence particulière de références mémoires et en
calculant le nombre de défauts de page. Cette chaîne est appelée : chaîne de références.
Afin de déterminer le nombre de défauts de pages pour une chaîne de références et un
algorithme de remplacement particulier, on doit également connaître le nombre de
cadres de pages disponibles.

42
• Algorithme FIFO : L’algorithme de remplacement FIFO (First In First Out) est le
plus simple à réaliser. Avec cet algorithme, quand on doit remplacer une page,
c’est la plus ancienne qu’on doit sélectionner.
• Algorithme optimal : L’algorithme de remplacement optimal fournit le taux de
défauts de pages le plus bas de tous les autres algorithmes, de plus il ne souffre
pas de l’anomalie de Belady. Son principe est de remplacer la page qui mettra le
plus de temps à être de nouveau utilisée.
• Algorithme LRU : L’algorithme LRU (Least Recently Used) sélectionne pour le
remplacement d’une page victime, la page la moins récemment utilisée. C’est à
dire qu’on doit remplacer une page, l’algorithme sélectionne la page qui n’a pas
été utilisée pendant la plus grande période de temps.

Conclusion
L’introduction de la mémoire virtuelle et l’utilisation de composants dédiés pour
gérer la traduction vers les adresses physiques offre de grandes possibilités,
notamment le fait de pouvoir simuler une allocation continue de mémoire et permet
ainsi le déplacement des processus sans qu’un quelconque mécanisme de
réorganisation interne soit nécessaire. Ce principe de virtualisation permet de
s’abstraire des couches matérielles et nous verrons qu’il s’applique à d’autres
fonctions d’un système d’exploitation.

43
Chapitre 6 : INTRODUCTION AU SYSTEME DE FICHIERS
Introduction
Le système de fichiers est la portion du système d'exploitation qui s'occupe de la
gestion des mémoires de masse. Il prend en charge le stockage des fichiers sur le
disque dur, le rangement de ceux-ci dans des répertoires, l'ouverture ou la fermeture de
fichiers/répertoires, et bien d'autres choses encore. La gestion des partitions est aussi
assez liée au système d'exploitation.

Le système de gestion de fichiers (SGF) est la partie la plus visible d’un système
d’exploitation qui se charge de gérer le stockage et la manipulation de fichiers (sur une
unité de stockage : partition, disque, CD, disquette. Un SGF a pour principal rôle de
gérer les fichiers et d’offrir les primitives pour manipuler ces fichiers.
Le système d’exploitation doit permettre le stockage de l’information, avec les
contraintes suivantes : Pouvoir enregistrer une très grande quantité d’information.
Pouvoir conserver les informations après la fin du processus qui les utilise. Permettre
l’accès simultané à l’information pour deux processus différents. Ceci est réalisé à l’aide
des fichiers, sur des disques ou autres supports externes. La partie du système
d’exploitation qui s’occupe de la gestion des fichiers est appelée système de fichiers (ou
file system).

6. 1 Les services d’un système de fichier

Les fichiers
La notion principale manipulée lors de l’utilisation d’un système de fichiers est, on peut
s’y attendre, le fichier. Un fichier est une suite ordonnée d’octets 1 qu’un programme
peut lire ou modifier.

Chaque fichier est associé à un nom qui sera utilisé ensuite pour l’identifier. À l’aide de
ce nom, un programme peut demander au système d’exploitation la lecture ou l’écriture
du fichier. Pour beaucoup d’applications, le chargement complet d’un fichier en mémoire
n’est ni utile ni préférable (pour des raisons de coûts, la capacité de la mémoire est très
souvent inférieure à celle des périphériques de stockage). Dans ce cas, un programme
utilisera le fichier comme une bande magnétique, en lisant successivement des petites
parties d’un fichier. On parle dans ce cas d’un accès séquentiel. Pour certaines
applications, il peut être utile de lire les informations enregistrées dans un ordre
quelconque. Dans ce cas on parlera d’accès aléatoire.

La plupart des systèmes d’exploitation nécessite avant les opérations de lecture et


d’écriture l’ouverture d’un fichier. Cette ouverture préalable permet au système
d’exploitation de ne rechercher le fichier d’après son nom qu’une seule fois. Une
structure est créée afin de mémoriser des informations telles que : où est situé le fichier,
quelle est la position courante dans le fichier (quelle partie du fichier sera lue ou écrite
à la prochaine opération). Selon les systèmes d’exploitation, le résultat retourné lors de
l’ouverture est appelé descripteur de fichier (Unix) ou handle (Mac OS, Windows). Il
s’agit d’une forme de pointeur sur les informations relatives au fichier ouvert.

44
Les opérations généralement offertes par la plupart des systèmes de fichiers sont les
suivantes :
L’ouverture d’un fichier : cette opération consiste à rechercher d’après son nom un
fichier sur le périphérique de stockage. Le résultat de cette recherche sert à initialiser
une structure qui sera nécessaire aux manipulations suivantes du fichier. Généralement,
les permissions d’accès à un fichier sont vérifiées à ce moment, ce qui dispense le
système d’une telle vérification lors de chacune des opérations suivantes.
La création d’un fichier : cette opération consiste à créer sur le périphérique de
stockage, un nouveau fichier, vide. Ce fichier est immédiatement ouvert (un descripteur
de fichier ou handle est retourné), puisque la création d’un fichier vide est rarement une
fin en soi.
L’écriture dans un fichier : cette opération consiste à modifier le contenu d’un fichier à
partir d’une « position courante ». Dans le cas où la position courante arrive au-delà de
la taille du fichier, le fichier s’accroit afin de permettre le stockage de ces octets.
La lecture dans un fichier : cette opération consiste à lire une série d’octets dans un
fichier, à partir d’une « position courante ». En cas de dépassement de la taille du fichier,
une information « fin de fichier » est retournée.
Le déplacement à l’intérieur d’un fichier : cette opération consiste à changer la position
courante. Cette opération permet un accès direct à n’importe quelle partie d’un fichier
sans lire ou écrire tous les octets précédents.
La fermeture d’un fichier : consiste à supprimer les structures du système d’exploitation
associées à un fichier ouvert.
La suppression d’un fichier : cette opération consiste à supprimer sur le périphérique de
stockage, les données associées à un fichier. Cette suppression libère une place sur le
disque qui pourra être réutilisée pour agrandir des fichiers existants ou créer d’autres
fichiers.
La lecture ou la modification des caractéristiques d’un fichier : cette opération permet
de lire les caractéristiques associées à un fichier. Certaines caractéristiques sont
disponibles dans la plupart des systèmes de fichiers : taille, dates de création et/ou de
modification, propriétaire, droits d’accès. Parfois des caractéristiques spécifiques
supplémentaires peuvent être associées : les droits d’accès, un attribut « archive » utilisé
sous Windows pour indiquer si un fichier est sauvegardé, le type de fichier sous Mac
OS. Notons que certains systèmes de fichiers sont conçus pour permettre la création
d’attributs non prévus initialement.

Les répertoires
Un nommage « à plat » des fichiers serait peu pratique à gérer au-delà d’une centaine
de fichiers, ainsi tous les systèmes de fichiers 5 permettent la création de répertoires
qu’un utilisateur utilisera pour rassembler un ensemble de fichiers. Pour rendre le
classement encore plus efficace, ces répertoires peuvent contenir à leur tour d’autres
répertoires, ce qui donne une structure arborescente.
L’ouverture ou la création d’un fichier nécessite, en plus du nom du fichier, la liste des
répertoires à parcourir pour trouver le nom du fichier. Cette liste, appelée chemin
d’accès se présente sous la forme d’une unique chaîne de caractères dont un caractère
particulier est utilisé pour séparer les noms de répertoires et le nom du fichier.
Notons que chaque système d’exploitation utilise des conventions différentes (« / » sous
Unix, « \ » sous MS-DOS et Windows, « : » sous les anciennes versions de Mac OS). Pour
faciliter l’accès à des fichiers situés dans un même répertoire, une notion de répertoire
courant est généralement utilisée et permet l’ouverture d’un fichier à l’aide d’un chemin
« relatif » au répertoire courant (ce chemin ne contient que le nom du fichier si ce
dernier est directement dans le répertoire courant).

45
Les opérations usuelles portant sur les répertoires sont les suivantes :
– la création d’un répertoire ;
– la suppression d’un répertoire ;
– la lecture d’un répertoire, afin d’obtenir la liste des fichiers ; cette opération nécessite
généralement plusieurs opérations élémentaires, qui peuvent distinguer une ouverture
de répertoire, la lecture (répétée) d’un nom de fichier, et la fermeture ;
– le changement de nom ou le déplacement d’un fichier.
Notons que les opérations portant sur les fichiers portent parfois implicitement sur les
répertoires du chemin d’accès associé à ce fichier. Par exemple, la création d’un fichier
dans un répertoire est une modification du répertoire.

Le système de fichiers virtuel


Chaque système de fichiers possède des spécificités propres, ainsi un système de
fichiers d’un Macintosh précise la position des icônes associées à chacun de ces fichiers,
alors qu’un système de fichiers d’un système Unix précisera le propriétaire de chaque
fichier ainsi que les droits d’accès. Ces différences nécessitent des fonctions de
manipulation de fichiers adaptées. Ainsi la fonction de lecture d’un fichier sera différente
selon les systèmes d’exploitation.

Autres services
Selon les systèmes d’exploitation, des services supplémentaires sont rendus par un
système de fichiers. Les services les plus fréquents et/ou utiles sont présentés ci-
dessous.
✓ Le verrouillage : L’accès simultané à un même fichier par deux processus peut
corrompre ce fichier.
Par exemple, si deux processus sont chargé de chercher dans une base de données une
chambre d’hôtel libre et la réserver, ces deux processus risquent de trouver la même
chambre et, sans concertation, l’associer à deux clients différents...
Pour éviter ces problèmes, le système d’exploitation peut verrouiller un fichier pour
assurer à un processus qu’aucun autre ne l’utilise en même temps.
Deux types de verrous sont généralement disponibles : les verrous exclusifs, qui
empêchent tout autre processus de verrouiller le même fichier et les verrous partagés
qui tolèrent la pose d’autres verrous partagés. Généralement, les verrous exclusifs sont
utilisés lors des écritures, et les verrous partagés, lors des lectures : une lecture
simultanée par plusieurs processus ne risque pas de corrompre un fichier.
Selon les systèmes d’exploitation, les verrous sont impératifs (mandatory) ou indicatifs
(advisory). Les premiers empêchent non seulement la pose d’autres verrous, mais aussi
les accès au fichier alors que les seconds ne protègent que les accès entre programmes
qui prennent soin de poser des verrous lorsque nécessaire.

✓ La notification d’évolution
La notification d’évolution permet à un processus d’être averti de l’évolution d’un fichier
ou d’un répertoire. Cela peut être utilisé par une interface graphique pour rafraîchir une
fenêtre à mesure qu’un répertoire est modifié. L’interface de programmation inotify
fournit un mécanisme permettant de surveiller les événements qui interviennent dans le
système de fichiers.

✓ Les quotas
Les quotas permettent à un administrateur de limiter pour chaque utilisateur le volume
occupé par ses fichiers sur un disque.

46
✓ La création de liens
La création de liens permet l’association de plusieurs noms à un même fichier. Les
systèmes Unix considèrent les liens hard où un fichier possède plusieurs noms qui sont
considérés de la même manière par le système et les liens symboliques qui associent à
un nom de fichier le nom d’un autre fichier.

✓ Le mapping en mémoire
Le mapping d’un fichier en mémoire permet à l’aide du gestionnaire de la mémoire
d’associer une partie de l’espace d’adressage d’un processus à un fichier. Les accès au
fichier peuvent alors être programmés comme de simples accès à un tableau en
mémoire, le système d’exploitation chargeant les pages depuis le fichier lorsque
nécessaire.

6. 2 L’organisation des systèmes de fichiers


Un disque dur présente au système d’exploitation un ensemble de blocs de même taille
(généralement 512 octets), accessibles d’après leurs numéros. À l’aide de ce service
limité (les disques durs ne connaissent pas la notion de fichiers), le système
d’exploitation réservera certains blocs pour stocker les informations nécessaires à la
gestion d’un système de fichiers. Ces informations, appelées « métadonnées » ne sont
pas accessibles directement par l’utilisateur ou ses programmes.
Les métadonnées fournissent généralement les informations suivantes :
– Les caractéristiques du système de fichiers lui-même (nombre de blocs total, nombre
de blocs disponibles, nombre de fichiers, etc.). Le terme superbloc est parfois utilisé
pour identifier le bloc stockant toutes ces informations. De telles informations,
indispensables à l’utilisation d’un système de fichiers, sont souvent dupliquées dans
plusieurs blocs par mesure de sécurité.
– Les caractéristiques de chaque fichier (taille, listes des blocs associés au fichiers, etc.).
– L’état libre ou alloué de chaque bloc.

➢ Le système de fichiers Unix (UFS)


Le système de fichiers UFS (Unix File System) place les caractéristiques des fichiers dans
un zone de taille fixe appelée table des i-nodes. Cette table contient pour chaque fichier
une structure appelée i-node fournissant les caractéristiques d’un fichier, à l’exception
du nom. Les noms des fichiers sont situés dans les répertoires qui ne sont qu’une liste
de noms associés à leur numéro d’i-node. Une caractéristique rare des systèmes Unix
est de permettre l’association d’un même i-node (et donc d’un même fichier) à plusieurs
noms (situés éventuellement dans plusieurs répertoires). Un compteur de références
permet la suppression du fichier (et la libération de l’i-node) après la suppression du
dernier lien avec un nom de fichier.
La commande ls -i permet d’obtenir les numéros d’inode. Le résultat de la commande ls
-li montre un répertoire contenant 3 noms : a, b et c.

➢ Le système de fichiers MS-DOS


Le système de fichiers MS-DOS place la description des fichiers (l’équivalent d’un i-
node) directement dans un répertoire. Par ailleurs, nous ne trouvons que le numéro du
premier bloc du fichier. Pour chercher le bloc suivant, il faut consulter une table, la FAT
(File Allocation Table), associant à chaque numéro de bloc d’un fichier, le numéro du
bloc suivant. Cette méthode, simple et adaptée à la lecture séquentielle d’un fichier
nécessite, pour l’accès à un bloc quelconque, un nombre d’opérations proportionnel à
la taille du fichier.

47
➢ Le système de fichiers HFS de Mac OS
Comme son nom l’indique, Hierarchical File System, le système de fichiers de Mac OS
ajoute au précédent la possibilité de ranger des répertoires à l’intérieur d’autres
répertoires. Cependant, ce système de fichiers se distingue par l’usage récurent de
structures B-tree héritées des index de base de données. Ces structures permettent la
création de tables associant une structure à une clef d’accès.

6 3 La gestion des volumes


Pour des raisons pratiques, il peut être utile de placer sur un même disque, plusieurs
systèmes de fichiers indépendants. C’est en particulier le cas pour faciliter les
sauvegardes ou lors de l’usage de plusieurs systèmes d’exploitation. Pour cela, des
structures doivent être utilisées pour mémoriser les espaces alloués aux différents
systèmes de fichiers.

▪ Les tables de partition


La structure la plus simple pour décrire un espace alloué sur le disque est la table des
partitions. Une telle table associe à une partition identifiée par un numéro un ensemble
de blocs 13 consécutifs situés à l’aide du numéro du premier bloc et du nombre de
blocs.
Sur les architectures de type Intel on trouve sur le premier secteur du disque une table
de partitions principale qui en plus des informations sur les différents secteurs alloués
aux partitions contient également le programme d’amorçage (appelée pour cette
architecture MBR ou « Master Boot Record »). Cette table de partitions ne pouvant
contenir que 4 partitions, lorsque le besoin s’en fait sentir, la dernière partition est une
partition étendue (« Extended Boot Record ») et ne sera reconnue que par le système
d’exploitation. C’est le BIOS qui a la charge de lire et d’interpréter cette table principale.

▪ Les volumes
Un gestionnaire de volumes est généralement capable de créer un volume à l’aide de
plusieurs ensembles de blocs consécutifs, éventuellement situés sur des disques
différents. Par ailleurs certains gestionnaires sont associés à une organisation
redondante des données permettant de garantir l’accès à un volume après une panne
d’un disque dur. Ces organisations sont appelées « en miroir » ou RAID 1 lorsque les
données sont dupliquées sur des disques différents.

6 4 Améliorations des systèmes de fichiers


➢ Le cache
Afin d’accélérer les accès aux disques, un mécanisme de cache est généralement mis en
place. Ce cache permet, en maintenant en mémoire les blocs d’un fichier lus, d’éviter
lors de leurs relectures d’autres accès au disque dur.
Par ailleurs, les écritures peuvent être différées afin de regrouper les écritures sur des
blocs voisins et limiter le nombre d’accès au disque dur en cas d’écritures successives
sur un même bloc.
La gestion du cache peut avoir des conséquences importantes sur les performances
d’un système. Une optimisation, « read ahead » consiste à anticiper la lecture de blocs
consécutifs lors de la lecture d’un fichier. Ces blocs seront fournis immédiatement aux
programmes lorsque nécessaire.

Un aspect important de la gestion du cache est l’adaptation de la quantité de mémoire


occupée par le cache. Cette dernière doit être ajustée en fonction de la mémoire
disponible : dans l’idéal, le cache utilise toute la mémoire disponible et se réduit lorsque
48
des applications demandent de la mémoire. Sur les systèmes d’exploitation moderne, la
gestion du cache est intimement liée à la gestion de la mémoire.

➢ La fragmentation
Des accroissements successifs d’un fichier sont susceptibles d’allouer des blocs
dispersés sur la surface d’un disque dur. Cette dispersion appelée fragmentation (le
fichier est découpé en fragments, séries de blocs consécutifs), rend nécessaire, pour la
lecture du fichier, des mouvements des têtes de lecture, ce qui ralentit les accès. Par
opposition, une allocation de blocs consécutifs, permet la lecture d’un fichier de taille
importante à l’aide d’un nombre limité de déplacements des têtes de lecture. Notons
que les progrès les plus importants relatifs aux disques durs portent sur la densité des
données et sur le débit des lectures et écritures de blocs consécutifs. En revanche les
temps d’accès moyens (principalement dûs au déplacement de la tête de lecture et à la
vitesse de rotation) progressent très lentement, ce qui rend la baisse relative de
performance due à la fragmentation de plus en plus importante.
L’une des techniques les plus simples pour limiter la fragmentation consiste à
augmenter la taille des blocs.
Cependant, cette technique rend inutilisable l’espace situer entre la fin d’un fichier et la
limite du dernier bloc occupé par ce fichier. Cette perte d’espace est d’autant plus
importante que la taille moyenne de fichiers est petite.
➢ La protection contre la corruption
Un arrêt brutal du système (plantage, panne, défaut d’alimentation) risque d’entraîner la
corruption du système de fichiers, le disque dur n’étant pas capable d’assurer l’écriture
de plusieurs blocs simultanément. Par exemple, l’accroissement d’un fichier comporte
plusieurs opérations :
– l’allocation d’un bloc ;
– l’allocation éventuelle de blocs d’indirection ;
– l’ajout de ce bloc au fichier (modification de numéros de blocs) ;
– l’écriture dans le fichier ;
– le changement de l’i-node afin d’enregistrer le changement de taille ;
– le changement du superbloc afin de renseigner le nombre de blocs disponibles.

49
CONCLUSION GENERALE
Ce cours a présenté les systèmes d'exploitation sous plusieurs facettes. Son objectif
majeur est celui de présenter la base de conception d’un Système d’Exploitation et la
gestion des ressources informatiques : Matérielles et logicielles.
Divisé en Quatre chapitres, ce présent cours a fait un rappel sur l’architecture des
ordinateurs base de pcs dans son premier chapitre il a été également question de
montrer les rôles ou objectifs principaux de matériels clés d’un ordinateur.
En définissant le système d’exploitation comme étant un ensemble des programmes qui
gère l’exécution des autres programmes et pourvoir de service tels que l’allocation des
ressources, il a été question dans le deuxième chapitre de présenter le concept d’un
système d’exploitation, sa structure ainsi que les sortes de systèmes d’exploitation
existant de nos jours.
Ne pouvant pas parler de systèmes d’exploitation sans connaitre les origines, nous
sommes donnes le lux au troisième chapitre, de faire un aperçu général sur l’évolution
des ordinateurs ainsi que celle des systèmes d’exploitation et cela depuis sa préhistoire
jusqu’au jour d’aujourd’hui, en découvrant qu’il y avait au départ deux (2) systèmes
d’exploitation à savoir le MS-DOS ainsi que le UNIX.
La gestion des processus étant l’un des services qu’effectue le système d’exploitation, a
fait l’office de notre quatrième chapitre, chapitre au cours duquel, nous avons défini le
processus comme étant un programme en cours d’exécution par le processeur, et qui
pouvait un état détermine suivant son parcours avant d’être exécuté par le processeur.
Parlant de l’allocation de la mémoire, le cinquième chapitre a porté sur la gestion de la
mémoire. Nous avons montré comment est-ce que le S.E alloue des espaces au
Processus et le dernier chapitre a parlé sur la gestion des fichiers où nous avons montré
les différents systèmes de fichier qu’utilise le S.E. au revoir et à bientôt.

50
BIBLIOGRAPHIE ET WEBOGRAPHIE
Andrew S. TANENBAUM. Modern Operating Systems. 3e édition. Prentice Hall, décembre
2007. URL: http://www.pearsonhighered.com/educator/product/ModernOperating-
Systems/9780136006633.page
J. Delacroix, LINUX, Programmation système et réseau, 3e édition, Dunod,
2009 ;
A. Silberschatz, Principes des Systèmes d’Exploitation, Edition Addison wesley
https://debian-handbook.info/browse/fr-FR/stable/sect.computer-layers.html
https://projet.eu.org/pedago/sin/term/1-SE.pdf
http://www.ecolenumerique.tn/wp-content/sec/3-info/resau/pdf/nom.pdf
http://www.ordinateur.cc/syst%C3%A8mes/Unix/211939.html
https://blog.digitalcook.fr/systeme-unix/

51

Vous aimerez peut-être aussi