“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 77 — #87
i
i
i
i
i
i
i
i
2.5 La gestion de mémoire
77
de la cause (la récupération erronée). Le débogage des pointeurs détachés est
difficile.
– Une fuite de mémoire. Cette erreur arrive quand un bloc n’est pas récupéré
bien qu’il ne soit plus accessible. La taille de la mémoire allouée augmentera
continuellement jusqu’à l’épuisement de la mémoire du système. Les fuites de
mémoire sont moins dangereuses que les pointeurs détachés parce que les programmes peuvent continuer à s’exécuter longtemps avant que l’erreur ne les force
à s’arrêter. Les programmes à longue vie, comme les systèmes d’exploitation et
les serveurs, ne doivent pas avoir de fuites de mémoire.
2.5.3 Le ramassage de miettes
Beaucoup de langages de haut niveau, comme Erlang, Haskell, Java, Lisp, Prolog,
Smalltalk, Oz, etc., font de la récupération automatique. La récupération est faite par le
système indépendamment du programme. Les pointeurs détachés sont complètement
éliminés et les fuites de mémoire grandement réduites. Le programmeur est délesté
du fardeau de la gestion manuelle de mémoire. La récupération automatique s’appelle
le ramassage de miettes (« garbage collection » en anglais). C’est une technique
connue qui a été utilisée pendant longtemps, depuis les années 1960 pour les premiers
systèmes Lisp. Jusqu’aux années 1990, les langages courants ne l’utilisaient pas, parce
qu’il était jugé (à tort) comme trop inefficace. Il est enfin devenu acceptable dans les
langages courants à cause de la popularité du langage Java.
Un ramasse-miettes a typiquement deux phases. Dans la première phase, il détermine quelle partie de la mémoire est active. Il le fait en cherchant toutes les structures
de données qui sont accessibles depuis un ensemble de pointeurs initiaux appelés les
racines. Dans un système d’exploitation, le terme « pointeur » désigne une adresse
dans l’espace mémoire d’un processus. Dans le contexte de notre machine abstraite,
un pointeur est une variable en mémoire. L’ensemble des racines est l’ensemble de
pointeurs dont le programme a toujours besoin. Pour la machine abstraite de la section
précédente, l’ensemble des racines contient toutes les variables de la pile sémantique.
En général, l’ensemble des racines contient tous les pointeurs dans les fils prêts. Nous
verrons cela quand nous étendrons la machine abstraite dans les chapitres ultérieurs.
L’ensemble des racines contient aussi les pointeurs à distance utilisés dans la programmation répartie.
10
Dans la deuxième phase, le ramasse-miettes compacte la mémoire. Il rassemble
tous les blocs de mémoire actifs dans un bloc contigu (un bloc sans trous) et tous les
blocs de mémoire libres dans un autre bloc contigu.
10. Voir chapitre 11 de [97].
© Dunod – La photocopie non autorisée est un délit
Précédent

- 92/370

Suivant