Académique Documents
Professionnel Documents
Culture Documents
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 !
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.
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.
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, . . .
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é.
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.
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.
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.
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.
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
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.
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é)
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.
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.
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.
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.
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.
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é ».
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.
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.
Fig. 6 UNIVAC
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.
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.
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.
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.
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
24
➢ EDIT : Édition de fichiers texte à l'aide d'un éditeur de ligne de commande plus
simple.
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.
Fonctionnalités
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…).
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
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.
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)
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 :
28
Le rôle du PCB est de reconstituer tout le contexte du processus, il se représente sous
le format suivant :
30
pour éviter qu’un utilisateur n’attende trop avant de voir ses actions modifier l’affichage
à l’écran.
➢ 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
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
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.
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.
Diagramme de Grant :
P2 P5 P1 P3 P4
0 1 6 16 18 19
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
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
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.
34
virtuelle en adresse physique. Pour ce faire le gestionnaire de la mémoire doit remplir
plusieurs tâches :
❖ 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.
❖ 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.
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
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 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
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.
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.
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.
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).
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.
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.
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.
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.
▪ 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.
➢ 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