Professional Documents
Culture Documents
Auteur :
rz0
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
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.
Le coeur du problme rside donc dans l'valuation de l'accessibilit des divers objets qui composent les donnes du programme.
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.
qui, je l'espre, trouveront leur place dans un article futur incontestable de la simplicit.
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.