Allocation de mémoire

Les algorithmes sous-jacents à tout programme informatique consomment essentiellement deux ressources : du temps et de l'espace. En machine, l'espace peut être la mémoire vive volatile ou la mémoire de masse persistante. Cet article discute de l'allocation de mémoire vive.

Trois stratégies d'allocation peuvent être employées : allocation statique, allocation dynamique sur la pile, et allocation dynamique sur le tas. L'allocation statique est principalement le fait des langages de programmation compilés. Les langages interprétés ne peuvent, par définition, qu'allouer la mémoire à la demande, lors de l'exécution.

À chacune des stratégies correspond une région mémoire du programme, ou segment. Ces segments sont nommés text (statique), stack (pile) et heap (tas).

L'opération symétrique de l'allocation est couramment appelée libération de la mémoire (on peut parler également de désallocation ou de restitution).

Sommaire

Les trois modes d'allocation

Allocation statique

Allouer statiquement de la mémoire pour un programme signifie :

  • prévoir l'espace mémoire nécessaire avant l'exécution du programme, en spécifiant la quantité nécessaire dans le code source ;
  • réserver cet espace au moment de la compilation, dans le fichier binaire produit ;
  • au chargement du programme en mémoire, juste avant l'exécution, l'espace réservé devient alors accessible.

Lors de l'exécution, aucune allocation n'a lieu.

L'avantage de l'allocation statique se situe essentiellement au niveau des performances, puisqu'on évite les coûts de l'allocation dynamique à l'exécution : la mémoire statique est immédiatement utilisable.

Sur les systèmes d'exploitation communs, la mémoire allouée statiquement est placée dans le segment text, le segment data ou le segment bss du programme, selon le destin de cette zone mémoire (réservée, initialisée, lecture seule…).

Allocation sur la pile

L'exécution d'un programme est généralement structurée autour d'une pile contenant les cadres d'appel à des fonctions (ou procédures) du langage de programmation utilisé. Schématiquement, les variables lexicales, c'est-à-dire les variables définies dans la portée textuelle d'une fonction, sont donc allouées lors de l'entrée dans la fonction, et désallouées automatiquement lors de la sortie (du retour) de la fonction.

Un segment mémoire, dit segment de pile, est utilisé pour ces allocations/désallocations. Aucun mot clef n'est nécessaire dans le code source d'un langage supportant la notion de variable lexicale : celles-ci sont allouées et libérées selon la discipline de pile par définition.

Certains langages, comme C ou C++, parlent de variables locales ou automatiques au lieu de variables lexicales, mais il s'agit de la même chose.

Allocation sur le tas

La plupart des programmes ayant des besoins en mémoire dépendant de l'usage qu'on en fait, il est nécessaire de pouvoir, à des moments arbitraires de l'exécution, demander au système l'allocation de nouvelles zones de mémoire, et de pouvoir restituer au système ces zones (désallouer la mémoire). Dans ce cas, l'allocation et la libération de la mémoire sont sous la responsabilité du programmeur. Les fuites de mémoire, ainsi que d'autres erreurs fréquentes dans les programmes à gestion manuelle de la mémoire, ont leur source dans les erreurs d'allocation mémoire sur le tas.

Classiquement, les fonctions de la bibliothèque standard de C malloc et free, les opérateurs du langage C++ new et delete permettent, respectivement, d'allouer et désallouer la mémoire sur le tas.

Les langages de programmation dotés de ramasse-miettes utilisent, mais de façon transparente pour le programmeur, l'allocation sur la pile et les primitives alloc/free. Dans ce dernier cas, le ramasse-miettes permet au développeur de ne pas se soucier de la libération des ressources.

Comparaison

L'allocation statique est la méthode la plus sûre dans le sens où :

  • la quantité consommée est constante et complètement connue avant l'exécution ;
  • elle est généralement accessible exclusivement en lecture seule (non modifiable).

C'est toutefois une méthode très inflexible et insuffisante pour les programmes dont les besoins peuvent varier de façon imprévisible : pour un programme ayant des besoins potentiels de mémoire importants, l'allocation statique conduirait à un gaspillage. Elle est finalement essentiellement utilisée pour stocker des constantes ou des valeurs calculées et disponibles au moment de la compilation.

L'allocation sur la pile représente un bon compromis :

  • la quantité consommée est proportionnelle aux paramètres d'entrées du programme, qui déterminent la profondeur de la pile et donc la quantité allouée ; elle peut être connue avant l'exécution par une analyse de la complexité algorithmique ;
  • il n'y a pas de fuite de mémoire, du fait de la libération implicite (respectant la discipline de pile).

L'allocation sur la pile doit être choisie en priorité lorsque les besoins mémoires sont connus à l'avance et sont proportionnels à certains paramètres d'entrée du programme. L'allocation et la libération consécutives, selon une discipline de pile, de grosses quantités de mémoire peuvent toutefois poser des problèmes de performance et de lisibilité du source (explosion du nombre de paramètres passés aux fonctions) ; ces problèmes sont à mettre dans la balance contre l'assurance d'une libération correcte des ressources mémoire.

L'allocation sur le tas, puisqu'elle permet le contrôle complètement arbitraire de l'allocation et de la libération, offre le plus de possibilités. Les ressources allouées manuellement ont cependant une durée de vie indéfinie, c’est-à-dire que le programmeur a la responsabilité de la libération (et doit éviter de tomber dans les pièges de la double libération, etc.). La mémoire allouée sur le tas peut également être référencée par des variables globales (de préférence confinées dans un espace de noms), ce qui peut aider à délester un groupe de fonctions de paramètres communs.

En pratique, on préférera le mode d'allocation le plus simple. La plupart du temps, l'allocation sur la pile est suffisante. On n'utilise l'allocation sur le tas qu'en dernier recours, pour manipuler des structures de données complexes et/ou dont l'évolution ne suit pas la discipline de pile.

Dans les langages à ramasse-miettes, le choix du mode d'allocation est réalisé par le compilateur, en fonction d'une analyse des patterns d'utilisation des variables dans le code source.


Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Allocation de mémoire de Wikipédia en français (auteurs)

Regardez d'autres dictionnaires:

  • Allocation De Mémoire — Les algorithmes sous jacents à tout programme informatique consomment essentiellement deux ressources : du temps et de l espace. En machine, l espace peut être la mémoire vive volatile ou la mémoire de masse persistante. Cet article discute… …   Wikipédia en Français

  • Allocation de memoire — Allocation de mémoire Les algorithmes sous jacents à tout programme informatique consomment essentiellement deux ressources : du temps et de l espace. En machine, l espace peut être la mémoire vive volatile ou la mémoire de masse persistante …   Wikipédia en Français

  • allocation de mémoire — atminties paskirstymas statusas T sritis automatika atitikmenys: angl. memory allocation; memory layout vok. Speicherzuordnung, f; Speicherzuteilung, f; Speicherzuweisung, f rus. распределение памяти, n pranc. allocation de mémoire, f …   Automatikos terminų žodynas

  • Allocation De Registres — Dans un compilateur, l allocation de registres est une étape importante de la production de code. Elle vise à choisir dans quel registre du processeur sera rangée chaque variable lors de l exécution du programme que l on compile. Les registres… …   Wikipédia en Français

  • Allocation De Ressources — Les méthodes de synchronisation Barrière de synchronisation  Futex  Moniteur Mutex  Sémaphore  Spinlock Dans le contex …   Wikipédia en Français

  • Allocation de registres — Dans un compilateur, l allocation de registres est une étape importante de la génération de code. Elle vise à choisir dans quel registre du processeur sera rangée chaque variable lors de l exécution du programme que l on compile. Les registres… …   Wikipédia en Français

  • Allocation de ressources — v · d · m Synchronisation en …   Wikipédia en Français

  • Récupérateur de mémoire — Ramasse miettes (informatique) Pour les articles homonymes, voir Ramasse miettes (homonymie). Un ramasse miettes, ou récupérateur de mémoire, ou glaneur de cellules (en anglais garbage collector, abrégé en GC) est un sous système informatique de… …   Wikipédia en Français

  • Gestion de mémoire par régions — En informatique, la gestion de mémoire par région est un type de gestion de mémoire avec lequel chaque objet alloué est assigné à une région. Une région, alias une zone, une arène, ou un contexte mémoire, est une collection d’objets alloués qui… …   Wikipédia en Français

  • Récupérateur de mémoire inutilisée — Ramasse miettes (informatique) Pour les articles homonymes, voir Ramasse miettes (homonymie). Un ramasse miettes, ou récupérateur de mémoire, ou glaneur de cellules (en anglais garbage collector, abrégé en GC) est un sous système informatique de… …   Wikipédia en Français

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”