2010-10-30 11 views

Antwort

37

Eine ohne Lücken in den Adressen besetzt. Sie können sich das wahrscheinlich als "Block" vorstellen und denken an etwas mit einer Lücke in der Mitte als "zwei Blöcke".

Der Begriff kommt in der Definition eines Arrays als "zusammenhängend". Das bedeutet, dass die Elemente Ende-zu-Ende angeordnet sind, ohne Diskontinuitäten und ohne Abstände zwischen ihnen (es kann in jedem Element eine Auffüllung geben, aber nicht zwischen Elementen). So ein Array von 5 4-Byte-Elemente wie folgt aussieht (1 Unterstrich pro Byte, die | Symbole repräsentieren nicht memory):

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

Es sieht nicht so aus:

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

Und weder sieht es wie folgt aus:

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

in allen Fällen „sieht aus wie“ bedeutet „so weit wie die Adressen sichtbar in C betroffen sind“. Etwas könnte im virtuellen Adressraum zusammenhängen, aber nicht zusammenhängend im physikalischen RAM. In diesem Fall könnte etwas in dem physikalischen RAM-Adressraum zusammenhängen, aber nicht tatsächlich benachbart in dem physikalischen RAM. Die Hälfte davon könnte hier auf einem RAM-Chip sein, und die andere Hälfte auf einem anderen RAM-Chip dort drüben. Aber das C-Speichermodell kann nichts davon "sehen".

+1

+1 Schöne Figur. –

+25

@Sinan: Danke, ich trainiere. –

+2

+1 für diese Antwort, klassisch. –

5

Ein Speicherblock, der nicht von anderem Speicher unterbrochen wird. Genauer gesagt benötigt es einen ununterbrochenen Block virtuellen Adressraumes. Der reale RAM, der diesen Adressraum unterstützt, muss nicht zusammenhängend sein.

Dies ist wichtig, wenn Sie einen großen Speicherblock zuweisen. Das Betriebssystem muss es Ihnen als zusammenhängender Block geben, aber wenn der Speicher so fragmentiert ist, dass nur kleinere Teile frei sind, kann diese Speicherzuweisung nicht erfüllt werden, selbst wenn der gesamte freie Speicher größer ist als der angeforderte Speicherplatz.

Dies ist kein so großes Problem bei 64-Bit-Anwendungen, da der Adressraum dort groß ist. Aber in 32-Bit-Prozessen kann es vorkommen, dass der Heap so fragmentiert wird (zwischen freigegebenen Blöcken gibt es noch unfreie Blöcke), dass größere Zuordnungen fehlschlagen.

2

Beantworten Sie im Kontext der Speicherzuweisung, wenn Sie den Speicherzuordner aufrufen und 24 Byte Speicher anfordern, muss es in der Lage sein, einen einzelnen Block von mindestens 24 Byte nicht zugeordneten Speicher zu finden.

Wenn es hat 16 Bytes Speicher an einer Adresse an einer Adresse beginnend x und weitere 8 Bytes beginnend y so dass y > x + 16 oder y < x - 8 (das würde einen Spalt erzeugen), dann kann der Zuordner Ihre Anfrage, obwohl 24 Bytes nicht befriedigen Es sind insgesamt 24 Bytes frei.

Siehe auch Fragmentation.

2

Ein Speicherblock ist genau dann zusammenhängend, wenn er von einer Start- und einer Endadresse aus einem einzelnen linearen Adressraum definiert ist und keine Lücken aufweist.

45

Dies ist ein zusammenhängender Speicherblock von fünf Bytes, von Position 1 bis Position Spanning 5:

alt text

Es Bytes darstellt (in hellblau), die miteinander ohne Spalt im Speicher ist Bytes (white) zwischen ihnen.

Dies ist ein nicht zusammenhängender Satz von fünf Bytes von Interesse:

alt text

sie in drei Gruppen von Bytes fragmentiert ist (gelb), 1 mit Spalte beginnend an der Stelle, die zwischen den Gruppen-Bytes. Die Lücken-Bytes befinden sich an den Positionen 4 und 6.

+17

+1 für farbenfrohe Illustrationen :) – Michael