2010-10-30 12 views

risposta

37

Uno senza spazi vuoti negli indirizzi che occupa. Probabilmente puoi semplicemente pensare a questo come a un "blocco", e pensare a qualcosa con un gap nel mezzo come "due blocchi".

Il termine deriva dalla definizione di un array come "contiguo". Ciò significa che gli elementi sono disposti end-to-end, senza discontinuità e senza padding tra loro (potrebbe esserci padding all'interno di ogni elemento, ma non tra gli elementi). Quindi, una serie di 5 elementi a 4 byte si presenta così (1 carattere di sottolineatura per byte, il | simboli non rappresentano la memoria):

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

Non sembra in questo modo:

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

E non vi sembra questo:

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

in tutti i casi, "sembra" significa "per quanto riguarda gli indirizzi visibili in C sono interessati". Qualcosa potrebbe essere contiguo nello spazio degli indirizzi virtuale, ma non contiguo nella RAM fisica. Del resto, qualcosa potrebbe essere contiguo nello spazio fisico della RAM, ma non in realtà adiacente nella RAM fisica. La metà potrebbe essere su un chip RAM qui e l'altra metà su un altro chip RAM. Ma il modello di memoria C non può "vedere" nulla di tutto ciò.

+1

+1 Bella figura. –

+25

@Sinan: grazie, lavoro. –

+2

+1 per quella risposta, classico. –

5

Un blocco di memoria che non viene interrotto da altra memoria. O per essere più precisi, richiede un blocco ininterrotto di spazio degli indirizzi virtuali. La RAM reale che supporta lo spazio di indirizzamento non deve essere contigua.

Questo è importante se si assegna un blocco di memoria grande. Il sistema operativo deve dartelo come blocco contiguo, ma se la memoria è così frammentata che solo pezzi più piccoli sono liberi, questa allocazione di memoria non può essere soddisfatta anche se la memoria libera totale è maggiore dello spazio richiesto.

Questo non è un grosso problema per le app a 64 bit poiché lo spazio degli indirizzi è grande lì. Ma nei processi a 32 bit può succedere che l'heap diventi così frammentato (tra blocchi liberati ci sono ancora blocchi non definiti) che le allocazioni più grandi falliscono.

2

Risposta nel contesto dell'allocazione della memoria, quando si richiama l'allocatore di memoria e si richiedono 24 byte di memoria, deve essere in grado di individuare un blocco singolo di almeno 24 byte di memoria non allocata.

Se ha 16 byte di memoria a partire da un indirizzo x e altri 8 byte da un indirizzo y tale che y > x + 16 o y < x - 8 (che creerebbe un gap), allora l'allocatore non può soddisfare la richiesta di 24 byte sebbene c'è un totale di 24 byte gratuiti.

Vedere anche Fragmentation.

2

Un blocco di memoria è contiguo esattamente quando è definito da un indirizzo iniziale e finale da un singolo spazio di indirizzamento lineare e non presenta fori.

45

Questo è un blocco di memoria contiguo di cinque byte, si estende dalla posizione 1 alla posizione 5:

alt text

Rappresenta byte (in azzurro) che sono insieme in memoria senza distanza byte (bianco) fra loro.

Questo è un insieme non contiguo di cinque byte di interesse:

alt text

Si è frammentato in tre gruppi di byte (giallo), a partire dalla posizione 1 con gap byte presente tra i gruppi. I byte gap sono nelle posizioni 4 e 6.

+17

+1 per illustrazioni colorate :) – Michael

Problemi correlati