Virtueller Speicher erhöht die Datenmenge, die ein Programm adressieren kann. Aus Sicht der Software ist es uns (im Allgemeinen) egal, wo diese Daten gespeichert werden. Es könnte im physischen DRAM-Speicher gespeichert sein, es könnte auf einem in die Maschine eingesteckten Flash-Laufwerk gespeichert sein, oder es könnte sogar auf einer sich drehenden Platte gespeichert sein. Die Software kümmert sich darum, dass der Zugriff auf diese Daten erfolgreich ist.
In der Praxis möchten wir auch, dass Programme schnell ausgeführt werden. Aus Gründen der Geschwindigkeit ist es uns wichtig, wo sich die Daten befinden. Wir möchten, dass die Daten, auf die wir am häufigsten zugreifen, in Hardware gespeichert werden, die den schnellsten Zugriff ermöglicht. Unsere Programme würden gerne kein DRAM mehr haben. Wir haben jedoch oft nicht genug DRAM, um dies zu tun. Virtueller Speicher ist eine Lösung.
Beim virtuellen Speicher "paget" das Betriebssystem nicht mehr benötigte Daten aus und speichert sie auf einer Festplatte. Dies ist immer noch zugänglich, nur langsam. Wenn das Programm Daten anfordert, die sich auf der Festplatte befinden, muss sich das Betriebssystem die Zeit nehmen, um die Daten von der Festplatte zu lesen und wieder in den DRAM zu verschieben.
Theoretisch könnten die Daten einfach direkt von der Festplatte gelesen werden. Es gibt jedoch Gründe, warum dies nicht der Fall ist. Die Programme möchten sich nicht all dieser Komplikationen bewusst sein müssen. Wir können und können Software schreiben, die Daten auf intelligente Weise auf die Festplatte schreibt (Caching). Es erfordert jedoch viel zusätzliche Arbeit. Das schnellste, was wir im Code machen können, ist:
if data is not in memory
read data from disk into memory
operate on data
Ein kluger Leser wird feststellen, dass wir, selbst wenn sich die Daten im Speicher befinden, eine Bedingung haben müssen, um zu überprüfen, ob sie vorhanden sind. Dies ist viel langsamer als nur direkt im Speicher zu arbeiten!
Der virtuelle Speicher löst dieses Problem, indem die Hardware auf der CPU eingecheckt wird. Die CPU ist in der Lage, diese virtuelle Speicheroperation extrem schnell durchzuführen, da sie ihr Hardware zuweisen kann. Jeder Versuch, dies in Software alleine zu tun, muss die Allzweckteile der CPU verwenden, die natürlich langsamer sind als dedizierte Transistoren.
Dies führt dazu, dass wir die Daten immer in den Speicher zurückspeichern, anstatt sie nur von der Festplatte zu lesen und dabei zu belassen. Wir teilen das Gedächtnis in "Seiten" auf, von denen jede als entweder gegenwärtig oder nicht gegenwärtig im Gedächtnis markiert ist. Das Betriebssystem verwaltet diese Tabelle in einem Format, das für die CPU zur direkten Verwendung geeignet ist. Immer wenn ein Programm auf vorhandene Daten zugreift, gibt die Hardware in der CPU ihnen direkten Zugriff auf die Daten im DRAM. Wenn die Daten nicht vorhanden sind, wird ein "Seitenfehler" ausgegeben, der das Betriebssystem anweist, diese Seite von der Festplatte auf eine physische Speicherseite zu laden und die Tabelle zu aktualisieren, um die CPU auf diese neue physische Seite zu verweisen.
Der Schlüssel zu diesem ganzen Problem besteht darin, seine Verwendung zu minimieren. In der Praxis stellen wir fest, dass Betriebssysteme sehr gut auswählen können, welche Daten im Speicher bleiben und welche Daten auf die Festplatte ausgelagert werden sollen, sodass die überwiegende Mehrheit der Speicherzugriffe erfolgt, ohne jemals einen Seitenfehler zu verursachen.