Speicherverwaltung — Änderungen 4325 → 4326

Zeile 2: Zeile 2:
  
 
== Einleitung ==
 
== Einleitung ==
−
Generell ist die Speicherverwaltung dafür zuständig nachfragenden Prozessen freien Speicher zuzuteilen bzw. freizugebenden Speicher wieder zurückzunehmen. Dazu muss natürlich gespeichert werden, welche Speicherbereiche belegt bzw. frei sind. Es ist wichtig zu verstehen, dass die Speicherverwaltung normalerweise auf 2 Ebenen aufgeteilt wird: Zum einen die [[ #physische Speicherverwaltung | physische Speicherverwaltung]] und darauf aufbauend die [[ #virtuelle Speicherverwaltung | virtuelle Speicherverwaltung]].
+
Generell ist die Speicherverwaltung dafür zuständig nachfragenden Prozessen freien Speicher zuzuteilen bzw. freizugebenden Speicher wieder zurückzunehmen. Dazu muss natürlich gespeichert werden, welche Speicherbereiche belegt bzw. frei sind. Es ist wichtig zu verstehen, dass die Speicherverwaltung normalerweise auf drei Ebenen aufgeteilt wird:  
 +
 
 +
* Die [[physische Speicherverwaltung]] verwaltet Speicherblöcke (physische Seiten) im tatsächlich verfügbaren RAM
 +
* Die [[ #virtuelle Speicherverwaltung | virtuelle Speicherverwaltung]] baut auf der physischen Speicherverwaltung auf. Sie verwaltet Seiten im virtuellen Adressraum und deren Zuordnung zu physischen Seiten.
 +
* malloc/free verwalten den Heap. Im Gegensatz zu den unterliegenden Schichten, die nur in Blöcken gleicher Größe arbeiten, sind malloc/free dafür zuständig, Speicher für unterschiedlich große Objekte bereitzustellen.
  
 
== Physische Speicherverwaltung ==
 
== Physische Speicherverwaltung ==
Zeile 14: Zeile 18:
 
Die virtuelle Speicherverwaltung übernimmt in einem Multiprozessorsystem auch die Aufgabe die virtuellen Adressräume über mehrere Prozessoren hinweg konsistent zu halten (siehe auch [[SMP]]).
 
Die virtuelle Speicherverwaltung übernimmt in einem Multiprozessorsystem auch die Aufgabe die virtuellen Adressräume über mehrere Prozessoren hinweg konsistent zu halten (siehe auch [[SMP]]).
  
−
=== Implementierung von malloc()/free() ===
+
Hauptartikel: [[Paging]]
 +
 
 +
== Implementierung von malloc()/free() ==
 +
Im Gegensatz zur oben beschriebenen physischen und virtuellen Speicherverwaltung, die fast immer Teil des Kernels sind, sind malloc() und free() Funktionen, die zur Standardbibliothek gehören. Sie laufen üblicherweise im Userspace und benutzen [[Systemaufruf|Systemaufrufe]] nur, um virtuelle Seiten anzufordern, wenn mehr Speicher benötigt wird.
 +
 
 +
Gelegentlich werden die beiden Funktionen auch als Bestandteil der virtuellen Speicherverwaltung bezeichnet, da sie ebenfalls mit virtuellen Adressen arbeiten. Sie sind aber nicht mit [[Paging]] zu verwechseln.
 +
 
 
Es gibt verschiedene Möglichkeiten malloc() bzw. free() zu implementieren. Eine Möglichkeit ist es vor den Speicherblöcken Header anzulegen, die die Länge, Flags (wie z.B ob der Block frei ist) und gegenfalls einen Pointer auf den nächsten freien Block beinhalten. Zum Anfang sind keine freien Blöcke vorhanden. Es wird vom Kernel eine Page angefordert. Nun wird ein Header an den Anfang der Page gesetzt. Wenn nun malloc() aufgerufen wird, wird der Block aufgeteilt und ein Teilblock als benutzt markiert. Bei einem Aufruf von free() wird der Block als frei markiert und in die Liste der freien Blöcke eingefügt. Wenn benachbarte Blöcke auch frei sind, werden diese zusammengefügt. Wenn man nun eine ganze Page hat, die als frei markiert ist, kann sie vom Kernel freigegeben werden oder aufgehoben werden, bis sie wieder gebraucht wird.
 
Es gibt verschiedene Möglichkeiten malloc() bzw. free() zu implementieren. Eine Möglichkeit ist es vor den Speicherblöcken Header anzulegen, die die Länge, Flags (wie z.B ob der Block frei ist) und gegenfalls einen Pointer auf den nächsten freien Block beinhalten. Zum Anfang sind keine freien Blöcke vorhanden. Es wird vom Kernel eine Page angefordert. Nun wird ein Header an den Anfang der Page gesetzt. Wenn nun malloc() aufgerufen wird, wird der Block aufgeteilt und ein Teilblock als benutzt markiert. Bei einem Aufruf von free() wird der Block als frei markiert und in die Liste der freien Blöcke eingefügt. Wenn benachbarte Blöcke auch frei sind, werden diese zusammengefügt. Wenn man nun eine ganze Page hat, die als frei markiert ist, kann sie vom Kernel freigegeben werden oder aufgehoben werden, bis sie wieder gebraucht wird.