malloc
weist Speicher auf dem Heap zu, Punkt.
Ihre C-Bibliothek führt normalerweise eine Liste (oder eine kompliziertere Datenstruktur) verfügbarer Speicherblöcke und findet einen geeigneten Block, um einen malloc
zu erfüllen (möglicherweise Aufteilen eines größeren Chunks in mehrere kleinere) und Zurückgeben von free
Speicher in die Liste aufnehmen (möglicherweise durch Zusammenführen einiger kleinerer Stücke zu einem größeren)
Nur wenn die Liste nicht groß genug ist, um Ihre malloc
zu erfüllen , fragt die Bibliothek das Betriebssystem nach mehr Speicher, z. mit dem sbrk-Systemaufruf. Die von diesem Systemaufruf zurückgegebene Adresse kann abhängig von Ihrer Hardware eine virtuelle oder eine echte Adresse sein, aber als Programmierer können (und müssen) Sie dies nicht wissen.
Sagen Sie das malloc
virtuellen Adressraum statt eines Blocks auf dem Heap zuweist, ist wie zu sagen, dass read
liest von Ihrer Festplatte und nicht aus einer Datei:aus Sicht des Anrufers ist dies irrelevant und nicht immer wahr.
Es gibt mindestens 3 Möglichkeiten, den Speicherverbrauch zu messen:
- virtueller Adressraum - die Menge des Adressraums Ihres Prozesses, die von der Zuweisung verbraucht wird. dies wirkt sich auch auf die Fragmentierung und die maximalen zusammenhängenden zukünftigen Zuweisungen aus, die Sie vornehmen können.
- Commit-Gebühr – Dies ist die Abrechnung des Betriebssystems über den maximal möglichen physischen Speicher, der erforderlich ist, um den gesamten beschreibbaren, nicht datei-/gerätegestützten Speicher zu verwalten, der Ihrem Prozess zugewiesen ist. Wenn das Betriebssystem zulässt, dass der gesamte physische Speicher + Swap überschritten wird, können sehr schlimme Dinge passieren, wenn der Überschuss zum ersten Mal geschrieben wird.
- physischer Speicher - die Menge an physischen Ressourcen (möglicherweise einschließlich Swap, abhängig von Ihrer Interpretation), die Ihr Prozess derzeit belegt. Dies könnte aufgrund von jungfräulichen Nullseiten und jungfräulichen privat beschreibbaren Zuordnungen von Dateien weniger als die Commit-Gebühr sein oder aufgrund von nicht beschreibbaren oder gemeinsam genutzten Zuordnungen, die der Prozess verwendet, mehr als die Commit-Gebühr (aber diese sind normalerweise austauschbar/verwerfbar).
malloc
betrifft im Allgemeinen alle.
Bearbeiten: Daher kann ich Ihre Frage am besten so beantworten:
malloc
weist virtuellen Speicher zu .
Und virtueller Speicher verbraucht:
- virtueller Adressraum,
- Gebühren festschreiben und
- physische Ressourcen, wenn darauf geschrieben wurde.
malloc
ist ein Bibliotheksaufruf. Unter Linux ruft es wiederum sbrk
auf Systemaufruf. sbrk
erhöht die Größe des Heapspeichers, weist jedoch keinen physischen Speicher zu. Wenn der Prozess versucht, auf diese Adresse zuzugreifen, wird ein page fault
wird ausgelöst und dann weist der Kernel zu diesem Zeitpunkt die tatsächliche physische Seite zu und bildet sie auf die virtuelle Adresse ab.
TL;DR:malloc
gibt eine virtuelle Adresse zurück und weist KEINEN physischen Speicher zu.
Sehen Sie sich das an.