Was ist ein zusammenhängender Speicherblock?

Lesezeit: 3 Minuten

Benutzeravatar von 565471741
565471741

Was ist genau wie im Titel ein zusammenhängender Speicherblock?

Benutzeravatar von Michael Goldshteyn
Michael Goldshteyn

Dies ist ein zusammenhängender Speicherblock von fünf Bytes, der sich von Speicherstelle 1 bis Speicherstelle 5 erstreckt:

Alt-Text

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:

Alt-Text

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

Benutzeravatar von Steve Jessop
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.

Benutzeravatar von Sinan Ünür
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:

  1. Kontinuierliche Speicherzuweisung
  2. 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.

1399910cookie-checkWas ist ein zusammenhängender Speicherblock?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy