2
Le va-et-vient : introduction
La mémoire ne peut pas toujours contenir les
processus de tous les utilisateurs, il faut placer
quelques processus sur disque
Il faut, bien sur, ramener ce processus en mémoire
principale avant de les exécuter
Le mouvement des processus entre la mémoire
principale et le disque est appelé va-et-vient
(swapping)
Multiprogrammation
avec partitions variables (1)
On peut, en principe, utiliser les partitions fixes pour les va-et-vient (dés qu’un processus se
bloque, on le déplace sur disque et on le remplace par un autre)
En pratique, les partitions fixes ne sont pas intéressantes lorsque la mémoire est limitée (on
perd beaucoup de place à cause des programmes qui sont plus petits que les partitions
Il faut utiliser une autre solution : les partitions variables
Avec des partitions variables, le nombre et la taille des processus en mémoire varient au cours
du temps
A
SE A
SE
BA
SE
BA
SE
B
C
SE
B
C
SE
B
C
DSE
C
DSE
C
D
E
La différence fondamentale avec les partitions fixes est que le nombre, la position et la taille
des partitions varient dynamiquement au fur et à mesure que les processus entrent ou sortent
de la mémoire
Plus limitée par un nombre fixe de partitions ou par la taille des partitions ; cette souplesse
accrue améliore l’usage de la mémoire mais complique son allocation et sa libération
On peut réunir les espaces inutilisées en une seule partition, on effectue alors un compactage
de la mémoire
Multiprogrammation
avec partitions variables (2)
La taille mémoire allouée aux processus mérite une attention particulière
L’allocation est simple si les processus ont une taille fixe qu’ils ne modifient jamais ; si en revanche
les processus allouent dynamiquement de la mémoire dans le tas, on a des difficultés dès qu’un
processus demande de la mémoire
S’il existe un espace adjacent au processus, ce dernier pourra occuper cet espace ; mais s’il est
entouré par deux autres processus, il faut soit le déplacer à un emplacement mémoire susceptible de
le contenir, soit déplacer un ou plusieurs processus sur disque pour créer une emplacement de taille
suffisante
Si la mémoire est saturée et si le swap ne peut plus contenir de processus, il faut tuer le processus !
La taille des processus augmente en général au cours de leur exécution ; on peut donc allouer à
chaque processus un peu plus de mémoire qu’il ne demande afin de réduire le temps système perdu
pour cette gestion ; il faut cependant recopier sur disque uniquement la mémoire réellement utilisée
par le processus
Les processus ont 2 segments qui peuvent grandir (le tas et la pile), on place la mémoire disponible
entre ces 2 segments et cet espace peut être utilisé indifféremment par un de ces segments ; si cet
espace se remplit, il faut soit déplacer le processus à un emplacement mémoire plus grand, soit le
recopier sur disque jusqu’à ce qu’il y ait de la place en mémoire principale, soit le tuer
Il existe 3 manières de mémoriser l’occupation de la mémoire : les tables de bits (bit maps), les listes
et les subdivisions (buddy)
Gestion mémoire par tables de bits
La mémoire est divisée en unités d’allocation dont la taille varie de quelques mots à
plusieurs Mo
A chaque unité, on fait correspondre un bit dans la table de bits (bit maps) qui est à 0
si l’unité est libre et à 1 si elle est occupée
La taille de l’unité d’allocation joue un rôle important : plus elle est faible, plus la table
de bits est important ; si on prend une unité d’allocation de grande taille, on réduit la
taille du bit map, mais on perd beaucoup de place mémoire chaque fois qu’un
processus n’est pas un multiple de l’unitéd’allocation
Le bit map permet donc de mémoriser l’occupation mémoire dans un espace
mémoire de taille fixe : la taille d’un bit map ne dépend pas de la taille de la mémoire
mais de la taille de l’unité d’allocation
Le seul problème survient lorsque l’on doit placer en mémoire un processus de k
unités ; le gestionnaire doit parcourir le bit map à la recherche de k zéros consécutifs ;
cette recherche est lente, ce qui fait qu’en pratique on utilise rarement les bit maps
Gestion mémoire par listes
chaînées
Une deuxième méthode pour mémoriser l’occupation mémoire consiste à gérer une liste chaînée de
segments libres et occupés
Un segment est un processus ou un espace libre entre deux processus
Chaque entrée de la liste spécifie :
– une zone libre (H [pour Hole]) ou un processus (P), – son adresse de départ
– sa longueur – un pointeur sur l’entrée suivante
Trier la liste en fonction des adresses permet de mettre à jour facilement la liste lorsqu’un processus se
termine ou est déplacé sur disque
+ieurs algos peuvent être utilisés à partir de cette liste pour allouer la mémoire aux processus
Le + simple : l’algo de la première zone libre (first fit) : rechercher le premier segment H qui peut contenir le
processus, le scinder en 2 (la première contient le processus, la seconde est H) : algo rapide puisque très
peu de recherche
Algo de la zone libre suivante (next fit) : légère variante : la recherche commence à partir de la dernière
zone libre trouvé : performance légèrement inférieure à first fit [Bays 1977]
Algo du meilleur ajustement (best fit) : on recherche dans toute la liste la plus petite zone libre qui convient,
on évite ainsi de fractionner une grande zone dont on pourrait avoir besoin ultérieurement : + lent et +
étonnant : il fait perdre plus de place mémoire que first fit (fractionnement en petite zone inutilisable) !
Algo du plus grand résidu (worst fit) : inverse on prend la plus grande zone libre : pas de bonnes perf.
Optimisations : 2 listes (pour les H et pour les P), utiliser les zones libres pour mémoriser les H : le premier
mot de chaque zone libre contient la taille de la zone et le deuxième un pointeur sur l’entrée suivante
l
o du
lacement ra
ide
uick fi
: utilise des listes sé
arées
ar les tailles de zone les
lus courantes
Gestion mémoire par subdivision
Les listes chaînées accélèrent l’allocation mémoire mais rendent la libération plus lente car il faut examiner
les voisins des segments libérés
L’allocation par subdivision (buddy system) est un algo de gestion qui s’appuie sur le fait que les
ordinateurs utilisent des adresses binaires de manière à accélérer la fusion des zones libres adjacentes
Le gestionnaire de la mémoire mémorise une liste de blocs libres dont les tailles sont 1, 2, 4, 8, 16, …
octets jusqu’à la taille maximale de la mémoire
Ex :
Zone
libre
Initialement 1
Demande 70 3
Demande 35 B 64 3
Demande 80 B 64 3
libération A B 64 4
Deamnde 60 B D 3
Libération B 64 D 4
Libération D 3
Libération C 1
A
256 512
512
512
256
128 1024
A
A
1024
C
C
C
C
C
128
128
128 512
128
128
Mémoire
256
512
512
512
128
128
128
L’allocation par subdivision présente un avantage par rapport aux algos qui trient en fonction de leur taille :
quand un bloc de 2k octets est libéré, le gestionnaire de la mémoire doit examiner uniquement la liste des
zones libres de 2 k octets pour voir s’il peut reconstruire un bloc plus grand
Malheureusement, il est assez 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
Un processus de 35 Ko occupe un bloc de 64Ko, les 29 Ko excédentaires sont perdus, on parle de
fragementation interne
Fragmentation externe : zone libre entre 2 segments alloués, appelé aussi phénomène de damier
(checkerboarding)
De nombreux informaticiens (Peterson et Norman, Kaufman, …) ont modifié l’allocation de subdivision pour
contourner certaines de ses limitations