| Red Hat Enterprise Linux 4: Einführung in die System-Administration | ||
|---|---|---|
| Zurück | Kapitel 4. Physikalischer und virtueller Speicher | Nach vorne |
Zunächst müssen wir ein neues Konzept vorstellen: virtueller Adressbereich. Virtueller Adressbereich ist die maximale Menge an Adressbereich, der einer Applikation zur Verfügung steht. Der virtuelle Adressbereich variiert entsprechend der Systemarchitektur und ist abhängig vom Betriebssystem. Virtueller Adressbereich hängt von der Architektur ab, da die Architektur genau bestimmt wieviele Bits zu diesem Zweck zur Verfügung stehen. Virtueller Speicherraum hängt ebenso vom Betriebssystem ab, da die Art in welcher das Betriebssystem implementiert worden ist, zusätzliche Begrenzungen zur Folge haben kann, die weitaus höher sind als jene, die auf die Architektur zurückzuführen sind.
Das Wort "virtuell" in virtuellem Adressbereich steht für die gesamte Anzahl von einzigartig ansprechbaren Speicherplätzen, die einer Applikation zur Verfügung stehen, aber nicht für die Menge an physikalischem Speicher, der entweder im System installiert ist oder der Applikation zum jeweils gegebenen Zeitpunkt verschrieben ist.
Im Falle unserer Beispielapplikation besitzt der virtueller Adressbereich 15000 Bytes.
Um virtuellen Speicher implementieren zu können, muss das Computersystem spezielle Speicher-Management-Hardware besitzen. Diese Hardware ist auch oft als MMU (Memory Management Unit) bekannt. Sobald die CPU auf RAM zugreift, ändern sich ohne MMU die tatsächlichen Hauptspeicherplätze nicht — z.B. Speicheradresse 123 ist immer der selbe physikalische Speicherplatz innerhalb des Hauptspeichers (RAM).
Mit MMU durchlaufen die Speicheradressen jedoch einen Umrechnungsschritt vor jedem einzelnen Speicherzugriff. Dies bedeutet, dass Speicheradresse 123 das eine Mal zur physikalischen Adresse 82043 geleitet wird und ein anderes Mal widerum zur physikalischen Adresse 20468. Wie sich herausgestellt hat, wäre der Overhead beim individuellen Verfolgen der Umrechnungen für Billionen von Bytes viel zu hoch. Daher unterteilt MMU den Hauptspeicher in Pages oder auch sogennate Seiten —
Diesen Pages und deren Adress-Umrechnungen im Auge zu behalten, mag wie ein unnötiger und verwirrender Schritt klingen. Tatsächlich ist dies jedoch entscheidend bei der Implementierung virtuellen Speichers. Beachten Sie bitte dabei folgenden Punkt:
Nehmen wir unsere hypothetische Applikation mit 15000 Byte virtuellem Adressbereich und nehmen an, dass die erste Anweisung der Applikation auf Daten zugreift, die unter der Adresse 12374 gespeichert sind. Jedoch gehen wir ebenso davon aus, dass unser Computer lediglich 12288 Bytes an physikalischem Hauptspeicher besitzt. Was passiert nun, wenn die CPU versucht auf die Adresse 12374 zuzugreifen?
Was hier passiert wird als Page Fault oder Seitenfehler bezeichnet.
Ein Seitenfehler oder Page Fault tritt dann auf, wenn ein Programm versucht auf Daten zuzugreifen (oder auch auf Code), welche sich zwar in deren Addressbereich, aber sich zu diesem Zeitpunkt nicht im RAM des Systems befinden. Das Betriebssystem muss Seitenfehler derart behandeln, dass irgendwie das Einlagern der Seite veranlasst wird und der Prozess nach erfolgtem Einlagern mit dem unterbrochenen Befehl fortgesetzt wird - genauso als ob der Seitenfehler niemals aufgetreten wäre.
Im Falle unserer hypothetischen Applikation legt die CPU zuerst der MMU die gewünschte Adresse (12374) vor. Jedoch besitzt die MMU keine Umwandlung für diese Adresse. Daher unterbricht diese die CPU, wobei die als "Page Fault Handler" bekannte Software ausgeführt wird. Der Page Fault Handler legt sodann genau fest, was zu tun ist, um diesen Seitenfehler zu beheben. Diese Software kann:
Herausfinden, wo sich die gewünschte Seite auf der Festplatte befindet und diese einlesen (dies ist normalerweise der Fall, wenn es sich dabei um einen Page Fault in Bezug auf Code handelt)
Ermitteln, dass die gewünschte Seite sich bereits im Hauptspeicher befindet (aber noch nicht dem gegenwärtigen Prozess zugewiesen ist) und die MMU rekonfigurieren, um darauf hinzuzeigen
Hinzeigen auf eine spezielle Seite, die lediglich Nullen enthält und später dem Prozess eine neue Seite zuweisen. Dies geschieht jedoch nur unter der Voraussetzung, dass der Prozess jemals auf diese Seite schreibt (dies wird als sogenannte Copy on Write-Seite bezeichnet und wird oft für Seiten verwendet, die Null-initialisierte Daten enthalten).
Holt Sie die gewünschte Seite von irgendwo anders (was später noch genauer behandelt wird)
Im Gegensatz zu den ersten drei Abläufen, die relativ unkompliziert sind, ist die Letzte nicht ganz so einfach. Dazu müssen wir einige zusätzliche Themenbereiche abdecken.
Die Menge der physikalischen Seiten, die gegenwärtig einem bestimmten Prozess gewidmet sind, werden für diesen Prozess als Working Set oder Arbeitsmenge bezeichnet. Die Working-Set-Größe (Anzahl der Seiten) kann dabei wachsen und schrumpfen, abhängig von der allgemeinen Verfügbarkeit von Seiten auf einer systemweiten Basis.
Der Working Set erweitert sich, sobald ein Prozess einen Seitenfehler hervorruft. Der Working Set schrumpft, sobald immer weniger freie Seiten vorhanden sind. Um das völlige Auslaufen von Speicher zu vermeiden, müssen Seiten aus der Arbeitsmenge ausgelagert werden und in freie Seiten zur späteren Benutzung umgewandelt werden. Das Betriebssystem schrumpft Arbeitsmengen (Working Sets) von Prozessen wie folgt:
Modifizierte Seiten werden in einen eigens dafür bestimmten Bereich auf einem Massenspeichergerät geschreiben (welcher normalerweise als Swapping- oder Paging-Space bekannt ist)
Unmodifizierte Seiten werden als frei gekennzeichnet (es besteht kein Anlass, diese unveränderten Seiten nochmals auf eine Festplatte zu schreiben)
Um geeignete Working Sets für alle Prozesse festzulegen, muss das Betriebssystem Nutzungs-Informationen für alle Seiten ausfindig machen. Auf diese Art legt das Betriebssystem fest, welche Seiten aktiv genutzt werden (und speicher-resident bleiben) und welche Seiten nicht genutzt werden (und daher vom Speicher verdrängt werden können). In den meisten Fällen bestimmt eine Art von 'am-wenigsten-jüngst-bentutzt' Algorithmus (LRU oder auch "least recently used"), welche Seiten verdrängt werden können (da wahrscheinlich nicht mehr in einer Lokalität).
Obwohl Swapping (das Auslagern modifizierter Seiten in den Swap-Space des Systems) ein ganz normaler Systemvorgang ist, kann auch ein Übermaß an Swapping auftreten. Warum man sich vor exzessivem Swapping hüten sollte, wird dadurch ersichtlich, dass folgende Situation immer wiederkehrend auftreten kann:
Seiten eines Prozesses werden ausgetauscht
Der Prozess versucht auf eine ausgetauschte Seite zuzugreifen
Die Seite wird wieder in den Speicher eingelagert (wobei höchstwahrscheinlich die Seiten anderer Prozesse verdrängt werden)
Kurze Zeit später wird die Seite wieder ausgelagert
Wenn die Gesamtheit der Lokalitäten aller Prozesse den Arbeitsspeicher sprengt, droht Thrashing oder auch Seitenflattern genannt. Dies ist ein Indikator für ungenügenden Arbeitsspeicher für die gegenwärtige Arbeitslast. Thrashing hat höchst nachteilige Auswirkungen auf das Leistungsverhalten des gesamten Systems, da eine extrem hohe CPU- und I/O-Arbeitslast durch das hektische Ein-/Auslagern generiert wird. In extremen Fällen kann es dazu kommen, dass das System tatsächlich keine nützliche Arbeit mehr leistet, da es zu beschäftigt mit dem Auslagern und Einlagern von Seiten ist.
| Zurück | Zum Anfang | Nach vorne |
| Grundlegende Konzepte virtuellen Speichers | Nach oben | Schlussfolgerungen zur Leistungsfähigkeit bei der Benutzung von virtuellem Speicher |