Vous êtes sur la page 1sur 6

Problmatique et principes fondamentaux du recyclage automatique de la mmoire

Tutoriel 12 commentaires Historique

Informations sur le tutoriel

Auteur :

rz0

Tlcharger en PDF Plus d'informations


Popularit Visualisations : 55 875 Apprciation des lecteurs : 0 0 0 6 Publicit Historique des mises jour Rester inform grce au flux RSS Le 11/07/2009 21:45:22 Lien mort Le 11/07/2009 14:06:49 Changement de catgorie : Articles > Programmation Partager EmailTwitterFacebook Plus de services Ce premier article de la srie que j'envisage d'crire vous propose de dcouvrir le recyclage automatique (garbage collection), une approche de gestion de la mmoire que vous avez sans doute dj utilise, peut-tre sans vous en rendre compte, travers des langages de haut niveau tels que Lisp, Java ou encore PHP.

Je tiens remercier bluestorm pour l'adaptation du code LaTeX d'origine en zCode et l'amlioration du script MetaPost ayant servi la cration de la quatrime figure.

Sommaire du tutoriel :

Prsentation Accessibilit des donnes Une premire mthode : mark&sweep

Prsentation
Un programme manipule, produit et stocke un nombre considrable de donnes durant son excution. Nous pouvons classifier celles-ci selon leur dure de vie, c'est--dire l'intervalle de temps pendant lequel elles sont ncessaires au programme. Il existe ainsi plusieurs types de dures de vie. Certains objets vivent et meurent avec le programme qui les emploie ; leur existence est toujours requise par le programme. Nous serions bien notre aise si nous pouvions nous contenter de cette premire catgorie. Nous pourrions alors crer des objets sans jamais nous soucier de remplir la mmoire de notre ordinateur. Malheureusement, la mmoire est physiquement limite et il arrive un moment o il nous faut recycler les objets devenus inutiles pour leur attribuer de nouvelles informations. Plusieurs approches existent. Beaucoup de langages, par exemple, proposent un concept apparent aux variables automatiques (souvent appeles variables locales) du C, dont l'existence est rgie par un bloc. Le principe est alors de structurer le programme : de placer des contraintes sur la dure de vie de certains objets ; dans notre exemple, il s'agit d'entourer les dclarations de variables concernes avec un bloc, visuellement, des accolades. Une autre perspective consiste pourvoir le codeur d'outils lui permettant de contrler directement la vie et la mort de ses objets ; les langages plus proches de la machine tels que le C proposent de telles constructions (les fonctions malloc, calloc et free, du C en sont un exemple). Les langages de plus haut niveau adoptent, quant eux, une vision diffrente du sujet. De tels langages vous permettent de crer loisir autant d'objets que possible, sans jamais vous soucier de les dtruire un jour. La mmoire vous apparat alors effectivement illimite. En vrit, c'est le systme (je ne parle pas forcment ici de votre systme d'exploitation, mais du systme offert par le langage, souvent appel implmentation) qui se charge de rclamer de luimme la mmoire inutilise. Nous allons prsenter, dans ce court article, les grands principes derrire ce mcanisme quelques fois bien pratique.

Accessibilit des donnes


La technique repose sur le concept d'accessibilit des objets. Un objet est accessible un moment donn de l'excution du programme s'il est susceptible d'tre encore utilis par celui-ci. Cela ne signifie aucunement qu'il le sera, simplement qu'il peut l'tre. Idalement, nous saurions voir l'avenir et distinguer l'avance l'utile de l'inutile qui pourrait tre immdiatement recycl. Nous nous contentons cependant d'une approximation de ce rsultat, qui a l'avantage d'tre calculable, en effectuant la dmarche inverse : nous ne savons pas quels objets vont tre rutiliss, mais pouvons sereinement liminer les objets inaccessibles.

Le coeur du problme rside donc dans l'valuation de l'accessibilit des divers objets qui composent les donnes du programme.

Rfrences et liens entre objets


Les donnes sont rarement indpendantes les unes des autres, et il arrive frquemment que les objets soient lis entre eux pour former des structures de donnes, telles que les listes chanes. Ils n'en sont pour autant pas moins des objets diffrents, utiliss ensembles. Toutefois, il est noter que le lien n'est pas toujours rciproque. Souvent, un objet dpend d'un autre, sans que l'inverse soit vrai. On dit alors que le premier contient une rfrence au second. Un objet B est accessible depuis un objet A si A comporte une rfrence B. Par extension, si C est accessible depuis B et B est accessible depuis A, alors C est accessible depuis A. Une autre perspective consiste considrer les rfrences comme des voies d'accs sens unique reliant deux points ; la succession de plusieurs voies de mme sens constitue un chemin. On dfinit alors l'accessibilit de B depuis A comme l'existence d'un chemin de A B.

Un exemple : les listes


Le cas le plus simple de structures offrant des perspectives de liens entre les objets est la liste simplement chane. Les listes peuvent tre dfinies en termes de noeuds. Chaque noeud contient une valeur et une rfrence vers la suite de la liste. En C, nous implanterions cela l'aide d'une structure deux champs, dont l'un est un pointeur vers une autre structure semblable.

Code : C - Slectionner 1 struct node { 2 struct node *ref; 3 Whatever value; 4 };


Afin d'illustrer la notion d'accessibilit, tudions trois exemples de disposition possibles de listes en mmoire. Les cadres reprsentent des objets de type struct noeud et les flches, les rfrences d'un objet un autre. Un objet est accessible partir d'un autre s'il est graphiquement possible d'arriver sa case reprsentative, depuis le dpart voulu, en suivant les flches.

Ci-dessus, une liste fictive prsentant cinq lments numrots de 0 4. Le 0 donne accs tous les autres lments, mais le 2 ne permet d'accder qu'aux valeurs qui le suivent : 3 et 4.

Ici, de mme, cinq lments sont prsents, mais ils forment, cette fois, deux listes plutt qu'une. Le diagramme montre clairement qu'il n'existe aucun chemin menant d'un lment de la premire (prenons le 1) un lment de la seconde (prenons le 3).

Notre dernier exemple prsente un cas particulier, o la valeur d'une cellule peut elle-mme tre un pointeur sur une liste. Ainsi, nous pouvons former des listes de listes. Dans ce cas prcis, le 1 donne accs au 2, comme prcdemment, mais galement au 3 ainsi qu'au 4 qui le suit.

Application au recyclage
Grce la relation prcdente, nous sommes capables de dterminer, tant donn un objet A, l'ensemble des objets accessibles depuis A. Nous pouvons ensuite en dduire l'ensemble des objets inaccessibles par diffrence (tout objet absent de l'ensemble des objets accessibles est inaccessible). Nous allons maintenant tenter d'appliquer ceci notre problme initial. Sans plus d'informations, les notions d'accessibilit ne nous sont d'aucune aide, puisqu'elles permettent seulement d'affirmer une dpendance entre deux objets. Il est ncessaire, afin d'en faire usage, de possder des informations sur au moins un objet. De plus, une proprit essentielle de tout programme de recyclage est que la valeur d'un objet actuellement ou potentiellement en usage n'est pas affecte par le processus de rcupration. De ce fait, il nous faut non seulement fournir des informations sur les objets connus, mais il est galement ncessaire que ces informations soient compltes, c'est--dire qu'elles permettent de dduire tous les objets accessibles par le programme. L'ensemble de ces objets connus suffisants est appel ensemble des racines (et chaque membre est une racine). Il n'existe pas de rgle universelle pour le choix de cet ensemble, celui-ci dpend tout entier de la manire dont le langage vis est implant. Il est possible, par exemple, d'utiliser un jeu plus ou moins riche de racines. Point technique (facultatif) Le jeu de racines minimal peut, toutefois, dans la grande majorit des langages, tre assimil un objet contenant un nombre limit et prdfini de rfrences. Ce modle repose sur l'observation intuitive que tout code qui n'est pas modifi durant l'excution du programme n'a accs qu'aux informations disponibles lors de la compilation ou du chargement. Ceci tant, tout accs qu'il contient devra passer par un objet globalement connu de tous les acteurs contribuant au bon droulement des oprations (compilation, chargement, excution, etc.). La plupart des langages base de procdures peuvent dcrire leur ensemble de racines comme tant la runion des objets globalement visibles et des objets prsents sur la pile d'excution. Toutefois, il est tout fait possible de considrer que la pile n'est elle-mme qu'une structure de donnes dont la tte est rfrence par une entit globale.

Une premire mthode : mark&sweep


Les outils dvelopps dans la section prcdente permettent d'tablir les ensembles d'objets accessibles et inaccessibles. Cette information est la base de tout programme de recyclage. Une fois celle-ci acquise, nous pouvons effectuer diverses oprations sur les donnes, maintenant classes, selon qu'elles sont utiles ou inutiles. Les donnes devenues inutiles sont typiquement mises en rserve en attente d'une prochaine demande de mmoire. Les donnes dsignes comme potentiellement ncessaires sont conserves. Il apparat ainsi que le travail peut tre scind en deux phases : une phase d'analyse, servant dterminer l'accessibilit de chaque objet et une phase de nettoyage, charge de librer la mmoire marque par l'analyse comme rcuprable. C'est le principe du recyclage mark & sweep que nous allons brivement tudier dans cette section. C'est l'une des mthodes les plus basiques de collecte de la mmoire. L'algorithme que nous allons aborder est trs naf et il existe maintes faons de l'amliorer (faons

qui, je l'espre, trouveront leur place dans un article futur incontestable de la simplicit.

). Il possde cependant l'avantage

Principe de l'analyse
L'analyse consiste parcourir, depuis l'ensemble des racines, tous les objets accessibles. C'est un processus servant dterminer l'ensemble des objets accessibles. Au dpart, aucune information n'est connue sur quelque objet que ce soit. Tous les objets atteints par l'analyse sont considrs comme accessibles par le programme. On dit que chaque objet atteint est marqu par l'analyse, d'o le nom de l'algorithme. Lorsque l'analyse dcouvre un nouvel objet, deux cas se prsentent : si l'objet n'a pas t marqu, il est marqu ; si l'objet a dj t marqu, nous sommes revenus sur nos pas, et le marquage s'arrte, pour ce chemin.

L'analyse procde ensuite rcursivement en examinant tous les objets associs aux rfrences contenues dans l'objet en cours. Elle traverse ainsi tous les objets accessibles, par plusieurs chemins. Un chemin se termine si l'objet analys ne contient aucune rfrence, ou s'il a dj t marqu. L'image suivante prsente ce processus rcursif l'aide de couleurs.

Les blocs contigus reprsentent des objets et les flches, des rfrences. L'unique racine est prise comme tant le premier lment. Les diffrents tons de gris marquent la progression du collecteur travers les objets ; la nuance indique la profondeur du parcours, c'est--dire la distance, en termes de liens suivis, entre la racine et l'lment color. Les blocs demeurs blancs n'ont pas t atteints par l'analyse et peuvent donc tre rclams. Point technique (facultatif) En pratique, il existe de diverses faons d'implanter l'information d'appartenance au premier ou au second ensemble. Une solution simple (mais contraignante, dans une certaine mesure) est d'utiliser des listes doubles, reliant les objets d'un mme ensemble entre eux. Chaque passage sur un objet modifierait les listes de manire approprie. D'autres stratgies, telles que l'utilisation d'un tableau de bits, ou le placement d'un bit d'tat au dbut de chaque objet, sont galement envisageables, pour peu qu'il soit possible de parcourir intgralement la mmoire de manire linaire. Cette gestion fine de la mmoire est disponible sur beaucoup de systmes d'exploitation, et peut tre simule (non sans peine) en C normal.

Principe du nettoyage
La phase de nettoyage est, en rgle gnrale, triviale. Il suffirait, dans le plus simple des cas, de

parcourir l'ensemble des lments qui n'ont pas t marqus (rests blancs dans l'exemple de la figure) et de leur appliquer l'opration de libration de la mmoire (par exemple, free). Le point cl affectant la phase de nettoyage rside dans le choix de la reprsentation des ensembles blanc et marqu, dj discut.

Caractristiques de l'algorithme
L'algorithme que nous avons tudi prsente les caractristiques suivantes : il est capable de collecter tous types de structures, y compris les structures formant des cycles ; il parcourt l'intgralit des objets utiles, et ncessite l'accs l'ensemble de tous les objets pour oprer ; il effectue son travail en un seul passage constitu de deux phases ; il peut engendrer une fragmentation importante de la mmoire.

Ces proprits ne sont pas partages par tous les algorithmes de recyclage. Les deux premiers contrastent avec le comptage de rfrence. La continuit du travail est le souci des algorithmes par incrments, et de collecte partielle. La fragmentation est mitige par les algorithmes de copie et de compactage de la mmoire. Le problme de la fragmentation survient du fait de la continuit de la mmoire. Rclamer des blocs de mmoire cre des zones inoccupes entre les objets occups. Dans l'exemple du mark&sweep, les cellules restes blanches deviendront libres lors du nettoyage. Deux inconvnients se trouvent lis cette fragmentation : la cration de petits espaces contigus libres ne permet pas l'allocation de larges blocs ; les objets utiles sont disperss dans la mmoire, ce qui nuit la localit spatiale.

Ces mmes dsagrments accompagnent l'usage de routines d'allocation manuelle. Cependant, un programme utilisant ces dernires aura tendance n'exploiter la mmoire dynamique qu'en cas de ncessit. En revanche, selon le niveau d'optimisation offerte par le compilateur du langage vis, il se peut que cette mmoire soit bien davantage sollicite, dans le cas d'un environnement gestion automatique de la mmoire, et ce, mme pour des objets courte dure de vie.

Dans cet article, nous avons pos les fondements du problme de la collecte de la mmoire, et expos les premiers outils permettant d'automatiser cette tche. L'algorithme expliqu est naf, mais quelques lgres variations en feraient dj un choix parfaitement viable pour certains environnements relativement rduits et ferms. Bien que nous n'en ayons donn aucune implantation, l'criture devrait tre triviale, et peut constituer un bon exercice pour le lecteur, s'il dsire acqurir quelques comptences pratiques complmentaires. Le second article, portant sur le recyclage progressif (incremental), est maintenant disponible sur le Site du Zro ; je vous invite donc le lire si vous souhaitez dcouvrir une des techniques plus avances de gestion de la mmoire automatique.