Vous êtes sur la page 1sur 10

Le fonctionnement théorique d’un système d’exploitation

Objectif 23 : Allouer la mémoire

1 - Introduction
Un programme ne peut s’exécuter que si ses instructions et ses données sont en
mémoire. Si l’on désire exécuter plusieurs programmes simultanément dans un ordinateur, il
faut que chacun soit charger dans la mémoire. Le système d’exploitation doit donc allouer à
chaque programme une zone de la mémoire. Mais tous les programmes n’ont pas la même
taille. De plus, les programmes sont lancés par les utilisateurs, puis se terminent à des
moments que le système ne connaît pas à l’avance. Chaque fois qu’un utilisateur demande le
lancement d’un programme, le système doit trouver une place dans la mémoire pour le
charger. Le fait de travailler en multiprogrammation implique donc que les programmes
d’application soient chargés dans des zones de la mémoire dont la localisation n’est décidée
qu’au moment de leur chargement. La gestion de la mémoire est donc du ressort du
gestionnaire de la mémoire. Il doit :
 connaître les parties libres et occupées de la mémoire
 allouer de la mémoire aux processus qui en ont besoin
 récupérer la mémoire utilisée par un processus lorsque celui-ci se termine
 traiter le va-et-vient (swapping) entre le disque et la mémoire principale lorsque cette
dernière ne peut pas contenir tous les processus.

2 - La gestion de la mémoire sans va-et-vient, ni pagination


Les systèmes de gestion de mémoire se répartissent en deux catégories :
 La première comprend les systèmes qui déplacent les processus entre la mémoire
principale et le disque (va-et-vient).
 La seconde, ceux qui ne le font pas.
Le va-et-vient et la pagination sont des artifices qui pallient un manque de mémoire
principale.

2.1 - La monoprogrammation sans va-et-vient, ni pagination


La gestion de la mémoire la plus simple consiste à avoir un seul processus en mémoire
à un instant donné et à lui permettre d’utiliser toute la mémoire disponible. Cette approche,
courante avant 1960, n’est plus utilisée de nos jours parce qu’elle implique que chaque
processus contienne les pilotes des périphériques d’Entrée/Sortie qu’il utilise.
La technique utilisée généralement est la suivante :
 Le Système d’Exploitation est situé en mémoire vive.
 Le Système d’Exploitation est situé en mémoire morte.

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

 Le système d’exploitation est situé en mémoire vive et les pilotes de périphérique en


mémoire morte.
Dans cette organisation, il ne peut y avoir qu’un seul processus qui s’exécute à un instant
donné.
MS-DOS (MicroSoft Disk Operating System) est un exemple de système d’exploitation
utilisant la monoprogrammation.

2.2 - La multiprogrammation et l’utilisation de la mémoire


La multiprogrammation facilite le développement des programmes en permettant de
les diviser en plusieurs processus. Elle se justifie aussi si plusieurs personnes travaillent
simultanément en mode interactif. Il serait inefficace de charger un processus, de l’exécuter
pendant 100 ms par exemple puis de passer quelques centaines de millisecondes à le réécrire
sur le disque.
Il serait intéressant de permettre à un programme de s’exécuter lors de la durée du
transfert d’un autre programme. Il faut donc conserver simultanément plusieurs programmes
en mémoire, en partie ou en totalité. Ce mode de partage est appelé multiprogrammation.
Une multiprogrammation sans réimplantation dynamique est assurée par la partition de la
mémoire.

2.3 - La multiprogrammation avec des partitions fixes.


Dans un système à partitions fixes, la mémoire est partagée statiquement en un nombre
fixe de zones. Les tailles et les limites de ces zones sont définies lors de la génération du
système. Chaque nouvelle tâche est placée dans la file d’attente de la plus petite partition qui
peut la contenir. Tout espace inutilisé dans une partition est dès lors perdu. Cette technique
consistant à trier des tâches en fonction de leurs tailles dans des files multiples présente un
inconvénient lorsque la file des grandes partitions est vide et celle des petites pleines.
Une alternative consiste à utiliser une seule file : dès qu’une partition se libère, on y
place la première tâche de la file d’attente qui peut y tenir et on l’exécute.

3 - Le va-et-vient

Dans les systèmes à temps partagé, la mémoire ne pouvant pas contenir les processus
de tous les utilisateurs, il faut donc placer quelques processus sur le disque. Pour les exécuter,
il faudra les ramener en mémoire principale et le mouvement des processus entre le disque et
la mémoire principale est appelé va-et-vient (swapping).

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

3.1 - La multiprogrammation avec partitions variables


En principe, on peut utiliser des partitions fixes pour les va-et-vient. Dès qu’un
processus se bloque, on le déplace sur le disque et on le remplace par un autre. En pratique,
les partitions fixes ne sont pas très intéressantes lorsque la mémoire est limitée car on perd
beaucoup de place à cause des programmes qui sont plus petites que les partitions. Il faut donc
utiliser les partitions variables. Avec les partitions variables, le nombre et la taille des
processus en mémoire varient au cours du temps. Le nombre, la taille et la position des
partitions varient dynamiquement au fur et à mesure que les processus entrent ou sortent de la
mémoire. On peut réunir les espaces inutilisés en une seule partition de grande taille en
déplaçant tous les processus vers le bas de la mémoire. Cette opération appelée compactage
n’est pas généralement utilisé car elle requiert beaucoup de temps processus.

3.2 - La gestion de la mémoire par table de bits


La mémoire est divisée en unités d’allocation dont la taille peut s’exprimer en mots ou
en kilooctets. A chaque unité, on fait correspondre un bit dans la table de bits qui est à 0 si
l’unité est libre et à 1 si elle est occupée.
Plus la taille de l’unité d’allocation est faible, plus la table de bits est importante. La
table de bits permet de mémoriser l’occupation de la mémoire dans un espace mémoire de
taille fixe car la taille d’une table de bits ne dépend que de la taille de la mémoire principale et
de la taille de l’unité d’allocation. Le problème de cette technique de gestion de la mémoire
vient du fait que lorsqu’on doit ramener en mémoire un processus de N unités, le gestionnaire
de la mémoire doit alors parcourir la table de bits à la recherche de N zéros consécutifs. Cette
recherche est lente entraînant ainsi la rareté de son utilisation en pratique.

3.3 - La gestion de la mémoire par listes chaînées


Cette technique de mémorisation de la mémoire consiste à gérer une liste chaîne des
segments libres et occupés, un segment étant un processus ou un espace libre entre 2
processus. Cette liste est triée sur les adresses permettant de mettre la liste à jour facilement
lorsqu’un processus se termine ou se place sur le disque. Quand on mémorise les processus et
les zones libres dans une liste triée en fonction des adresses, on peut utiliser plusieurs
algorithmes pour allouer la mémoire aux nouveaux processus ou aux processus ramenés en
mémoire principale. En supposant que le gestionnaire de la mémoire connaît la taille de la
mémoire à allouer, voici quelques algorithmes utilisés :

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

a)L’algorithme de la première zone libre (first fit)


Le gestionnaire parcourt la liste des segments à la recherche de la première zone libre
qui peut contenir le processus. Cette zone est scindée en 2 parties. La première contient le
processus et la deuxième, l’espace mémoire inutilisé (sauf si le processus à exactement la
même taille que la zone). Cet algorithme est rapide puisqu’il y’a très peu de recherche.

b) L’algorithme de la zone libre suivante (next fit)


Cet algorithme est identique au précédent mais, ici, on mémorise en plus la position de
l’espace libre trouvé. La recherche suivante commencera à partir de cette position et non à
partir du début.

c) L’algorithme du meilleur ajustement (best fit)


On recherche dans toute la liste la plus petite zone libre qui convient. On évite alors de
fractionner une grande zone dont on pouvait avoir besoin ultérieurement.
L’algorithme du meilleur ajustement est plus lent que celui de la première zone libre
puisqu’il doit parcourir à chaque appel toute la liste chaînée. Ce qui est plus étonnant c’est
qu’il fait perdre plus de place mémoire que l’algorithme de la première zone libre ou de la
zone libre suivant car il tend à remplir la mémoire avec des petites zones libres inutilisables.
L’algorithme de la première zone libre engendre des zones plus grandes en moyenne.

d) L’algorithme du plus grand résidu (worst fit)


Cet algorithme consiste à prendre toujours la plus grande zone libre disponible pour
que la zone libre restante soit la plus grande possible.

e)L’algorithme de placement rapide (quick fit)


Cet algorithme utilise des listes séparées pour les tailles les plus courantes. Il peut par
exemple utiliser une table de N entrées où la première entrée pointe sur la tête d’une liste
chaîne de zone 4ko, la seconde sur la tête d’une liste chaîne de zone 8ko, etc.

3.4 - Gestion de la mémoire par subdivisions


Nous avons vu que les listes chaînées triées en fonction de la taille des zones libres
accélèrent l’allocation de la mémoire mais rendent sa libération plus lente car il faut examiner
les voisins des segments libérés. L’allocation par subdivisions est algorithme de gestion de la
mémoire qui s’appuie sur le fait que les ordinateurs utilisent les adresses binaires de manière à
accélérer la fusion de zones libres adjacentes lorsqu’un processus se termine ou est déplacé
sur le disque. Son fonctionnement est le suivant :
Le gestionnaire de la mémoire mémorise une liste des blocs libres dont les tailles sont
de 1, 2, 4, 8, 16 octets jusqu’à la taille maximale de la mémoire (Avec une mémoire de 1Mo,
on

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

a 21 listes dont les tailles varient de 1 octet à 1 Mo). Initialement, toute la mémoire est libre et
la liste de 1Mo n’a qu’une seule entrée qui pointe sur la zone libre de 1Mo. Les autres listes
sont vides.

Mémoire
Requêtes Nombres de
15 2ko 1Mozones
0ko 12 8k 25 ko 384k
o
768ko libres
o 6

Initialement 1024 1

A : Demande de 70 ko A 128 256 512 3

B : Demande de 35 ko A B 64 256 512 3

C : Demande de 80 ko A B 64 C 128 512 3

Libération de A 128 B 64 C 128 512 4

D : Demande de 60 ko D 64 B 64 C 128 512 4

Libération de B D 64 128 C 128 512 4

Libération de D 256 C 128 512 3

Libération de C 1024 1

Etant donné que les tailles des zones sont des puissances de 2, lorsqu’un processus doit
être chargé en mémoire, on cherche un espace mémoire dont la taille est égale à la plus petite
puissance de 2 qui lui est supérieure. Si ça n’existe pas, on divise la mémoire en 2 jusqu’à ce
que cela soit possible.
Lorsqu’un bloc est recopié sur le disque, il est placé dans la liste des blocs libres de
taille 2ko telle que 2Ko > taille du processus et que 2Ko soit la taille la plus petite qui puisse
contenir le processus.
L’allocation par subdivision présente un avantage par rapport aux algorithmes qui
trient les blocs en fonctions de leur taille : quand un bloc de 2Ko est libéré, le gestionnaire de
mémoire doit examiner uniquement la liste des zones libres de 2Ko pour voir s’il peut
reconstruire un bloc plus grand. Bien qu’elle soit plus rapide, l’allocation par subdivision est
inefficace en ce qui concerne l’utilisation de la mémoire.
Le problème vient du fait que toutes les tailles doivent être arrondies à une puissance de
2. La partie non occupée est perdue car elle fait partie des zones allouées. On parle alors de
fragmentation interne car la mémoire perdue fait partie des segments alloués. Lorsque les

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

zones libres se trouvent entre les segments et non à l’intérieur, on parle de fragmentation
externe ou phénomène du « damier ».

4 - La mémoire virtuelle

Les programmes étant trop volumineux pour tenir dans la mémoire disponible, la
solution générale adoptée fut de diviser les programmes en parties appelées segments de
recouvrement. Lorsqu’un segment se termine, il fait appel à autre. Le découpage du
programme en plusieurs parties devait être fait par les programmeurs : c’était long et
fastidieux. Pour pallier à cette situation, l’idée est d’automatiser ce découpage par l’ordinateur
: on adopte le principe de la mémoire virtuelle qui est un espace du disque dur alloué par le
système d’exploitation qui servira de mémoire lorsque la mémoire centrale ou vive (RAM)
sera insuffisante pour stocker des processus.
L’idée de base est que la taille du programme et de ses données peut dépasser la
mémoire disponible. Dans ce cas, le système d’exploitation garde en mémoire les parties du
programme qui sont utilisées et stocke le reste sur le disque (mémoire virtuelle). La mémoire
virtuelle est utilisable sur un système multiprogrammé surtout que la multiprogrammation et
la mémoire se complètent très bien. Un programme qui attend le chargement d’une de ses
parties ne peut pas s’exécuter puisqu’il est en attente sur une Entrée/Sortie. On peut alors
allouer le processus à un autre processus.

4.1 - La pagination
Le nombre de programmes à exécuter peut-être assez grand ou bien qu’il n’y ait plus
assez de place en mémoire pour contenir chaque processus. Pour ce, chaque processus est
divisé en page et stocké en mémoire virtuelle. Les adresses manipulées par les programmes
sont appelées des adresses virtuelles et constituent l’espace d’adressage virtuel.
Dans les ordinateurs sans mémoire virtuelle, ces adresses virtuelles sont directement
placées sur le bus de la mémoire et provoquent la lecture ou l’écriture du mot à l’adresse
spécifiée.
Lorsque la mémoire virtuelle est utilisée, les adresses virtuelles ne sont pas
directement placées sur le bus de la mémoire. Elles sont envoyées à l’unité de gestion de la
mémoire ou MMU (Memory Management Unit) qui est un composant traduisant les
adresses virtuelles en adresses physiques et vice-versa.
La mémoire virtuelle est divisée en pages et la mémoire physique en cases mémoire
(pages frames) de même taille que les pages de la mémoire virtuelle. A un moment donné, plus

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

d’une page appartenant soit à un processus, soit à des processus différents peuvent être
chargés en mémoire centrale. Le MMU se charge de faire la correspondance entre les adresses
virtuelles et physiques. Pour passer des adresses virtuelles aux adresses physiques, le système
utilise une table de pages qui a autant d’entrée que de pages virtuelles. Le numéro de la page
virtuelle sert d’index dans la table des pages. Chaque élément de la table des pages contient le
numéro de la case mémoire où est mappée la page virtuelle. Si une page n’est pas mappée en
mémoire, l’élément correspondant de la table des pages verra son bit de présence à 0. Il vaut 1
lorsque la page est mappée.
Lorsqu’une page est référencée, le système d’exploitation consulte le bit de présence.
S’il est à 0, il se produit un défaut de page (page fault) ou déroutement. Le traitement du
déroutement va consister à localiser la page appropriée en mémoire virtuelle et s’il y a une
case mémoire libre en mémoire centrale, on y charge la page virtuelle ; sinon on est obligé de
remplacer une case mémoire choisie d’une certaine façon par la page virtuelle et selon
certains algorithmes.

4.2 - La segmentation
La pagination est une technique qui permet d'implanter un grand espace d'adressage
linéaire dans une mémoire physique limitée. Pour certaines applications, il est plus commode
d'avoir un espace d'adressage à 2 dimensions. L'idéal serait que chaque processus possède un
grand nombre de segments formé chacun d'un grand nombre d'octets. Les premiers segments
sont réservés aux procédures, aux données, à la pile et au tas du programme en cours
d'exécution. Les autres segments peuvent chacun contenir un fichier pour que les processus
puissent adresser directement leurs fichiers sans avoir à les ouvrir et à utiliser les primitives
d'Entrée/Sortie particulières pour les lire et les écrire.

5 - Les algorithmes de remplacement de page.

5.1 - Remplacement de page optimal


Au moment du défaut de page, il existe en mémoire un certain nombre de page ; une
de ces pages risque d’être référencée très vite, d’autres ne seront référencées que dans 10, 100,
1000 instructions. On peut numéroter chaque page avec le nombre d’instructions qui seront
exécutées avant qu’elle ne soit référencée.
L’algorithme de remplacement page optimal consiste à retirer la page qui porte le plus
haut numéro. Les ordinateurs comme les hommes, essayent de reporter les évènements
déplaisants le plus tard possible.

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

Malheureusement, cet algorithme est irréalisable car le système d’exploitation ne peut


pas connaître à l’avance le moment où les différentes pages seront référencées.
Caractéristiques
 Meilleur algorithme
 Facile à décrire
 Les pages sont numérotées par le nombre d’instructions qui seront d’abord exécuter
avant qu’elle ne soit référencée
 L’algorithme consiste à retirer la page ayant le plus haut numéro
 Impossible de mettre en œuvre car le système exploitation ne peut pas connaître à
l’avance le moment et ou les différentes pages seront référencées.

5.2 - Remplacement d’une page Non Récemment Utilisée


Les ordinateurs associent à chaque page deux bits d’information. Le premier bit R ou
bit de référence est positionné par le matériel à chaque lecture ou écriture de la page. Le
second bit M ou bit de modification est positionné quand on écrit dans une page. Ces bits
devant être mis à jour à chaque référence, il est essentiel que ce soit fait par le matériel. Dès
qu’un bit est mis à 1, il reste dans cet état jusqu’à ce que le logiciel du système d’exploitation
le remette à 0.
Au lancement d’un processus, le système d’exploitation met à 0 les bits de toutes ses
pages. Périodiquement, le bit R est remis à 0 pour différencier les pages qui n’ont pas été
récemment référencées des autres. Lorsqu’un défaut de page se produit, le système
d’exploitation parcourt toutes les pages et les répartit dans les 4 catégories suivantes :
 Catégorie 0 : non référencée, non modifiée
 Catégorie 1 : non référencée, modifiée
 Catégorie 2 : référencée, non modifiée
 Catégorie 3 : référence, modifiée
Les interruptions ne réinitialisent pas le bit M car il permet de savoir s’il faut réécrire
une page sur le disque. L’algorithme de la page Non Récemment Utilisée ou NRU (Not
Recently Used) retire une page au hasard de la catégorie non vide qui a le plus petit numéro.

5.3 - Remplacement de la page Première Entrée, Premier Sortie (FIFO : First In First
Out)
Le Système d’exploitation mémorise une liste de toutes les pages en mémoire ; la
première page de cette liste étant la plus ancienne et la dernière la plus récente. Lorsqu’il se
produit un défaut de page, on retire la première page de la liste et on place la nouvelle page à
la fin de cette liste.
Une modification simple de FIFO consiste à examiner les bits R et M de la page la
plus ancienne. Si cette page appartient à la catégorie 0, elle est supprimée ; sinon on teste la

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation
page un peu moins ancienne et ainsi de suite. S’il n’y a pas de page de la catégorie 0, on
applique cet algorithme aux catégories 1, 2 puis 3.

Dr Guy Page
Le fonctionnement théorique d’un système d’exploitation

Une variante de FIFO est l’algorithme de la seconde chance : l’idée est de tester le
bit R de la page la plus ancienne. S’il est à 0, la page est immédiatement remplacée. Sinon ce
bit est remis à 0 et la page est placée en queue de la liste des pages comme si elle venait d’être
chargée en mémoire ; et l’algorithme continue. L’algorithme de la seconde chance cherche
donc une ancienne page qui n’a pas été référencée au cours du dernier top d’horloge. Si toutes
les pages ont été référencées, l’algorithme de la seconde chance est équivalent au FIFO
classique.

5.4 - Remplacement de la page la Moins Récemment Utilisée


Une bonne approximation de l’algorithme optimal se fonde sur l’observation suivante :
les pages les plus référencées au cours des dernières instructions seront probablement très
utilisées au cours des prochaines instructions. De même, les pages qui n’ont pas été
référencées pendant un long moment ne seront probablement pas demandées pendant un
certain temps. Cette observation suggère l’algorithme suivant : lorsqu’il se produit un défaut
de page, il faut supprimer la page qui est restée inutilisée pendant le plus de temps. Cet
algorithme s’appelle LRU (Least Recently Used).
Caractéristiques
 Défaut de page => supprimer la page restée inutilisée pendant le plus de temps
 Très coûteux car :
o Il faut mémoriser la liste chaînée de toutes les pages en mémoire
o La page la plus utilisée est en tête et la moins utilisée en queue
o Trouver une page dans liste, la supprimer puis la déplacer au début de la liste
sont des opérations qui consomment beaucoup de temps processus.
o La recherche et la modification d’une liste chaînée à chaque instruction
prennent du temps.
Cette difficulté vient du fait que cette liste doit être mise à jour chaque fois que la
mémoire est adressée.

Seuil de validation : 80% Titre : Test de connaissance Objectifs visés :


O23(20%)
Seuil de validation : 60% Titre : Gestion de la mémoire par listes chaînées
Objectifs visés : O23(25%)
Seuil de validation : 60% Titre : Gestion de la mémoire par listes chaînées
Objectifs visés : O23(25%)
Seuil de validation : 60% Titre : Gestion de la mémoire de 512 Ko par
subdivisions Objectifs visés : O23(25%)
Seuil de validation : 60% Titre : Gestion de la mémoire de 128 Ko par
subdivisions Objectifs visés : O23(25%)
Seuil de validation : 60% Titre : Allocation de la mémoire lors d’un défaut de
page Objectifs visés : O23(50%)

Dr Guy Page

Vous aimerez peut-être aussi