¿Qué es un bloque de memoria contiguo?

Al igual que en el título, ¿qué es un bloque de memoria contiguo?

Uno sin ningún espacio en las direcciones que ocupa. Probablemente puedas pensar en esto como un “bloque”, y pensar en algo con un espacio en el medio como “dos bloques”.

El término aparece en la definición de una matriz como “contigua”. Eso significa que los elementos se disponen de extremo a extremo, sin discontinuidades y sin relleno entre ellos (puede haber un relleno dentro de cada elemento, pero no entre los elementos). Entonces, una matriz de 5 elementos de 4 bytes se ve así (1 carácter de subrayado por byte, los símbolos no representan la memoria):

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

No se ve así:

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

Y tampoco se ve así:

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

En todos los casos, “parece” significa “en lo que respecta a las direcciones visibles en C”. Algo podría ser contiguo en el espacio de direcciones virtuales, pero no contiguo en la RAM física. Para el caso, algo podría estar contiguo en el espacio físico de la dirección de la RAM, pero no estar adyacente en la RAM física. La mitad podría estar en un chip RAM aquí, y la otra mitad en otro chip RAM allí. Pero el modelo de memoria C no puede “ver” nada de eso.

Es un bloque de memoria contiguo de cinco bytes, que abarca desde la ubicación 1 hasta la ubicación 5:

texto alternativo

Representa bytes (de color azul claro) que están juntos en la memoria sin espacios vacíos (blancos) entre ellos.

Este es un conjunto no contiguo de cinco bytes de interés:

texto alternativo

Está fragmentado en tres grupos de bytes (de color amarillo) con espacios vacíos en las ubicaciones 4 y 6. Comenzando en la ubicación 1 hay un bloque contiguo de tres bytes, que abarca desde las ubicaciones 1 a 3. Hay dos bloques más de un byte cada uno en las ubicaciones 5 y 7, respectivamente.

El bloque no utilizado en la ubicación 0, así como cualquier bloque posterior más allá de la ubicación 7, generalmente se puede ignorar ya que se interponen entre los bytes de interés que se extienden desde las ubicaciones 1 a 7.

Un bloque de memoria que no está interrumpido por otra memoria. O para ser más precisos, requiere un bloque ininterrumpido de espacio de direcciones virtual. La RAM real que respalda ese espacio de direcciones no necesita ser contigua.

Esto es importante si asigna un bloque de memoria grande. El sistema operativo tiene que asignárselo como un bloque contiguo, pero si la memoria está tan fragmentada que solo las piezas más pequeñas son libres, esta asignación de memoria no se puede satisfacer incluso si la memoria libre total es mayor que el espacio solicitado.

Este no es un problema tan grande en aplicaciones de 64 bits ya que el espacio de direcciones es grande allí. Pero en los procesos de 32 bits puede suceder que el montón se fragmente tanto (entre los bloques liberados todavía hay bloques no abiertos) que las asignaciones más grandes fallan.

Al contestar en el contexto de asignación de memoria, cuando invoca el asignador de memoria y solicita 24 bytes de memoria, debe ser capaz de localizar un solo bloque de al menos 24 bytes de memoria no asignada.

Si tiene 16 bytes de memoria comenzando en una dirección x otros 8 bytes comenzando en una dirección y tal que y > x + 16 o y < x - 8 (eso crearía un espacio), entonces el asignador no puede satisfacer su solicitud de 24 bytes a pesar de que hay un total de 24 bytes gratis.

Ver también Fragmentación .

Un bloque de memoria es contiguo exactamente cuando está definido por un inicio y una dirección final desde un único espacio de direcciones lineales y no tiene agujeros.