Was ist genau wie im Titel ein zusammenhängender Speicherblock?
Was ist ein zusammenhängender Speicherblock?
565471741
Michael Goldshteyn
Dies ist ein zusammenhängender Speicherblock von fünf Bytes, der sich von Speicherstelle 1 bis Speicherstelle 5 erstreckt:
Es stellt Bytes dar (hellblau gefärbt), die sich zusammen im Speicher befinden, ohne Lückenbytes (weiß) zwischen ihnen.
Dies ist ein nicht zusammenhängender Satz von fünf interessierenden Bytes:
Es ist in drei Gruppen von Bytes (gelb gefärbt) mit Lückenbytes an den Positionen 4 und 6 fragmentiert. Beginnend bei Position 1 gibt es einen zusammenhängenden Block von drei Bytes, der sich von den Positionen 1 bis 3 erstreckt. Es gibt zwei weitere Blöcke mit jeweils einem Byte an den Positionen 5 bzw. 7.
Der ungenutzte Block an Position 0 sowie alle nachfolgenden Blöcke jenseits von Position 7 können normalerweise ignoriert werden, da sie zwischen den interessierenden Bytes liegen, die sich von den Positionen 1 bis 7 erstrecken.
-
Schöne Visualisierung. Womit haben Sie diese Bilder erstellt?
– Samuel
5. Juni 2018 um 16:17 Uhr
Steve Jessop
Eines ohne Lücken in den Adressen, die es belegt. Sie können sich das wahrscheinlich einfach als “Block” vorstellen und etwas mit einer Lücke in der Mitte als “zwei Blöcke”.
Der Begriff kommt in der Definition eines Arrays als “zusammenhängend” vor. Das bedeutet, dass die Elemente durchgehend angeordnet sind, ohne Unterbrechungen und ohne Polsterung zwischen ihnen (es kann Polsterung in jedem Element geben, aber nicht zwischen den Elementen). Ein Array aus 5 4-Byte-Elementen sieht also so aus (1 Unterstrich pro Byte, die |-Symbole stellen keinen Speicher dar):
____ ____ ____ ____ ____
|____|____|____|____|____|
So sieht es nicht aus:
____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|
Und so sieht es auch nicht aus:
____ ____ ____ ____ ____
|____|____|____| ... somewhere completely different ... |____|____|
In allen Fällen bedeutet “sieht aus wie” “soweit die in C sichtbaren Adressen betroffen sind”. Etwas könnte im virtuellen Adressraum zusammenhängend sein, aber nicht zusammenhängend im physischen RAM. In diesem Zusammenhang könnte etwas im physischen RAM-Adressraum zusammenhängend sein, aber im physischen RAM nicht tatsächlich benachbart sein. Die Hälfte davon könnte auf einem RAM-Chip hier drüben und die andere Hälfte auf einem anderen RAM-Chip dort drüben sein. Aber das C-Speichermodell kann nichts davon “sehen”.
-
Sollte es nicht 1 Unterstrich pro 4-Byte-Element sein?
– Rindenseite
16. Oktober 2013 um 9:16 Uhr
Ein Speicherblock, der nicht von anderem Speicher unterbrochen wird. Genauer gesagt erfordert es einen ununterbrochenen Block virtuellen Adressraums. Der echte 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ängenden 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 als der angeforderte Speicherplatz ist.
Dies ist bei 64-Bit-Apps kein so großes Problem, da der Adressraum dort groß ist. In 32-Bit-Prozessen kann es jedoch vorkommen, dass der Heap so fragmentiert wird (zwischen freigegebenen Blöcken gibt es noch nicht freigegebene Blöcke), dass größere Zuordnungen fehlschlagen.
Ein Speicherblock ist genau dann zusammenhängend, wenn er durch eine Start- und eine Endadresse aus einem einzigen linearen Adressraum definiert ist und keine Löcher hat.
Sinan Ünür
Antworten im Zusammenhang mit der Zuweisung von Speicher: Wenn Sie den Speicherzuordner aufrufen und 24 Byte Speicher anfordern, muss er in der Lage sein, einen einzelnen Block mit mindestens 24 Byte nicht zugewiesenem Speicher zu finden.
Wenn es 16 Byte Speicher hat, beginnend bei einer Adresse x
und weitere 8 Bytes beginnend bei einer Adresse y
so dass y > x + 16
oder y < x - 8
(das würde eine Lücke schaffen), dann kann der Zuordner Ihre Anfrage nach 24 Bytes nicht erfüllen, obwohl insgesamt 24 Bytes frei sind.
Siehe auch Zersplitterung.
Der Speicher besteht aus einer großen Anzahl von Byteblöcken. Jeder Block hat seine eigene Adresse. Wenn ein Prozess Speicher anfordert, wird Speicher auf zwei Arten zugewiesen:
- Kontinuierliche Speicherzuweisung
- Nicht zusammenhängende Speicherzuweisung
Bei der zusammenhängenden Speicherzuweisung werden aufeinanderfolgende (nacheinander) Blöcke zugewiesen, die als zusammenhängende Speicherblöcke bezeichnet werden.
Bei der nicht-zusammenhängenden Speicherzuordnung werden getrennte Blöcke zugewiesen, die an unterschiedlichen Stellen vorhanden sind.