Qu’est-ce qu’un bloc de mémoire contigu?

Comme dans le titre, qu’est-ce qu’un bloc de mémoire contigu?

Un sans lacunes dans les adresses qu’il occupe. Vous pouvez probablement simplement considérer cela comme un “bloc” et imaginer quelque chose avec un écart au milieu comme “deux blocs”.

Le terme apparaît dans la définition d’un tableau comme étant “contigu”. Cela signifie que les éléments sont disposés bout à bout, sans discontinuités ni marges intérieures (il peut y avoir des marges intérieures à l’intérieur de chaque élément, mais pas entre les éléments). Ainsi, un tableau de 5 éléments de 4 octets ressemble à ceci (1 caractère de soulignement par octet, les symboles | ne représentent pas la mémoire):

____ ____ ____ ____ ____ |____|____|____|____|____| 

Ça ne ressemble pas à ça:

  ____ _ ____ _ ____ _ ____ _ ____ |____|_|____|_|____|_|____|_|____| 

Et cela ne ressemble pas non plus à ceci:

  ____ ____ ____ ____ ____ |____|____|____| ... somewhere completely different ... |____|____| 

Dans tous les cas, “ressemble à” signifie “en ce qui concerne les adresses visibles dans C”. Quelque chose peut être contigu dans l’espace d’adressage virtuel, mais pas dans la RAM physique. D’ailleurs, quelque chose pourrait être contigu dans l’espace d’adressage de la RAM physique, mais pas réellement adjacent dans la RAM physique. La moitié pourrait être sur une puce de RAM ici, et l’autre moitié sur une autre puce de RAM là-bas. Mais le modèle de mémoire C ne peut “voir” rien de tout cela.

Ceci est un bloc de mémoire contigu de cinq octets, allant de l’emplacement 1 à l’emplacement 5:

texte alternatif

Il représente des octets (colorés en bleu clair) qui sont ensemble dans la mémoire sans octets d’espace (blancs) entre eux.

Il s’agit d’un ensemble non contigu de cinq octets d’intérêt:

texte alternatif

Il est fragmenté en trois groupes d’octets (de couleur jaune) avec des octets d’espacement aux emplacements 4 et 6. A partir de l’emplacement 1, il y a un bloc contigu de trois octets, allant des emplacements 1 à 3. Il y a deux autres blocs d’un octet chacun. aux emplacements 5 et 7, respectivement.

Le bloc inutilisé à l’emplacement 0 ainsi que tous les blocs ultérieurs au-delà de l’emplacement 7 peuvent généralement être ignorés car ils s’interposent entre les octets d’intérêt s’étendant des emplacements 1 à 7.

Un bloc de mémoire qui n’est pas interrompu par une autre mémoire. Ou, pour être plus précis, il faut un bloc ininterrompu d’espace d’adresse virtuel. La RAM réelle sauvegardant cet espace d’adressage n’a pas besoin d’être contiguë.

Ceci est important si vous allouez un bloc de mémoire volumineux. Le système d’exploitation doit vous le donner sous forme de bloc contigu, mais si la mémoire est tellement fragmentée que seules des pièces plus petites sont libres, cette allocation de mémoire ne peut pas être satisfaite même si la quantité de mémoire libre totale est supérieure à l’espace demandé.

Ce n’est pas un gros problème sur les applications 64 bits, car l’espace d’adressage y est important. Mais dans les processus 32 bits, il peut arriver que le tas soit tellement fragmenté (entre blocs libérés, il rest encore des blocs non loués) que des allocations plus importantes échouent.

Dans le contexte d’allocation de mémoire, lorsque vous appelez l’allocateur de mémoire et demandez 24 octets de mémoire, il doit pouvoir localiser un seul bloc d’au moins 24 octets de mémoire non allouée.

Si elle a 16 octets de mémoire commençant à une adresse x et 8 octets commençant à une adresse y telle que y > x + 16 ou y < x - 8 (cela créerait un espace), l’allocateur ne peut pas satisfaire votre demande de 24 octets même s’il ya 24 octets gratuits.

Voir aussi la fragmentation .

Un bloc de mémoire est contigu au moment même où il est défini par une adresse de début et de fin à partir d’un seul espace d’adressage linéaire et ne comporte pas de trous.