4.3. Grundlegende Konzepte virtuellen Speichers

Obwohl die Technologie, die sich heutzutage hinter den verschiedensten modernen Speichertechnologien verbirgt, schlichtweg eindrucksvoll ist, muss der durchschnittliche Systemadministrator sich nicht näher mit den Details befassen. Tatsächlich gibt es nur eine Tatsache, die Systemadministratoren in Bezug auf Speicher immer im Gedächtnis behalten sollten:

Es gibt niemals genug RAM.

Während diese Binsenweisheit zunächst sehr humorvoll erscheinen mag, so haben zahlreiche Designer von Betriebssystemen geraume Zeit damit verbracht, die Auswirkungen dieses sehr realen Engpasses zu verringern. Dies wurde bewerkstelligt durch die Implementierung virtuellen Speichers — eine Art Kombination von RAM mit langsamerem Speicher, um dem System den Anschein zu geben, mehr RAM zu besitzen, als eigentlich installiert worden ist.

4.3.1. Virtueller Speicher in einfachen Worten

Beginnen wir mit einer hypothetischen Applikation. Der Maschinencode, aus dem diese Applikation besteht, besitzt eine Größe von 10000 Bytes. Außerdem werden weitere 5000 Bytes zur Datenspeicherung und für I/O-Puffer benötigt. Dies bedeutet, dass diese Applikation 15000 Bytes RAM benötigt; sogar bei einem einzigen Byte weniger könnte die Applikation nicht ablaufen.

Diese Voraussetzung von 15000 Byte ist auch als Adressbereich der Applikation bekannt. Es stellt die Anzahl von einzigartigen Adressen dar, die dazu benötigt werden, die Applikation und deren Daten zu enthalten. In den ersten Computern musste der Adressbereich größer sein, als der Adressbereich der größten Applikation, die darauf ablaufen sollte; ansonsten würde die Applikation fehlschlagen und eine "Out of Memory"-Fehlermeldung ("Speicher unzureichend") erzeugen.

Eine spätere Vorgehensweise, als Overlaying bekannt, versuchte das Problem zu verringern, indem Programmierer festlegen konnten, welche Teile derer Applikationen im Speicher zu jedem gegebenen Zeitpunkt resident bleiben. Auf diese Art konnte Code, der nur einmalig zu Initialisierungszwecken benötigt wird, mit Code überschrieben (overlayed) werden, der zu einem späteren Zeitpunkt benötigt wird. Während Overlays im Falle von Speicherknappheit Erleichterung schaffen konnten, so war dies jedoch ein sehr komplexer und fehleranfälliger Prozess. Overlays haben auch nicht das Problem einer systemweiten Speicherknappheit während der Laufzeit angesprochen. In anderen Worten erfordert ein Programm mit Overlays zwar weniger Speicher zum Ablaufen, besitzt das System jedoch nicht genügend Speicher für das darübergelegte (overlayed) Programm, bleibt das Endresultat unverändert — eine "Out of Memory"-Fehlermeldung.

Virtueller Speicher stellt das Konzept eines Adressbereichs für Applikationen auf den Kopf. Anstatt sich darauf zu konzentrieren, wieviel Speicher eine Applikation zum Ablaufen benötigt, versucht ein Betriebssystem mit virtuellem Speicher ständig die Antwort auf eine Frage zu finden, nämlich "wiewenig Speicher benötigt eine Applikation zum Ablaufen?"

Wobei es zunächst danach aussieht, als ob unsere hypothetische Applikation die gesamten 15000 Bytes zum Ablaufen benötigt, bitten wir Sie, sich an unsere Diskussion zurückzuerinnern in Abschnitt 4.1 — Speicherzugriff neigt dazu, sequentiell und ortsgebunden zu sein. Daher ist die Menge an benötigtem Speicher (um die Applikation auszuführen) zu jedem Zeitpunkt weniger als 15000 Bytes — normalerweise sogar um Einiges weniger. Betrachten Sie die Arten von Speicherzugriffen, die notwendig sind, um einen einzigen Maschinenbefehl auszuführen:

Die eigentliche Menge von Bytes, die für jeden Speicherzugriff notwendig sind, variiert in Hinsicht auf CPU-Architektur, den tatsächlichen Befehl und den Datentyp. Selbst wenn ein Befehl 100 Bytes für jede Art von Speicherzugang benötigt, so sind die benötigten 300 Bytes immer noch viel niedriger als der gesamte 15000-Byte Adressbereich der Applikation. Wenn es eine Möglichkeit gäbe, die Speicheranforderungen einer Applikation nachzuverfolgen während diese abläuft, so wäre es möglich die Applikation auch mit weniger Speicher, als vom Adressbereich gefordert, ablaufen zu lassen.

Da bleibt nur noch eine Frage übrig:

Wenn nur ein Teil der Applikation sich zu einem bestimmten Zeitpunkt im Speicher befindet, wo befindet sich der Rest?

4.3.2. Zusatzspeicher — zentraler Grundsatz des virtuellen Speichers

Kurz gesagt verbleibt der Rest der Applikation auf der Festplatte. In anderen Worten fungiert die Festplatte als Zusatzspeicher für RAM; ein langsameres, größeres Speichermedium dient als "Backup" für ein viel schnelleres, kleineres Speichermedium. Dies mag zunächst den Eindruck eines großen Performance-Problems in spe erwecken — sind doch Festplattenlaufwerke um so vieles langsamer als RAM.

Während dies der Wahrheit entspricht, ist es jedoch möglich seine Vorteile aus dem sequentiellen und ortsgebundenen Zugriffsverhalten von Applikationen zu ziehen und die meisten negativen Auswirkungen auf die Leistung zu elimieren, sobald Festplattenlaufwerke als Zusatzspeicher für den Hauptspeicher verwendet werden. Das Subsystem des virtuellen Speichers wird dahingehend strukturiert, dass dieses versucht sicherzustellen, dass diejenigen Teile der Applikation, die sich gerade in Gebrauch befinden oder höchstwahrscheinlich in naher Zukunft benötigt werden, für den benötigten Zeitraum lediglich in RAM aufbewahrt werden.

In vieler Hinsicht ist dies ähnlich der Beziehung zwischen Cache und RAM: indem ein kleiner, schneller Speicher gemeinsam mit einem großen, langsamen Speicher sich wie eine große Menge schneller Speicher verhalten.

In Anbetracht dessen, sehen wir uns den Prozess nun einmal genauer an.