Vous êtes sur la page 1sur 8

Gestion des mémoires sur Linux

Si l’on paraphrase la loi de Parkinson, «les programmes s’accroissent pour remplir


la mémoire disponible qui leur est réservée ».

Dans l’absolu, les programmeurs aimeraient disposer d’une mémoire infiniment


grande, infiniment rapide et qui serait aussi non volatile, c’est-à-dire qui ne
perdrait pas son contenu quand électricité est coupée. Tant que nous y sommes,
pourquoi ne pas demander aussi qu’elle soit bon marché? Malheureusement, la
technologie ne permet pas actuellement de fabriquer de telles mémoires. C’est
pourquoi, la plupart des ordinateurs disposent d’une hiérarchisation de la
mémoire : quelques mégaoctets de mémoire cache volatile, rapide et chère, quelques
gigaoctets de mémoire de rapidité d’accès et de prix moyens, et quelques téraoctets
de mémoire plus lente et non volatile servant de mémoire de masse. Le système
d’exploitation a pour rôle de coordonner la manière dont ces différentes mémoires
sont utilisées.
L'entité du système d’exploitation qui gère la hiérarchie de la mémoire est appelée
le gestionnaire de mémoire, Son rôle est de garder trace de la partie de la mémoire
qui est en cours d'utilisation et de celle qui ne l’est pas, d’allouer cette
mémoire aux processus qui en ont besoin et de la libérer quand ils ont fait leur
travail.

La notion d'espace d'adressage

Pour avoir plusieurs applications en mémoire simultanément, il faut savoir résoudre


les problèmes de protection et de réallocation . Il vaut mieux créer une nouvelle
abstraction de la mémoire : l’espace d’adressage. De la même façon que le concept
de processus crée une sorte d’'UC abstraite exécutant un programme, l’espace
d’adressage est une sorte de mémoire abstraite d’un programme prêt à l'exécution.
C’est l’ensemble des adresses qu’un processus peut utiliser
pour adresser la mémoire. Chaque processus a son propre espace d’adressage,
indépendant de celui des autres (sauf cas où l’on souhaite partager la mémoire).
cette utilisation des registres de base et de limite est une façon simple
d’attribuer à chaque processus son espace d’adressage. Dans nombre
d’implémentations (comme celle du CDC 6600), ces registres ne sont accessibles
qu'au SE. Le 8088, cependant, ne disposait pas de cette sécurité (il n’avait
d’ailleurs même pas de registre de limite) alors qu’il disposait de plusieurs
registres de base, permettant ainsi de réallouer indépendamment code du programme
et données. L'inconvénient majeur de cette méthode est qu’elle exige une addition
et une comparaison à chaque référence mémoire. Les comparaisons se font très
rapidement, mais les additions sont lentes en raison du mécanisme de propagation de
la retenue (à moins d’utiliser des circuits d’addition spéciaux).

Le Swapping (va-et-vient)

Si la mémoire physique de l'ordinateur est suffisamment grande pour contenir tous


les processus, les méthodes vues jusqu'ici conviennent. Mais, en pratique, c’est
rarement le cas. le cas. Sur un système Linux ou Windows, quelque chose comme 40 à
60 processus sont lancés au démarrage de la machine. Par exemple, lorsqu’on
installe une application sous Windows, elle s’arrange souvent pour faire en sorte
qu’à chaque démarrage on vérifie automatiquement si une mise à jour est disponible,
Ce genre de processus occupe facilement 5 à 10 Mo de mémoire. Sans parler de ceux
qui vérifient l’arrivée du courrier, les connexions réseau entrantes, etc. Tout
cela avant même qu’on ait lancé le moindre programme d’application.
Deux approches de gestion mémoire peuvent être utilisées. La stratégie la plus
simple, appelée va-et-vient (swapping), consiste à considérer chaque processus dans
son intégralité (exécution puis placement sur le disque). L'autre stratégie,
appelée mémoire virtuelle, permet aux programmes de s’exécuter même quand ils sont
partiellement en mémoire principale.
Gérer la mémoire libre
Quand la mémoire est attribuée dynamiquement, le système d'exploitation doit la
gérer.Quand les processus et les trous sont indiqués dans une liste triée par
adresse, plusieurs algorithmes peuvent servir à allouer de la mémoire à un
processus nouvellement créé (ou un processus existant chargé depuis le disque).
L’algorithme le plus simple est l'algorithme de la première zone libre (first fit).
Le gestionnaire de mémoire parcourt la liste des segments jusqu’à trouver un trou
qui soit assez grand. Le trou est ensuite divisé en deux parties, l’une destinée au
processus et l’autre à la mémoire non utilisée, sauf si le processus et le trou ont
la même taille, ce qui est statistiquement peu probable. L'algorithme de la
première zone libre est rapide parce qu’il limite ses recherches autant que
possible.
Une petite variante de la première zone libre est l'algorithme de la zone libre
suivante (next fit). Il fonctionne de la même façon que le précédent, et mémorise
en outre la position de l’espace libre trouvé. Quand il est de nouveau sollicité
pour trouver un trou, il débute la recherche dans la liste à partir de l'endroit où
il s’est arrêté a fois précédente, au lieu de recommencer au début comme le fait
l'algorithme de la première zone libre. Des simulations ont montré que les
performances de l’algorithme de la zone libre suivante sont légèrement meilleures
que celles de L’algorithme de la première zone libre.
Un autre algorithme bien connu est l'algorithme du meilleur ajustement (best fit).
Il fait une recherche dans toute la liste et prend le plus petit trou adéquat,
Plutôt que de casser un gros trou qui peut être nécessaire ultérieurement,
l'algorithme du meilleur ajustement essaye de trouver un trou qui correspond à la
taille demandée. Considérons de nouveau la figure 3.6 pour illustrer les
algorithmes de la première zone libre et du meilleur ajustement. Si un bloc de
taille 2 est demandé, l'algorithme de la première zone libre allouera le trou en 5,
mais l'algorithme du meilleur ajustement
allouera le trou en 18. l'algorithme du meilleur ajustement est plus lent que
l'algorithme de la première zone libre parce qu’il doit fouiller la liste entière à
chaque fois qu’il est sollicité. Plutôt curieusement, il perd aussi plus de place
mémoire que les algorithmes de la première zone libre et de la zone libre
suivante : en effet, il tend à remplir la mémoire avec de minuscules trous
inutiles, En moyenne, l'algorithme de la première zone libre génère des trous plus
larges. Pour régler le problème des cassures et faire concorder de manière
quasiment exacte un processus et un trou minuscule, on pourrait penser à
l'algorithme du plus grand résidu (worst fit), qui consisterait à prendre toujours
le plus grand trou disponible : ainsi, le trou restant serait assez grand pour être
réutilisé. Cependant, des simulations ont montré que cet algorithme n’est pas non
plus une solution.

Le Swapping sur Linux

L'espace d'échange, aussi appelé par son terme anglais swap space ou simplement
swap, est une zone d'un disque dur faisant partie de la mémoire virtuelle1) de
votre ordinateur. Il est utilisé pour décharger la mémoire vive physique (RAM) de
votre ordinateur lorsque celle-ci arrive à saturation. L'espace d'échange, dans
Ubuntu, se trouve généralement sous une forme de partition de disque dur on parle
alors de partition d'échange. Il peut aussi se présenter sous forme de fichier – on
parle alors de fichier d'échange.

Sur Ubuntu dépuis la version 17.04, le swap n'est plus une partition mais un
fichier situé dans /swapfile sauf si une ancienne partition swap est détectée à
l'installation : dans ce cas, celle-ci est intégrée au fichier /etc/fstab et le
fichier /swapfile n'est pas créé. Si une ancienne partition swap existe mais qu'on
ne veut pas l'utiliser, il faut configurer cette partition swap à l'installation :
cliquer sur la partition swap, et choisir ne pas utiliser cette partition, dans le
menu déroulant. Dans ce dernier cas, le fichier /swapfile sera créé .
Le swappiness : il ne gère pas seulement la tendance du noyau à échanger des pages
entre la RAM et le swap, mais surtout l'équilibre entre le cache disque et
l'utilisation de la mémoire par les applications.
Régler le déclenchement du fichier d'échange dès que la mémoire est utilisée à 95%

L'application de cette procédure avec une valeur faible du swappiness n'est pas
conseillée :
• Sur un poste multi-utilisateurs,
• Sur un ordinateur partageant une(des) ressource(s) au sein d'un réseau,
• En cas d'utilisation d'applications demandant d'importantes ressources
mémoire (cf §2.1),
La valeur de 60 définie par les concepteurs du système garantit un fonctionnement
correct quelle que soit votre configuration. La valeur minimale conseillée par
canonical [source ?] est swappiness=10. La valeur de 5 apporte un gain notable en
vélocité, surtout sur les machines peu dotées en RAM. La valeur de zéro provoque le
gel du système quand la RAM est utilisée à 100% et ne suffit plus.
• vm.swappiness=5 déclenche l'utilisation de la swap quand il ne reste plus que
5% de RAM.
• vm.vfs_cache_pressure=50 permet de garder plus de liens vers les fichiers en
mémoire, pour accélérer l’accès aux fichiers.
echo vm.swappiness=5 | sudo tee /etc/sysctl.d/99-swappiness.conf
echo vm.vfs_cache_pressure=50 | sudo tee -a /etc/sysctl.d/99-swappiness.conf
sudo sysctl -p /etc/sysctl.d/99-swappiness.conf
sudo service procps restart
sudo service procps restart

Pour changer ce réglage temporairement, utilisez la commande ci-dessous :


sudo sysctl vm.swappiness=20

Ensuite désactivez puis réactivez la swap pour que les changements deviennent
actifs :

sudo swapoff -av


sudo swapon -av

De plus, chacun de ces espaces peut être utilisé de manière inégale. Pour connaître
les espaces d'échange actuellement activés dans votre système Ubuntu et leur niveau
d'utilisation, utilisez la commande swapon de la façon suivante :
swapon -s
Le terminal vous affiche le résultat de cette commande sous forme de tableau. Ce
tableau retourne les informations suivantes :

• Filename : le nom du fichier ou de la partition utilisée en tant qu'espace


d'échange ;
• Type : le type d'espace d'échange (un fichier [file] ou une partition de
disque dur [partition]) ;
• Size : la taille réservée à cet espace d'échange, en kibioctets ;
• Used : la quantité d'espace utilisée dans cet espace d'échange, en kibioctets
;
• Priority : la priorité d'utilisation de cet espace d'échange. Un espace ayant
une plus haute priorité sera utilisé en premier.
Créer un fichier d'échange
Afin d'ajouter davantage d'espace d'échange utilisable par votre système Ubuntu,
nous vous recommandons la création de fichiers d'échange ou bien si vous voulez
tout simplement remplacer une partition swap par un fichier.
Le fichier d'échange doit être créé dans une partition formatée ext2, ext3, ext4

Les fichiers d'échange ont quelques avantages par rapport aux partitions d'échange.
Pour commencer, leur ajout ou suppression n'a pas d'impact sur la table des
partitions du disque dur, ce qui limite les possibles pertes de données liées à la
modification à posteriori du système de partitions d'un disque dur. Par conséquent,
il est aisé d'attribuer à la volée plus ou moins d'espace d'échange selon les
besoins, qu'ils soient temporaires ou non. Enfin, même s'ils sont stockés dans un
système de fichiers, les fichiers d'échange sont exploités directement par le noyau
Linux; l'utilisation d'un espace d'échange, sous forme de partition ou de fichier,
devrait être identique quant aux performances.
Pour créer un fichier d'échange :
Depuis un compte d'administrateur, ouvrez un terminal ;
Utilisez fallocate pour réserver un bloc d'espace disque à attribuer à votre espace
d'échange :
sudo fallocate -l <taille du fichier en octets> <nom du fichier>
• Le paramètre -l indique la taille (length) en octets qui doit être réservée
pour l'espace d'échange. fallocate reconnaît aussi quelques suffixes, tels m et g,
pour préciser des tailles en mibi-octets ou gibioctets. Par exemple, pour réserver
512 Mio, indiquez 512m ; pour réservez 1 Gio, indiquer 1g ;
• Le nom du fichier doit contenir le chemin absolu vers l'emplacement de celui-
ci. Sinon, il sera créé dans le répertoire courant ;
• Exemple : pour créer un fichier de 512 Mio nommé file.swap et situé à la
racine d'Ubuntu, on utilisera la commande suivante :
sudo fallocate -l 512m /file.swap
sudo chmod 600 <nom du fichier>
• Encore une fois, <nom du fichier> représente le nom du fichier qui vient
d'être créé, avec son chemin absolu si nécessaire ;
• Par exemple, pour changer les permissions sur le fichier file.swap situé à la
racine d'Ubuntu, on utilisera la commande suivante :
sudo chmod 600 /file.swap

• Définissez ce fichier en tant qu'espace d'échange. Pour ce faire, utilisez la


commande mkswap :
sudo mkswap <nom du fichier>

• Par exemple, pour définir un espace d'échange sur le fichier file.swap situé
à la racine d'Ubuntu, on utilisera la commande suivante :
sudo mkswap /file.swap

• Activez la prise en charge de ce nouvel espace d'échange. Utilisez la


commande swapon :
sudo swapon <nom du fichier>
• Par exemple, pour activer la prise en charge de l'espace d'échange sur le
fichier file.swap situé à la racine d'Ubuntu, on utilisera la commande suivante :
sudo swapon /file.swap

Rendez disponible le fichier d'échange à chaque démarrage en éditant le fichier


/etc/fstab et lui ajoutant :
/etc/fstab
#Entry for /swapfile :
/file.swap none swap sw 0 0

Pour supprimer un fichier d'échange :

Désactivez la prise en charge du fichier d'échange. Utilisez la commande swapoff :


sudo swapoff <nom du fichier>
• Par exemple, pour désactiver la prise en charge de l'espace d'échange sur le
fichier file.swap situé à la racine d'Ubuntu, on utilisera la commande suivante :
sudo swapoff /file.swap
• Supprimer le fichier d'échange :
sudo rm /file.swap
• Enlever la prise en charge au démarrage en enlevant les lignes dans fstab, en
éditant le fichier /etc/fstab :
/etc/fstab
• #Entry for /swapfile :
/file.swap none swap sw 0 0

La Mémoire Virtuelle (page 217)

Les adresses générées par programme ou processeur sont appelées des adresses
virtuelles.
L'espace d’adressage virtuel est divisé en unités appelées pages. Les unités
correspondantes dans la mémoire physique sont appelées cadres de pages (page
frames). Les pages et les cadres de pages sont toujours de même taille.Le
gestionnaire de mémoire virtuelle est un circuit électronique (MMU) qui permet de
réaliser le mécanisme de la mémoire virtuelle, à savoir le translation des adresses
virtuelles en adresses physiques . Le concept de mémoire virtuelle est assez
ancien, il a été implémenté dans les années 1960 et il est toujours très utilisé,
son but est augmenter la taille de la mémoire utilisable, de mettre en place des
mécanismes de protection et de faciliter l’allocation de la mémoire utilisée par un
processus en simplifiant le travail des développeurs. L'origine de cette découverte
est la différenciation entre l'espace d'adressage virtuel et l'espace d'adressage
physique .
Même si les mécanismes mis en jeu rendent de grands services, ils ont un coût en
matière de performance, celle-ci est un enjeu important actuellement ; les
internautes sont très sensibilisés aux temps de réponse. Le paradoxe est le suivant
: Les applications sont de plus en plus complexes et demandeuses de mémoire
toutefois, les utilisateurs sont de plus en plus exigeants en ce qui concerne la
performance.
L'autre défi majeur relevé par la mémoire virtuelle, c'est la protection de la
mémoire. De fait, une étanchéité entre les différents programmes doit être assurée.
Le problème actuel est de garantir cette sécurité face aux différentes attaques
(attaques par relais, par codes arbitraires).
Principe de base : toutes les informations d’un programme ne peuvent être
référencées par le processeur que lorsqu’elles se trouvent en Mémoire centrale.
L’information qui a besoin d’être référencée rapidement doit résider en mémoire
centrale et toutes les autres informations doivent être en mémoire auxiliaire
(mémoire de masse). Il serait trop coûteux en ressource de charger l'intégralité
des programmes exécutés par un ordinateur en mémoire, c'est une des raisons pour
lesquelles le procédé de mémoire virtuelle a été mis au point à la fin des années
1950 . La mémoire physique correspond à la mémoire physiquement installée, c'est-à-
dire principalement à la mémoire vive dynamique, la RAM. Il s'agit d'une zone de
stockage temporaire, une mémoire de travail, dans laquelle sont chargés les données
et les programmes qui seront traitées par le processeur. On utilise également
d'autres dispositifs, tels que les disques durs, les disques SSD comme espace
d'échange (zone de swap). Les mémoires vives (RAM) sont dites volatiles et
possèdent un temps d'accès aux données de quelques dizaines de nanosecondes, et les
mémoires comme celle du disque dur ont des accès plus lents : quelques
millisecondes, on les appelle aussi Mémoire de masse.
L'espace adressable par le processeur se distingue de l'espace réellement
adressable dans la mémoire physique :
L'espace d'adressage virtuel (Virtual address space) est généré par le processeur
au moment de l’exécution des instructions. C'est l'espace accessible, qui dépend
donc du nombre de bits utilisés par le processeur pour coder les adresses. Cet
espace d’adressage est constitué du code, des données, de la pile d’exécution
(stack) ;
L'espace d'adressage physique (Physical address space) correspond aux adresses
chargées réellement en mémoire centrale, physique, pour qu'un programme puisse
s'exécuter.
Un processus pour qu'il puisse s'exécuter doit être chargé en mémoire centrale. Si
plusieurs programmes sont concurrents, il est nécessaire :

d'allouer suffisamment de place en mémoire centrale pour le code et les données de


chaque processus ;
de garantir un espace d’adressage étanche pour chaque processus.
Les mécanismes de la mémoire virtuelle permettent de répondre à ces deux besoins
principaux.
La MMU (Memory Management Unit ou PMMU Paged Memory Management Unit) est le circuit
électronique qui rend possible la mémoire virtuelle, c'est par son intermédiaire
que seront converties (en anglais mapping) les adresses mémoires virtuelles en
adresses physiques.

TLB (Translation Lookaside Buffer)

Pour améliorer le temps d'accès à la mémoire, un ensemble de registres attachés à


la MMU, met en œuvre une mémoire cache : TLB (Translation Lookaside Buffer).

Le TLB mémorise les dernières correspondances entre les adresses virtuelles et les
adresses physiques pages, cadres utilisées par un processus.

Cette mémoire cache contient les numéros de page ainsi que l'adresse de la case
contenant la plus récemment accédée. La MMU cherche en premier lieu dans le cache
s'il existe une déjà une correspondance entre la page et l'adresse d’implantation
de la case.
La Pagination
Les données sont organisées dans la mémoire virtuelle sous forme de pages, Dans la
mémoire physique elles sont organisées sous forme de cadres, une page correspond à
un cadre. Donc quand un programme a besoin d'être chargé en mémoire centrale, il
faut donc placer les pages dans n’importe quelle case (ou cadre) disponible. La
taille d'une page est en moyenne de 4Ko. Les adresses des données dans une page
sont constituées d'un couple numéro de page et déplacement à partir du début de
cette page. La MMU permet d'associer une adresse virtuelle à une adresse mémoire
physique16. Elle reçoit en entrée une adresse virtuelle et vérifie qu'elle
correspond bien à une adresse physique si c'est le cas, elle transmet l'information
à la mémoire physique sinon il se produit ce qu'on appelle un défaut de page .
S'il n'existe plus de cases mémoire disponibles en mémoire physique, la mémoire
virtuelle peut combiner ces mécanismes avec le swapping, pour trouver de la
disponibilité mémoire sur le disque .
La MMU a aussi pour rôle de protéger le Système d'exploitation des accès non
autorisés à des zones de la mémoire.
Dans la table des pages, on trouve pour chaque entrée, un bit de validité qui
indique s'il existe bien une page physique correspondant à la page virtuelle
demandée, ainsi que des informations sur les droits d'accès en écriture ou en
exécution, à l'accès autorisé en mode utilisateur ou non.
Le mécanisme de conversion d'adresse s'effectue grâce à la table des pages. Dès
qu'un processus est chargé en mémoire principale sa table de page est chargée
aussi, son rôle est de conserver l'information suivante : les adresses de pages
(numéro de page + numéro de déplacement dans la page) et les adresses de cadres
correspondant à ce même processus, il faut noter qu'on se sert du numéro de page
comme index dans la table des pages .

Quelles sont les étapes dans la traduction de page ?

Une fois l'adresse virtuelle générée par le processeur, on vérifie d'abord en


mémoire cache TLB, s'il existe une correspondance entre la page et la case (TLB
hit), l'adresse physique est directement accessible en mémoire centrale.

Si aucune correspondance n'est trouvée (TLB miss), il faut alors se rendre dans la
table de pages pour déterminer l'adresse physique26,13.

Une fois l'adresse physique déterminée, si le cadre de page existe, l'adresse


physique est alors accessible en mémoire centrale. Si le cadre de page n'est pas
trouvé en mémoire il se produit un défaut de page (page fault), il faut alors
utiliser l'un des algorithmes de remplacement de page.

Algorithmes de remplacement de pages

À la suite d'un défaut de page, le système doit ramener la page manquante en


mémoire centrale ; s'il n'y a plus de place en mémoire il faut alors retirer une
Page et la mettre en mémoire auxiliaire : le disque, par exemple. C'est ce
mécanisme qu'on appelle le « remplacement de page ». Il existe de nombreux
algorithmes de remplacement de page pour circonscrire ce phénomène d'écroulement.

Le Working Set (en) permet d'estimer la quantité de mémoire qu'un processus


requiert dans un intervalle de temps donné.Suivant ce modèle, un processus ne
pourra être chargé en RAM que si et seulement si l'ensemble des pages qu'il utilise
peut y être chargé. Dans le cas contraire, le processus est swappé de la mémoire
principale vers la mémoire auxiliaire de façon à libérer de la mémoire pour les
autres processus.

Algorithme de remplacement LRU


Least Recently Used est l'algorithme le plus fréquemment utilisé : Toutes les pages
en mémoire figurent dans une liste chainée, avec en tête de liste la plus récemment
utilisée, quand le défaut de page survient , l'algorithme retire la page la moins
récemment utilisée : celle qui est en queue. C'est un algorithme complexe difficile
à implémenter qui nécessite son exécution par un matériel spécifique car il faut un
mécanisme qui tienne compte du temps.

Algorithme FIFO (First In First Out)


First In First Out (Premier entré, premier sorti) est un algorithme qui constitue
une liste chaînée avec les pages présentent en mémoire. Quand un défaut de page
intervient il retire la plus ancienne, donc celle qui est en début de file.Ce
mécanisme ne tient pas compte de l'utilisation des pages ; une page peut être
retirée et tout de suite après rechargée en mémoire car un processus en a besoin.

Clock( algorithme de la seconde chance)


Dans l'algorithme Clock, les pages sont mémorisées dans une liste circulaire en
forme d'horloge, Un indicateur pointe sur la page la plus ancienne. Lorsqu'un
défaut de page se produit, la page pointée par l'indicateur est examinée. Si le bit
R de la page pointée par l'indicateur est à 0, la page est retirée, la nouvelle
page est insérée à sa place et l'indicateur avance d'une position. Sinon, il est
mis à 0 et l'indicateur avance d'une position.
Cette opération est répétée jusqu'à ce qu'une page ayant R égal à 0 soit trouvée. À
noter que lorsqu'une page est ajoutée, on met son bit de référence à 1.
Cet algorithme est aussi appelé algorithme de la seconde chance.

NRU remplacement de la page Non Récemment Utilisée


Cet algorithme quant à lui utilise les bits R et M pour définir la page à retirer.

• R = Le Bit de Référence
• M = Le Bit de Modification
Le Bit R est positionné à 1 lorsqu'une page est Référencée et 0 lorsque la page
n'est pas référencée. Le bit M est positionné à 1 lorsque la page est Modifiée et 0
lorsqu'elle ne l'est pas.
Quand un défaut de page intervient l'algorithme NRU retire en premier la page non
référencée et non modifiée en premier :

• R=0 et M=0
sinon la page non référencée et modifiée :
• R=0 et M=1
sinon la page référencée et non modifiée :
• R=1 et M=0
sinon il retire la page référencée et modifiée ;
• R=1 et M=1
Dans ce dernier cas la page sera sauvegardée sur disque avant d'être transférée en
mémoire

Vous aimerez peut-être aussi