2010-10-30 22 views

Odpowiedz

37

Brak jakichkolwiek luk w adresach, które zajmuje. Możesz prawdopodobnie pomyśleć o tym jako o "bloku" i pomyśleć o czymś z luką w środku jako "dwa bloki".

Termin pojawia się w definicji tablicy jako "przylegający". Oznacza to, że elementy są układane od końca do końca, bez żadnych nieciągłości i braku wyściółki między nimi (w każdym elemencie może znajdować się wypełnienie, ale nie między elementami). Więc tablica 5 elementów 4-bajtowych wygląda następująco (1 podkreślenia charakteru za bajtowy, | symbole nie reprezentują pamięć):

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

To nie wygląda tak:

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

I nie ma to wyglądać tak:

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

we wszystkich przypadkach, „wygląda” oznacza „w miarę adresy widoczne w C dotyczy”. W wirtualnej przestrzeni adresowej coś może być ciągłe, ale nie jest przylegające do fizycznej pamięci RAM. W tym przypadku coś może być przylegające do fizycznej przestrzeni adresowej RAM, ale w rzeczywistości nie sąsiadujące z fizyczną pamięcią RAM. Połowa może być na jednym układzie RAM tutaj, a druga połowa na innym układzie RAM. Ale model pamięci C nie może tego "zobaczyć".

+1

+1 Ładna figura. –

+25

@Sinan: dzięki, ćwiczę. –

+2

+1 za tę odpowiedź, klasyczny. –

5

Blok pamięci, który nie jest przerywany przez inną pamięć. Lub, mówiąc dokładniej, wymaga nieprzerwanego bloku wirtualnej przestrzeni adresowej. Prawdziwe kopiowanie pamięci RAM w przestrzeni adresowej nie musi być ciągłe.

Jest to ważne, jeśli przydzielono duży blok pamięci. System operacyjny musi przekazać go jako ciągły blok, ale jeśli pamięć jest tak podzielona, ​​że ​​tylko mniejsze elementy są wolne, to przydział pamięci nie może zostać osiągnięty, nawet jeśli całkowita wolna pamięć jest większa niż żądana przestrzeń.

To nie jest taki duży problem w 64-bitowych aplikacjach, ponieważ przestrzeń adresowa jest tam duża. Ale w procesach 32-bitowych może się zdarzyć, że sterty są tak pofragmentowane (pomiędzy zwolnionymi blokami są nadal niezablokowane bloki), że większe alokacje zawodzą.

2

Odpowiadając w kontekście alokowania pamięci, po wywołaniu alokatora pamięci i zażądaniu 24 bajtów pamięci, musi być możliwe zlokalizowanie pojedynczego bloku co najmniej 24 bajtów nieprzydzielonej pamięci.

Jeśli ma 16 bajtów pamięci zaczynając od jednego adresu x i kolejne 8 bajtów zaczynając od adresu y takie, że y > x + 16 lub y < x - 8 (które spowodowałoby lukę), wówczas podzielnik nie może spełnić żądania przez 24 bajtów, chociaż jest w sumie 24 bajty za darmo.

Zobacz także Fragmentation.

2

Blok pamięci jest ciągły dokładnie wtedy, gdy jest zdefiniowany przez początkowy i końcowy adres z pojedynczej liniowej przestrzeni adresowej i nie ma żadnych otworów.

45

to sąsiedni blok pamięci z pięciu bajtów, rozciąga się od położenia 1 do położenia 5:

alt text

to bajty (jasnoniebieskim), które są ze sobą w pamięci bez szczeliny bajty (biały) między nimi.

To nieciągłe zestaw pięciu bajtów zainteresowania:

alt text

jest podzielony na trzy grupy bajtów (żółty), począwszy od lokalizacji 1 ze szczeliną bajty się pomiędzy grupami. Bajki z przerwą znajdują się w miejscach 4 i 6.

+17

+1 za kolorowe ilustracje :) – Michael