Genau wie im Titel, was ist ein zusammenhängender Speicherblock?Was ist ein zusammenhängender Speicherblock?
Antwort
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".
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.
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.
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.
Dies ist ein zusammenhängender Speicherblock von fünf Bytes, von Position 1 bis Position Spanning 5:
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:
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.
+1 für farbenfrohe Illustrationen :) – Michael
- 1. Abrufen zusammenhängender Zeiträume
- 2. Verilog: Der Speicherblock Instanziierung
- 3. Generische Verschraubungen nicht zusammenhängender Sammlungen
- 4. Postgres windowing (Festlegung zusammenhängender Tage)
- 5. Virtual File System Speicherblock Erstellung
- 6. Warum ist mein mit JSONObject zusammenhängender Komponententest fehlgeschlagen?
- 7. Was passiert, wenn eine Anforderung für einen Speicherblock vorliegt, der keine Potenz von 2 ist?
- 8. Externer logischer Speicherblock über USB-Schnittstelle?
- 9. Was ist ein PHP-Framework und was ist ein guter?
- 10. Google AMP: Was ist ein Layout? Was ist ein Behälter?
- 11. In C++, die die Möglichkeit ist, sequentiell auf ein 2D-Array zuzugreifen (Speicherblock weise)
- 12. LZ4 Dekomprimieren binärer Speicherblock unbekannter Größe
- 13. Auswahl zusammenhängender Block von Datensätzen in MySQL
- 14. Was ist ein Protokoll?
- 15. Was ist ein Objekt?
- 16. Was ist ein "Pinsel"?
- 17. Was ist ein UIViewController
- 18. Was ist ein Kontextwechsel?
- 19. Was ist ein Inferenztyp?
- 20. Was ist ein Pastenskript?
- 21. Was ist ein Gruppenleiter
- 22. Was ist ein Bitmuster?
- 23. Was ist ein CGVector?
- 24. Was ist ein tGrid?
- 25. Was ist ein LPTHREAD_START_ROUTINE?
- 26. Was ist ein ImageObserver?
- 27. Was ist ein "Doppelstapelfehler"?
- 28. Was ist ein Pushlock?
- 29. Was ist ein Arbeitssatz?
- 30. Was ist ein Jamfile?
+1 Schöne Figur. –
@Sinan: Danke, ich trainiere. –
+1 für diese Antwort, klassisch. –