Chunk (informatica)

Un chunk è un blocco di memoria residente nello heap.

Composizione

Ogni chunk è composto da un header (o intestazione) di dimensione costante 8 byte seguito da uno spazio di memoria variabile, la cui dimensione minima è la stessa utilizzata per l'intestazione e cresce seguendo l'ordine dei suoi multipli:

Header Dati Dimensione Totale
8 byte 8 byte 16 byte (dimensione minima assoluta)
8 byte 16 byte 24 byte
8 byte 24 byte 32 byte

Chunk allocato

Lo schema per la rappresentazione di un singolo chunk già allocato in memoria è il seguente:

     Header: [prev_size + size]
     Dati:   [user_data]
  • prev_size (4 byte): contiene informazioni relative al chunk libero che precede
  • size (4 byte): contiene la dimensione espressa in byte dell'intero chunk (header + dati)
  • user data (minimo 8 byte): area di memoria a disposizione dell'utente

Chunk libero (non-allocato)

Lo schema per la rappresentazione di un singolo chunk libero in memoria è il seguente: Le funzioni di prev_size e size non cambiano, fatta eccezione per user_data che invece potrà assumere un valore di lunghezza pari a 0 byte.

     Header: [prev_size + size + FD pointer + BK pointer]
     Dati:   [user_data]
  • FD pointer: puntatore al chunk libero seguente
  • BK pointer: puntatore al chunk libero precedente

Operazioni coi chunk

Nel linguaggio di programmazione C la gestione dei chunk avviene per mezzo di 2 funzioni fondamentali:

  • malloc() allocazione chunk
  • free() deallocazione chunk

Allocazione (malloc)

Per allocazione si intende l'atto di riservare dello spazio in memoria, allo scopo di conservare in esso i dati essenziali per il corretto funzionamento del programma.

Un esempio di porzione di codice per l'allocazione di un chunk con user_data uguale a 128 byte può essere il seguente:

int main(void) {
   char *chunk = (char *)malloc(128);
   return 0;
}

Dobbiamo ricordare che per le regole della composizione di un chunk, il comando malloc(0) risulterà in un chunk di 16 byte (8 byte di intestazione + 8 byte minimi per user_data).

Deallocazione (free)

Per deallocazione si intende l'atto di liberare uno spazio in memoria precedentemente allocato, e renderlo dunque riutilizzabile per successive allocazioni.

N.B: La mancata deallocazione di un chunk dopo il suo utilizzo è la prima causa dei memory leak

int main(int argc, char **argv) {
   char *chunk = (char *)malloc(4*sizeof(char)); // allocazione
   strncpy(chunk, argv[1], 4);                   // utilizzo
   free(chunk);                                  // deallocazione
   return 0;
}

Voci correlate

  Portale Informatica: accedi alle voci di Wikipedia che trattano di Informatica