“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 75 — #85
i
i
i
i
i
i
i
i
2.5 La gestion de mémoire
75
{i k−1 = k − 1} ∪ s
Cette mémoire plus petite a une taille constante. Si nous pouvions garantir que les
variables dont nous n’avons pas besoin sont toujours enlevées, alors le programme
pourrait s’exécuter indéfiniment avec une taille mémoire constante.
Pour cet exemple nous pouvons résoudre le problème en empilant les variables
au lieu de les garder en mémoire. C’est possible parce que les variables sont liées
aux petits entiers qui tiennent dans un mot du processeur (par exemple, 32 bits). La
pile peut donc stocker les entiers directement au lieu de stocker des références aux
variables en mémoire.
9 Cet exemple est atypique ; la plupart des programmes réalistes
ont de grandes quantités de données à longue vie ou partagées qui ne peuvent pas être
stockées facilement sur la pile. Nous devons donc toujours résoudre le problème général d’enlever les variables dont nous n’avons pas besoin. Dans les sections suivantes
nous verrons comment le faire.
2.5.2 Le cycle de vie mémoire
Une conséquence de la sémantique de la machine abstraite est qu’un programme
qui s’exécute n’a besoin que des informations de la pile sémantique et de la partie
de la mémoire qui est accessible à partir de la pile sémantique. Une valeur partielle
est accessible si elle est référencée par une instruction sur la pile sémantique ou par
une autre valeur partielle accessible. La pile sémantique et la partie accessible de
la mémoire s’appellent la mémoire active. Toute la mémoire qui n’est pas active
peut être récupérée sans risque, c’est-à-dire qu’elle peut être réutilisée par la machine
abstraite. Nous avons vu que la taille de la mémoire active de l’exemple Loop10 est
bornée par une constante. L’exemple peut donc s’exécuter indéfiniment sans épuiser
la mémoire du système.
Nous pouvons introduire maintenant le concept de cycle de vie mémoire. Les
programmes s’exécutent dans la mémoire centrale, qui contient une séquence de
mots. En règle générale, les ordinateurs personnels ont des mots de 32 bits et les
ordinateurs personnels haut de gamme en ont de 64 bits ou plus. La séquence de
mots est partitionnée en blocs, où un bloc est une séquence d’un ou plusieurs mots
qui est utilisé pour stocker une partie d’un état d’exécution. Le bloc est l’unité de
base de l’allocation mémoire. La figure 2.18 montre le cycle de vie d’un bloc de
mémoire. Chaque bloc prend successivement les trois états, actif, inactif et libre, en
cycle continu. La fonction de la gestion de mémoire est d’assurer que les blocs passent
correctement de chaque état au suivant. Un programme en exécution qui a besoin
9. Une optimisation supplémentaire qui est souvent faite est de stocker une partie de la pile dans les
registres du processeur. Ceci est important car les registres sont beaucoup plus rapides pour la lecture et
l’écriture que la mémoire centrale.
© Dunod – La photocopie non autorisée est un délit
i
i
i
i
i
i
i
i
2.5 La gestion de mémoire
75
{i k−1 = k − 1} ∪ s
Cette mémoire plus petite a une taille constante. Si nous pouvions garantir que les
variables dont nous n’avons pas besoin sont toujours enlevées, alors le programme
pourrait s’exécuter indéfiniment avec une taille mémoire constante.
Pour cet exemple nous pouvons résoudre le problème en empilant les variables
au lieu de les garder en mémoire. C’est possible parce que les variables sont liées
aux petits entiers qui tiennent dans un mot du processeur (par exemple, 32 bits). La
pile peut donc stocker les entiers directement au lieu de stocker des références aux
variables en mémoire.
9 Cet exemple est atypique ; la plupart des programmes réalistes
ont de grandes quantités de données à longue vie ou partagées qui ne peuvent pas être
stockées facilement sur la pile. Nous devons donc toujours résoudre le problème général d’enlever les variables dont nous n’avons pas besoin. Dans les sections suivantes
nous verrons comment le faire.
2.5.2 Le cycle de vie mémoire
Une conséquence de la sémantique de la machine abstraite est qu’un programme
qui s’exécute n’a besoin que des informations de la pile sémantique et de la partie
de la mémoire qui est accessible à partir de la pile sémantique. Une valeur partielle
est accessible si elle est référencée par une instruction sur la pile sémantique ou par
une autre valeur partielle accessible. La pile sémantique et la partie accessible de
la mémoire s’appellent la mémoire active. Toute la mémoire qui n’est pas active
peut être récupérée sans risque, c’est-à-dire qu’elle peut être réutilisée par la machine
abstraite. Nous avons vu que la taille de la mémoire active de l’exemple Loop10 est
bornée par une constante. L’exemple peut donc s’exécuter indéfiniment sans épuiser
la mémoire du système.
Nous pouvons introduire maintenant le concept de cycle de vie mémoire. Les
programmes s’exécutent dans la mémoire centrale, qui contient une séquence de
mots. En règle générale, les ordinateurs personnels ont des mots de 32 bits et les
ordinateurs personnels haut de gamme en ont de 64 bits ou plus. La séquence de
mots est partitionnée en blocs, où un bloc est une séquence d’un ou plusieurs mots
qui est utilisé pour stocker une partie d’un état d’exécution. Le bloc est l’unité de
base de l’allocation mémoire. La figure 2.18 montre le cycle de vie d’un bloc de
mémoire. Chaque bloc prend successivement les trois états, actif, inactif et libre, en
cycle continu. La fonction de la gestion de mémoire est d’assurer que les blocs passent
correctement de chaque état au suivant. Un programme en exécution qui a besoin
9. Une optimisation supplémentaire qui est souvent faite est de stocker une partie de la pile dans les
registres du processeur. Ceci est important car les registres sont beaucoup plus rapides pour la lecture et
l’écriture que la mémoire centrale.
© Dunod – La photocopie non autorisée est un délit
