4.4. Virtueller Speicher: Die Details

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.

4.4.1. Seitenfehler (Page Faults)

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:

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.

4.4.2. Die Arbeitsmenge (Working Set)

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:

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).

4.4.3. Seitenaustausch (Swapping)

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:

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.