Académique Documents
Professionnel Documents
Culture Documents
Chapitre VI :
Gestion de la mémoire
Amine DHRAIEF
• hiérarchie de la mémoire
– Quelques MB de mémoire cache volatile, rapide et chère
– Quelques GB de mémoire rapidité moyenne, prix moyen
– Quelques TB de mémoire non volatile, lente, mémoire de
masse
12/15/16 3
Introduction
12/15/16 4
Abstraction de la mémoire ?
• Avant 1980: on ne disposait pas d’abstraction
– MOV REGISTER1, 1000
– on fait passer le contenu de l’emplacement mémoire 1000 dans
le registre REGISTER1
– Il n’était pas possible d’exécuter deux programmes en même
temps
12/15/16 5
Abstraction de la mémoire ?
12/15/16 6
Abstraction de la mémoire ?
• Un seul processeur peut s’exécuter à la fois. Dès
que l’utilisateur tape une commande
– Le S.E copie le programme demandé depuis le
disque vers la mémoire et l’exécute
– Lorsque le processus se termine, le S.E affiche le
prompt et attend une nouvelle commande
– Quand il reçoit la commande, il charge un nouveau
programme en mémoire en écrasant le précédent
12/15/16 7
L’exécution de plusieurs programmes
sans abstraction de mémoire
• Même sans abstraction de la mémoire, il est
cependant possible d’exécuter quasi
simultanément plusieurs programmes.
12/15/16 8
UNE ABSTRACTION DE LA MÉMOIRE:
LE ESPACES D’ADRESSAGE
12/15/16 9
Contexte
• Faire voire aux processus la mémoire physique
présente plusieurs inconvénients
– Risque de plantage générale, même avec un seul
programme qui s’exécute
– Lourdeur pour exécuter plusieurs programmes à la
fois
12/15/16 10
La notion d’espace d’adressage
12/15/16 11
La notion d’espace d’adressage
12/15/16 12
La notion d’espace d’adressage
12/15/16 13
Les registres de base et de limite
12/15/16 14
Les registres de base et de limite
12/15/16 15
Les registres de base et de limite
12/15/16 18
Le va-et-vient (swapping)
12/15/16 19
Le va-et-vient (swapping)
v. (g) A revient
12/15/16 21
Le va-et-vient (swapping)
12/15/16 23
Le va-et-vient (swapping)
• Si le processus est adjacent à un autre processus, le
processus croissant devra être déplacé dans un trou
suffisamment grand pour lui
12/15/16 24
Gérer la mémoire libre
12/15/16 25
Gérer la mémoire avec une table de
bits
• Avec une table de bits, la mémoire est
répartie en unités d’allocation dont la
taille peut varier de quelques mots à
plusieurs kilo-octets.
12/15/16 28
Gérer la mémoire avec une table de
bits
• Le tableau de bit offre un moyen simple de
garder une trace des mots mémoire dans
une quantité fixe de mémoire
12/15/16 30
Gérer la mémoire avec des listes
chaînées
• Un processus qui se termine a normalement deux
voisins (excepté en début de liste/fin de liste) qui
peuvent être des processus ou des trous, ce qui
conduit à quatre combinaison possibles
12/15/16 31
Gérer la mémoire avec des listes chaînées
• (a) la mise à jours de la liste
oblige à remplacer un P par un T
12/15/16 32
Gérer la mémoire avec des listes
chaînées
• Quand les processus et les trous sont indiqué
dans une liste triées par adresse, plusieurs
algorithmes peuvent servir à allouer de la
mémoire à un processus nouvellement créé (ou
un processus existant chargé depuis le disque)
– First fit
– Next fit
– Best fist
– Worst fit
– Quick fit
12/15/16 33
Gérer la mémoire avec des listes chaînées
First Fit
12/15/16 35
Gérer la mémoire avec des listes chaînées
Best Fit
12/15/16 36
Gérer la mémoire avec des listes chaînées
Worst Fit
12/15/16 37
Gérer la mémoire avec des listes
chaînées
• On peut utiliser deux listes distinctes (zones libres et
occupées par un processus)
• On peut utiliser les zones libres elle même pour la liste des
zones libres
12/15/16 38
Gérer la mémoire avec des listes chaînées
Quick Fit
• Algorithme du placement rapide (quick fit)
– On gère des listes séparées pour certaines des tailles les
plus communes
– Par exemple, on peut avoir des listes de 4Ko, 8Ko, 12Ko, etc.
– Très rapide.
– Rend plus complexe le processus de libération de la
mémoire: On doit chercher les trous adjacents pour une
vérifier si une fusion est possible.
12/15/16 39
Application #1
12/15/16 40
Application #1
● Considérons un système de gestion de mémoire à
partitions variables avec la liste des trous suivante
(ordonnée par adresses croissantes) : 10K, 4K, 20K,
18K, 7K, 9K, 12K et 15K.
12/15/16 41
Solution Application #1
● First fit : on cherche le premier espace
qui convient
@ Lg @ Lg @ Lg @ Lg
a 10k a 10k b 4k b 4k
b 4k b 4k c 8k c 8k
c 20k c 8k d 9k
d 18k
d 18k d 18k
e 7k e 7k
e 7k e 7k
f 9k f 9k
f 9k f 9k
g 12k g 12k
g 12k g 12k
h 15k C h 15k
h 15k h 15k
9k
A B
12/15/16 42
12k 10k
Solution Application #1
● Next Fit : on cherche l’espace suivant
qui convient
@ Lg @ Lg @ Lg @ Lg
a 10k a 10k a 10k a 10k
b 4k b 4k b 4k b 4k
c 20k c 20k c 10k c 1k
d 18k d 6k d 6k d 6k
e 7k e 7k e 7k e 7k
f 9k f 9k f 9k f 9k
g 12k g 12k g 12k g 12k
h 15k h 15k h 15k h 15k
C
A B
12/15/16 9k 43
12k 10k
Solution Application #1
● Best fit : on cherche l’espace qui laisse
le plus petit trou
@ Lg @ Lg @ Lg @ Lg
a 10k a 10k b 4k b 4k
b 4k b 4k c 20k c 20k
c 20k c 20k d 18k d 18k
d 18k d 18k e 7k e 7k
e 7k e 7k f 9k h 15k
f 9k f 9k h 15k
g 12k h 15k C
h 15k 9k
B
A 10k
12/15/16 44
12k
Solution Application #1
● Worst fit : on cherche l’espace qui
laisse le plus grand vide
@ Lg @ Lg @ Lg @ Lg
a 10k a 10k a 10k a 10k
b 4k b 4k b 4k b 4k
c 20k c 8k c 8k c 8k
d 18k d 18k d 8k d 8k
e 7k e 7k e 7k e 7k
f 9k f 9k f 9k f 9k
g 12k g 12k g 12k g 12k
h 15k h 15k h 15k h 6k
A B C
12/15/16 45
12k 10k 9k
LA MÉMOIRE VIRTUELLE
12/15/16 46
La mémoire virtuelle
• Si la taille des mémoires augmente, celle des
logiciels augmente encore plus vite
– Dans les années 1980, on faisait tourner en temps partagé
des dizaine d’utilisateurs sur des VAX dotés de 4Mo.
– Vista/Seven (mono-utilisateur) recommande au minimum 1
Go
12/15/16 47
La mémoire virtuelle
• Le problème de programme plus gros que la mémoire
est connu depuis longtemps
12/15/16 48
La mémoire virtuelle
12/15/16 49
La pagination
• Les adresses générées par programme sont
appelées des adresses virtuelles et elle
forment l’espace d’adressage virtuel
12/15/16 50
La pagination
• Un ordinateur peut produire de adresses
sur 16 bits avec des valeurs comprises
entre 0 et 64Ko: ce sont les adresses
virtuelles.
12/15/16 51
La pagination
• L’espace d’adressage virtuel est
divisé en unités appelées pages
12/15/16 52
La pagination
• L’indication 0K-4K signifie que
les adresse virtuelles ou réelles
de la page sont situées entre 0
et 4095
12/15/16 53
La pagination
L’adresse virtuelle 0 est
transformée en adresse
physique 8192=2*4096
L’adresse virtuelle
20500=5*4096+20 est
transformée en adresse
physique 12308=3*4096+20
12/15/16 54
La pagination
• Quand le programme essaie par exemple
d’accéder à l’adresse 0, à l’aide de
l’instruction
– MOV REG,0
12/15/16 58
La pagination: fonctionnement interne d’une MMU
12/15/16 59
La pagination: fonctionnement interne d’une MMU
• Si le bit de
présence/absence est à
0, un déroutement vers le
système d’exploitation
est mis en place
12/15/16 60
La pagination: fonctionnement interne d’une MMU
• Si le bit est à 1,
– le numéro de cadre de page trouvé
dans la table des page et copié
dans les 3 bits de poids le plus fort
du registre de sortie
– auxquels sont ajoutés les 12 bits de
décalage, qui sont copié à partir de
l’adresse virtuelle entrante sans
être modifiée
– ils forment ensemble une adresse
physique sur 15 bits
12/15/16 61
Les tables de pages
• Le rôle d’une table des pages est ainsi de faire
correspondre des pages virtuelles à des cadres de page
– C’est une fonction qui a comme argument le numéro de la
page virtuelle et comme résultat le cadre physique
– Le résultat de cette fonction peut servir à remplacer le champ
nommé page virtuelle d’une adresse virtuelle par un champ
nommée cadre de page et à créer ainsi une adresse mémoire
physique
• Deux problèmes:
– La table des pages peut être très grande
– Trouver l'adresse réelle à partir de l'adresse virtuelle doit se
faire très rapidement
12/15/16 62
Récapitulons :
• Dans le cas le plus simple, la mise en correspondance des adresses virtuelles et
des adresses physiques se déroule comme suit
– L’adresse virtuelle est séparée en deux parties
– Un numéro de page virtuelle (les bits de poids fort)
– Et un décalage (les bits de poids faible)
• Dans la table des pages, le numéro de page virtuelle sert à trouver l’entrée de la
page virtuelle.
– S’il existe, le numéro du cadre de page est trouvé à partir de cette entrée de la table des pages
• Le numéro du cadre de page est attribué aux bits de poids fort suivi du décalage,
remplaçant le numéro de page virtuelle, pour composer une adresse physique qui
peut être envoyée à la mémoire
12/15/16 63
Structure d’un entrée de table de page
• Présent/Absent:
– si 0 cela provoque un défaut de page
– Si 1, l’entrée est valide et peut être utilisé
12/15/16 64
Structure d’un entrée de table de page
• Référencé:
– Mis à 1 chaque fois qu’une page est consultée
– Permet de décider si la page peut être remplacer par une autre
– Les pages qui ne sont pas en cours d’utilisation sont de meilleures candidates que les autres
• Cache inhibée:
– Caractéristique importante pour les pages qui sont mises en correspondance dans des registres
matériel plutôt qu’en mémoire
– Utile pour les attentes de réponse d’E/S on veut accéder aux données du périphérique plutôt qu’au
cache
12/15/16 65
Application #2
12/15/16 66
Exercice 1 : Pagination Simple
● Hypothèse :
– Chaque entrée de table de pages contient, en plus du numéro de cadre de page, 1
bit de présence (P), 1 bit pour son référencement (R) et 1 bit pour sa modification
(M).
12/15/16 67
Solution Exercice 1 : Pagination Simple
12/15/16 68
Solution Exercice 1 : Pagination Simple
●
3- Combien de bits de l'adresse physique spécifient le cadre de
page ?
– L’espace d’adressage physique est de 2¹⁶ octets. Étant donné que les pages font 2¹²
octets, on peut donc écrire 2¹⁶= 2¹² * 2⁴ . Ceci implique une adresse physique de 16
bits définie avec 4 bits pour les numéros des cadres et 12 bits pour le déplacement
dans une page.
●
4- Combien d'entrées se trouvent dans la table de pages ?
– La table des pages doit contenir une entrée pour chaque page. Comme il y a 2¹²
pages, la taille de la table des pages doit donc avoir une longueur de 2¹² = 4096
entrées.
●
5- Combien de bits sont nécessaires pour stocker une entrée
dans la table de pages (de quelle largeur est la table de pages) ?
– Chaque entrée contient 3 bits pour indiquer P, R et M et 4 bits pour spécifier le
numéro du cadre de page ; ce qui donne au total 3 + 4 = 7 bits par entrée.
12/15/16 69
Accélérer la pagination
• Tout système de pagination doit considérer deux éléments
1. La correspondance doit être rapide
2. La table des pages doit être très grande
• Accélérer la correspondance
–.La correspondance entre mémoire virtuelle et mémoire physique doit être
réalisée à chaque référence mémoire
–.Un instruction typique: un mot d’instruction + opérande mémoire
–.Chaque instruction : on fait référence à la table des pages au moins
une fois
12/15/16 70
La mémoire associative
• Hypothèse: la table des pages est en mémoire
– Impact considérable sur les performances
– Par exemple une instruction qui copie un registre dans un autre
●
En l’absence de pagination: cette instruction fait une seule
référence mémoire
●
Avec la pagination: des références mémoires supplémentaires
peuvent être nécessaire pour accéder à la table des pages
• Observation:
– La plupart des programmes tendent à faire un grand nombre de
référence à un petit nombre de pages
→ Seule un petite fraction des entrées de la table des pages est
réellement lue, tout le reste sert rarement
12/15/16 71
La mémoire associative
• Solution
– équiper les ordinateurs avec un périphérique qui permet de mettre en
correspondance les adresses virtuelles avec les adresses physique sans passer
par la table des pages
– TLB: Translation Lookaside Buffer
– Appelé aussi mémoire associative, se trouve à l’intérieur de la MMU
– Ces champs étalissent une correspondance point à point avec les champs de la
page
12/15/16 72
La mémoire associative
Valide Page virtuelle Modifié Protection Cadre de page
indices
code
données
données
code
code
pile
pile
12/15/16 74
La mémoire associative
12/15/16 77
Tables des pages multi-niveaux
• Avec la méthode des tables
de pages multi-niveau, on ne
garde pas en mémoire toutes
les tables de pages en
particulier celles dont nous
n’avons pas besoin.
• Exemple: Un processus a
besoin de 12 Mo: 4Mo
inférieur pour le code, 4 Mo
pour les données, 4 Mo pour
la pile
12/15/16 78
Tables des pages multi-niveaux
• Le 1er niveau correspond au champ
PT1 (1024 entrées)
12/15/16 79
Tables des pages multi-niveaux
• L’entrée localisée par
l’indexation de la table des
pages de niveau 1 produit
l’adresse ou le numéro de
cadre de page de la table des
pages de second niveau
12/15/16 80
Tables des pages multi-niveaux
• À titre d’exemple
– Considérons
l’adresse virtuelle sur
32bits 0x00403004
soit:
– 0000 0000 01 | 00
0000 0011 | 0000 0000
0100
– PT1 = 1, PT2 =3,
Décalage = 4
12/15/16 81
Tables des pages inversés
• Pour les processeurs 64 bits, l’espace d’adressage est
de 264 bits, avec des pages de 4 Ko, il faut une table des
pages avec 252 entrées
– 264 /4*1024 = 264 /22*210 = 264/212 = 252
– Si chaque entrée est sur 8 bits, la taille de table sera
supérieur à 30 Millions de Go !!!!
12/15/16 82
Table de pages inversée
• Problèmes
– Liaison d’adresse plus compliquée (parcours de la
table)
12/15/16 84
Exercice : tables de pages multi-niveaux
12/15/16 85
Correction Exercice : tables de pages multi-
niveaux
1) Le déplacement dans une page est sur 12 bits. Donc sa
taille est de 4 kilos
2) La table de premier niveau contient 1024 entrées (10 bits
du premier niveau d’index de pagination). Chaque entrée
occupe 32 bits. Donc la table des hyper-pages occupe 32
kilo
12/15/16 86
Correction Exercice 1 : tables de pages multi-
niveaux
12/15/16 87
LES ALGORITHMES DE
REMPLACEMENT DE PAGES
12/15/16 88
Les algorithmes de remplacement de
pages
• Quand un défaut de page se produit, le S.E doit
choisir une page à enlever de la mémoire afin de
faire de la place pour la page qui doit être chargée
12/15/16 89
Les algorithmes de remplacement de
pages
• Bien qu’il soit possible de choisir au hasard la page à
supprimer à chaque défaut de page, les performances du
système seront meilleures si c’est une page peu utilisée qui
est choisie
12/15/16 90
L’algorithme optimal de remplacement
de page
• Le meilleur algorithme de remplacement de page
imaginable est facile à décrire mais impossible à implanter.
12/15/16 91
L’algorithme optimal de remplacement
de page
• L’algorithme de page optimal dit simplement que c’est la
page dont l’étiquette est la plus grande qui sera enlevée.
– Si une page n’est pas utilisée avant 8 millions d’instructions et une
autre page avant 6 millions d’instructions,
– la suppression de la première repousse le défaut de page aussi
tard que possible
12/15/16 92
L’algorithme de remplacement de la
page non récemment utilisée
• Afin de permettre au système d’exploitation de
collecter des statistiques utiles sur le nombre de
pages utilisées et le nombre de page inutilisées, la
plupart des ordinateurs avec mémoire virtuelle
possèdent 2 bits d’état associés à chaque page.
– Le bit R est mis à 1 à chaque fois que la page est
référencée (lue ou écrite) et le bit M est mis à 1 quand la
page est réécrite (modifiée par rapport à la version du
sauvegardé sur le disque)
– Ces bits doivent être mis à jour à chaque référence
mémoire, et qu’il est donc essentiel que cette mise à jour
soit matérielle
12/15/16 93
L’algorithme de remplacement de la
page non récemment utilisée
• Quand un processus démarre, les 2 bits de page pour toutes ses
pages sont mis à 0 par le S.E
12/15/16 94
L’algorithme de remplacement de la
page non récemment utilisée
• Bien que l’existence de page de classe 1 semble impossible
à première vue, celles-ci sont générées lorsque le bit R d’une
page de classe 3 est effacé par une interruption d’horloge
– Les interruptions d’horloge n’effacent pas le bit M parce que cette
information est nécessaire pour savoir si la page a été réécrite sur le
disque ou pas
– Si le bit R est effacé mais pas le bit M, cela aboutit à la classe 1.
12/15/16 95
L’algorithme de remplacement de
page premier entrée, premier sorti
• Le S.E maintient une liste FIFO de toutes les pages
couramment en mémoire, la page la plus ancienne
étant en tête de liste et la page la plus récente en
queue
• Inconvénient
– les vieilles pages peuvent aussi être celles qui sont le plus
utilisées
12/15/16 96
L’algorithme de remplacement de
page de la seconde chance
• On peut apporter une modification simple à
l’algorithme FIFO afin d’éviter la suppression d’une
page à laquelle on a couramment recours.
12/15/16 97
L’algorithme de remplacement de
page de la seconde chance
12/15/16 98
L’algorithme de remplacement de
page de la seconde chance
• Supposons qu’un défaut de page
se produise à l’instant 20, la page
la plus ancienne est A, qui arrivée à
l’instant 0, au démarrage du
processus
12/15/16 99
L’algorithme de remplacement de
page de la seconde chance
• Le travail de l’algorithme de la seconde chance
consiste à chercher une ancienne page qui n’a pas
été référencée dans le précédent intervalle
d’horloge.
12/15/16 100
L’algorithme de remplacement de
page de la seconde chance
• Si toutes les pages ont été
référencés (R=1), le S.E
deplace une par une les pages
à la fin de la liste,
– effaçant le bit R chaque fois qu’il
ajoute une page à la fin de la
liste.
• L’algorithme se termine
toujours
12/15/16 101
Algorithme de l'horloge
• Bien que l’algorithme de la seconde
chance soit un algorithme
satisfaisant, il manque d’efficacité
parce qu’il déplace constamment
des pages dans sa liste
12/15/16 102
Algorithme de l'horloge
• Quand un défaut de page
survient, la page pointée est
examinée.
– Si son bit R est à 0, la page est
évincée, la nouvelle page est
insérée dans l'horloge à sa place, et
le pointeur est avancé d'une
position.
– Si le bit R est à 1, il est effacé et le
pointeur est avancé sur la
prochaine page.
– Ce processus est répété jusqu'à ce
qu'une page R = 0 soit trouvée.
– Cet algorithme de l'horloge diffère
de l'algorithme de la seconde
chance uniquement dans son
implémentation
12/15/16 103
L'algorithme de remplacement de la
page la moins récemment utilisée
• Pour s'approcher au mieux de l'algorithme optimal, il faut se
fonder sur l'observation suivante : les pages les plus
référencées lors des dernières instructions seront
probablement très utilisées dans les prochaines
instructions.
12/15/16 104
L'algorithme de remplacement de la
page la moins récemment utilisée
• Cette méthode est appelée pagination LRU (Least Recently
Used, la moins récemment utilisée).
12/15/16 105
L'algorithme de remplacement de la
page la moins récemment utilisée
• Cependant, il existe d'autres manières d’implémenter cet algorithme avec
des composants matériels particuliers.
12/15/16 106
L'algorithme de remplacement de la
page la moins récemment utilisée
• Examinons à présent une deuxième solution matérielle.
Pour une machine à n cadres de pages, le matériel doit
gérer une matrice de n * n bits, initialement tous nuls.
12/15/16 107
L'algorithme de remplacement de la
page la moins récemment utilisée
Référence des pages: 0,1,2,3,2,1,0,3,2,3
12/15/16 108
La simulation logicielle de l’algorithme
LRU
• Bien que le deux algorithmes LRU
précédents soient réalisables, peu de
machines disposent du matériel
adéquat.
12/15/16 110
L’algorithme NFU
12/15/16 111
Algorithme de vieillissement
• Il existe néanmoins une petite modification que l’on peut
apporter à l’algorithme NFU pour lui permettre de se
comporter comme l’algorithme LRU
12/15/16 112
Algorithme de vieillissement
12/15/16 113
Algorithme de vieillissement
12/15/16 114
LA SEGMENTATION
12/15/16 115
Problèmes de la pagination
12/15/16 116
Problèmes de la pagination
12/15/16 117
Problèmes de la pagination
• Bibliothèque chargées dynamiquement lors de
l’exécution du code
– Les S.E s’appuient sur des bibliothèques dynamiques pour
rendre les logiciels moins dépendant des différents versions des
services fournis par le système
– Ces bibliothèques ont une interface d’appel bien définie mais ne
sont pas incluses dans le logiciel qui les utilise
– C’est seulement au moment où elles sont nécessaire que le
système les charge en mémoire et les exécute
– → Ces bibliothèque ne savent pas à l’avance à quel offset
elles se trouveront dans l’espace du processus, ce qui
complique considérablement l’édition de liens à la volée que
nécessite leurs chargement
12/15/16 118
Principes de la segmentation
• Comment libérer le programmeur de la gestion de
l’accroissement et de la diminution des tables?
12/15/16 119
Principes de la segmentation
• la segmentation est une technique gérée par l'unité
de segmentation de la MMU, utilisée sur les
systèmes d'exploitation modernes,
– qui divise la mémoire physique (dans le cas de la
segmentation pure)
– ou la mémoire virtuelle (dans le cas de la
segmentation avec pagination)
– en segments caractérisés par leur adresse de
début et leur taille (décalage).
12/15/16 120
Principes de la segmentation
• Puisque chaque segment constitue un espace d’adressage
séparé, les segments peuvent changer de longueur de
manière indépendante, sans que cela affecte les autres.
12/15/16 121
Principes de la segmentation
Dans un espace
d'adressage à une
dimension, une table
des pages qui croît
peut en chevaucher
une autre.
12/15/16 122
Principes de la segmentation
Une mémoire segmentée permet à chaque table de croître ou
de diminuer indépendamment des autres.
Exemple: compilateur
12/15/16 123
Principes de la segmentation
12/15/16 124
Considérations Pagination Segmentation
Le programmeur doit-il connaître Non Oui
la technique utilisée?
Combien y a-t-il d'espaces 1 Plusieurs
d'adressage linéaires?
L'espace total d'adressage peut-il Oui Oui
dépasser la taille de la mémoire
physique?
Les procédures et les données Non Oui
peuvent-elles être séparées et
protégées séparément?
Peut-on traiter facilement des Non Oui
tables dont les tailles varient?
Le partage de procédures entre Non Oui
utilisateurs est-il simplifié?
Pourquoi cette technique a-t-elle Pour obtenir un grand Pour permettre la séparation des
été inventée ? espace d’adressage programmes et des données dans
linéaire sans avoir à des espace d’adressage
acheter de la mémoire logiquement indépendants et
physique pour faciliter le partage et la
protection
12/15/16 125
Implantation de la segmentation
pure
12/15/16 126
Implantation de la segmentation
pure
• Une mémoire physique contenant
initialement 5 segments
• (e) opération de
compactage permet
cependant d’y
remédier
12/15/16 128
Implantation de la segmentation
pure
•l'adresse virtuelle issue du
processeur à la forme (segment,
déplacement).
12/15/16 131
La segmentation avec pagination
• la segmentation paginée,
– Chaque segment sera paginé.
– Autrement dit, le champ déplacement d du
couple (s, d) de l'adresse virtuelle sera
interprété comme un numéro de page et
un déplacement (p, d’).
– (s,d) = (s,p,d’)
12/15/16 132
La segmentation avec pagination
12/15/16 133
Problème de fragmentation
• Les systèmes paginés rencontrent un problème de
fragmentation interne : de la place est perdue à la fin
d'une page.
– une page entière est allouée à un processus, alors que seuls
quelques octets sont occupés. Par exemple, si l'on suppose une
taille de page de 4 Kio, un processus ayant besoin de 5 000 octets
va se voir allouer 2 pages, soit 8 192 octets, près de 40 % est
« perdu ».
12/15/16 146
GESTION DE LA MÉMOIRE
DU PROCESSUS LINUX
12/15/16 147
Introduction
• Nous allons nous intéresser à toutes les techniques permettant
de gérer avec plus ou moins de précision l'espace mémoire d'un
processus.
12/15/16 148
Les variables utilisées dans un
programme C
• Les variables utilisées dans un programme C peuvent
être allouées de diverses manières :
– Les variables globales ou les variables déclarées statiques au
sein des fonctions sont allouées une fois pour toutes lors du
chargement du programme.
12/15/16 149
Les variables utilisées dans un
programme C
• Le fait d'employer des variables dynamiques complique quelque peu la
programmation, puisqu'il faut les manipuler au travers de pointeurs. De
plus, elles doivent être allouées manuellement avant toute utilisation.
Pourtant, il est nécessaire d'utiliser ces variables dans plusieurs cas :
– Lorsqu'on ne connaît pas la taille des variables lors de la compilation (par exemple
une table contenant un nombre fluctuant d'éléments).
12/15/16 150
Utilisation de malloc( )
• Pour allouer une nouvelle zone de mémoire, on utilise généralement la fonction
malloc( ), dont le prototype est déclaré dans <stdlib.h> ainsi :
– void * malloc (size_t taille);
– L'argument transmis correspond à la taille, en octets, de la zone mémoire désirée.
– Le type size_t étant non signé, il n'y a pas de risque de transmettre une valeur négative.
• Si on demande une taille valant zéro, la version Gnu de malloc( ) renvoie un pointeur
NULL. Sinon, le système nous accorde une zone de la taille voulue et renvoie un
pointeur sur cette zone.
• Le code demandant d'allouer une nouvelle structure de type ma_struct_t serait donc :
12/15/16 151
Exemple 1 malloc
12/15/16 153
Exemple 1 malloc
• $ echo « 1 » >
/proc/sys/vm/overcommit_memory
• $ echo « 40 » >
/proc/sys/vm/overcommit_ratio
12/15/16 154
Exemple 1 malloc
12/15/16 155
Exemple 2 malloc
12/15/16 156
Exemple 2 malloc
12/15/16 157
Utilisation de calloc( )
12/15/16 158
Utilisation de calloc( )
• La fonction calloc() assure aussi que les zones allouées
sont initialisées avec des zéros.
12/15/16 159
Exemple calloc 1
12/15/16 160
Exemple 2 calloc
12/15/16 161
Exemple 3 calloc
12/15/16 162
Utilisation de free()
12/15/16 163
Utilisation de free()
• Une fois qu’une zone a été libérée, il ne faut sous aucun
prétexte essayer d’y faire de nouveau référence.
12/15/16 164
Utilisation de free()
12/15/16 166
Désallocation automatique avec
alloca()
• Le fonctionnement est identique à celui de malloc(), mais les zones de mémoire ne
sont plus allouées dans le segment de données, mais à l’opposé dans la pile du
processus.
• Les données allouées avec alloca() sont placées dans le segment de pile du
processus.
• L’avantage principal est que les zones allouées sont automatiquement libérées
lors de la sortie de la fonction ayant invoqué alloca().
• On comprend bien d’ailleurs qu’il ne faut pas invoquer free() sur le pointeur
renvoyé par alloca(), les domaines de travail de ces deux fonctions étant
totalement disjoints
12/15/16 167
Débogage des allocations mémoire
12/15/16 168
Débogage des allocations mémoire
12/15/16 169
Débogage des allocations mémoire
12/15/16 171
Débogage des allocations mémoire
12/15/16 172
Débogage des allocations mémoire
12/15/16 174
Surveillance automatique des zone allouée
12/15/16 175
Suivi intégré des allocations et des
libérations
12/15/16 176
Exemple débordement
12/15/16 177
Exemple débordement
12/15/16 178
Exemple débordement
• Deux débordements
12/15/16 179
Exemple fuite
12/15/16 180
Exemple fuite
12/15/16 181
Exemple fuite
12/15/16 182
Exemple fuite
12/15/16 183
Suivi intégré des allocations et des
libérations
• Les versions de malloc(), calloc(), realloc() et free() contenues
dans la GlibC permettent d’enregistrer automatiquement
toutes leurs actions dans un fichie externe.
12/15/16 184
Suivi intégré des allocations et des
libérations
• Naturellement, on active souvent le suivi dès le
début de la fonction main(), et on ne le désactive
pas.
– Mais on peut ainsi retreindre le champ de l’analyse à une
fonction particulière.
12/15/16 185
Suivi intégré des allocations et des
libérations
12/15/16 186
Suivi intégré des allocations et des
libérations
12/15/16 187
Suivi intégré des allocations et des
libérations
Lorsque le programme ne
présente pas de défaut,
mtrace l’indique:
12/15/16 188
Règles de bonne conduite pour
l’allocation et la libération de mémoire
I. À chaque déclaration d’un pointeur, on l’initialise avec NULL. Ceci
concerne également les membres des structures allouées
dynamiquement s’il s’agit de pointeurs.
III. Après tout appel de malloc(), on s’assure qu’aucune erreur n’a eu lieu,
sinon on gère le problème.
12/15/16 189
Règles de bonne conduite pour
l’allocation et la libération de mémoire
12/15/16 190
THE END
12/15/16 191