mini|Schemabild einer virtuellen Speicherverwaltung:links: virtueller Speicherbereich für eine laufende Anwendung (oder einen Prozess); der Speicher ist linear und unfragmentiertrechts: echte Speicherquellen; typischerweise RAM, Festplatte und Ähnliche; mehrere, auch kleine Speicherfragmente können verwendet werden; in rot die Speicherverwendung anderer Prozesse, unsichtbar im virtuellen Speicherbereich
Die virtuelle Speicherverwaltung (, kurz VMM) ist eine spezielle Speicherverwaltung in einem Computer. Der virtuelle Speicher bezeichnet den vom tatsächlich vorhandenen Arbeitsspeicher unabhängigen Adressraum, der einem Prozess vom Betriebssystem zur Verfügung gestellt wird.
Das Konzept entstand in den 1950er Jahren und wird heute von den meisten Prozessorarchitekturen unterstützt und in nahezu allen modernen Betriebssystemen verwendet.
Geschichte Das Konzept der virtuellen Speicherverwaltung entstand aus der Trennung in primäre Speichermedien, auf die der Prozessor direkt Zugriff hatte (meist Magnetkernspeicher), und sekundäre externe Speichermedien (meist Magnettrommelspeicher) in den Computern der 1950er Jahre und dem Wunsch, diese automatisch auf gleicher Ebene zu verwalten.
Das Konzept des virtuellen Speichers wurde 1956 vom Physiker Fritz-Rudolf Güntsch an der Technischen Universität Berlin entwickelt.E. Jessen: Origin of the Virtual Memory Concept. IEEE Annals of the History of Computing. Band 26. 4/2004, S. 71 ff.
In Großbritannien wurde das Konzept beim Atlas-Computer-Projekt von Tom Kilburn und Kollegen 1959 in einem Prototyp demonstriert. Der Computer kam 1962 auf den Markt. Das Konzept setzte sich im Verlauf der 1960er Jahre bei den meisten Betriebssystemen von Großrechnern durch (wie TSOS der RCA Spectra 70/46RCA Spectra 70/46 Reference Manual auf bitsaver.org (PDF; 10,22 MB) von RCA, BS2000 von Siemens oder System/360 (Modell 67) und ab 1972 deren Nachfolger System/370 von IBM). Da zur effizienten Implementierung auch neue Hardware entwickelt werden musste, gab es in den 1960er Jahren noch Widerstände gegen eine vollständige Implementierung in Betriebssystemen. Systematische Tests, die ein Team um David Sayre bei IBM Ende der 1960er Jahre durchführte, fielen aber eindeutig zu Gunsten des Konzepts virtueller Speicher aus. 1970 veröffentlichte Peter J. Denning einen Aufsatz zur Klärung der Eigenschaften des Konzepts Virtueller Speicher.Denning, Virtual Memory, Computing Surveys, Band 2, 1970, S. 153–189
Das Konzept fand in den 1970er Jahren Eingang auch bei Minirechnern, wie in das VMS Betriebssystem von DEC für dessen VAX-Rechner und in Unix (in der BSD Version). Beim PC setzte sich das Konzept mit der Weiterentwicklung der Prozessoren (beim x86-Prozessor von Intel mit dem Protected Mode im 80286 und dem 80386 mit Memory Management Unit) auch in den Betriebssystemen durch, bei Microsoft ab Windows 3.0.
Motivation Die ursprüngliche Motivation für eine Abstraktion der Speicheradressen mit virtuellen Adressen war die Vereinheitlichung der Benutzung und die mögliche Zusammenfassung verschiedener Speicherquellen. Dies wird von Güntsch in seiner Dissertation von 1957 so beschrieben:
Die virtuelle Speicherverwaltung ermöglicht zudem die Implementierung von Speicherschutzmechanismen zur Separierung von Programmen untereinander („horizontale Trennung“): Programme können (z. B. im Fehlerfall) nicht auf Speicher anderer Programme zugreifen; Programmen gegen das Betriebssystem („vertikale Hierarchie“): Das Funktionieren des Betriebssystems darf nicht durch (fehlerhafte) Anwendungsprogramme gefährdet werden.
Eine weitere nützliche Eigenschaft des virtuellen Adressraums ist die Möglichkeit, jedem Prozess einen initial unfragmentierten, exklusiven Speicherraum zur Verfügung zu stellen. Ohne virtuellen Speicher entstünde oft Speicherfragmentierung des (physischen) Adressraums (prozessübergreifend); durch virtuellen Speicher (pro Prozess, sowie meist deutlich größeren Adressraum als der phys. Speicher) kann weitgehend vermieden werden, dass der Adressraum eines Prozesses fragmentiert wird aufgrund eines anderen Prozesses.
Durch die Abbildung virtueller auf physikalische Adressen kann ein physikalischer Bereich unter gewissen Umständen auch von mehreren Prozessen zugleich verwendet werden, was vor allem die effiziente Verwendung von dynamischen Bibliotheken erlaubt. Hierbei wird eine in mehreren Programmen eingebundene Bibliothek physikalisch nur einmal geladen. Dies kann insbesondere bei Standard-Bibliotheken, solche, die bei fast jedem Programm angebunden sind, eine erhebliche Verbesserung der Ladezeiten des Programms sowie eine effizientere Speichernutzung bewirken. Ebenso bei Programmen, die mehrfach zur gleichen Zeit ausgeführt werden; auch hier braucht der Programmcode sich nur einmal im Speicher zu befinden. Wesentlich für diese Art der Mehrfachverwendung des physikalischen Speichers ist, dass der Code der Bibliotheken und Programme während der Ausführung nur gelesen, also nicht verändert wird. Für die Variablen sind je Instanz neue physikalische Seiten zu reservieren, was im Allgemeinen „automatisch geschieht“ per Copy-on-Write-Verfahren.
Funktionsweise mini|Beziehung des virtuellen Adressraums zum physischen Adressraum für einen Prozess (). Fragmentierter physischer Speicher wird dem Prozess im 2-GB-großen virtuellen Adressraum als kontinuierlich präsentiert.
Das Rechnersystem stellt jedem Prozess mit Adressen von 0 bis n-1 einen scheinbar zusammenhängenden lokalen Speicherbereich zur Verfügung, wobei n die Größe dieses Speicherbereichs ist. In Wirklichkeit besteht dieser Speicherbereich aus einzelnen Seiten definierter Größe („Pages“, veraltet auch „Kacheln“) innerhalb des virtuellen Adressraums des Prozesses. Diese virtuellen Pages werden wiederum auf physische Pages abgebildet, die irgendwo im physischen Speicher oder sogar in einer Auslagerungsdatei liegen. Beim Zugriff eines Prozesses auf eine Speicheradresse (eine virtuelle Adresse, andere Adressen kennt der Prozess gar nicht) übersetzt die Memory Management Unit (MMU; meist kombiniert mit einem TLB) des Systems diese in die zugehörige aktuelle physische Adresse.
Die sogenannte Seitentabelle ist die Tabelle, welche der Transformation von virtuellen in physische Seitenrahmen dient. Anhand dieser Tabelle kann die MMU die virtuellen Adressen in reale Adressen übersetzen. Hier ist verzeichnet, für welche virtuelle Seite welche reale Seite verwendet werden soll; bei nicht verwendeter virtueller Seite ist markiert, dass keine reale Seite dafür verwendet wird; bei ausgelagerter Seite ist vermerkt, dass/wo in einer Programm- oder Bibliotheksdatei oder ggfls. in einer Auslagerungsdatei der Inhalt gespeichert ist und bei Bedarf wieder geladen werden kann. Die optimale Seitengröße (Größe einer Page) ist ein Kompromiss zwischen Häufigkeit von Seitenwechsel und Größe der Tabelle (übliche Größen: 4 KiB bei 32-Bit-virt.Adressraum, 4 MiB bei 64-Bit-virt.Adressraum).
Eine virtuelle Adresse beschreibt also einen Ort im Speicher eines Computersystems, dessen Betriebssystem eine virtuelle Speicherverwaltung zur Adressierung verwendet. Die Gesamtheit aller (möglicher) virtuellen Adressen (eines Prozesses) wird auch als virtueller Adressraum bezeichnet.
Nur Betriebssysteme, die eine virtuelle Speicherverwaltung verwenden, können einen virtuellen Adressraum generieren und dadurch Speicherseiten, die physisch nicht zusammenhängend sind, für den Programmierer bzw. das Programm als logisch zusammenhängenden Speicherbereich abbilden.
Definition Gemeinsam sind den virtuellen Speicherverwaltungen heutzutage folgende Grundprinzipien: Alle von Prozessen verwendeten Adressen werden nur noch als virtuelle Adressen behandelt.Für den Bootprozess/Initialisierung ist ggf. eine Initialisierung mit speziellen Tabelleneinträgen oder ein nicht-virtueller Modus notwendig. Eine Memory Management Unit übersetzt die virtuellen Adressen in reale physische Adressen. Der durch die Gesamtheit aller möglichen virtuellen Adressen definierte virtuelle Adressraum, der den virtuellen Speicher bildet, wird genauso wie der tatsächlich vorhandene physische Arbeitsspeicher in gleich große Speicherabschnitte unterteilt. Die für diese Speicherabschnitte verwendeten deutschen Begriffe Kachel, Speicherseite oder Seitenrahmen sind synonym. Im Englischen wird dieser Speicherabschnitt pageframe genannt. Eine Page des virtuellen Adressraums wird auf eine Page (pageframe) des physischen Adressraums abgebildet.
Die verschiedenen virtuellen Speicherverwaltungen unterscheiden sich in der Größe des virtuellen Speicherraums, in der Speichergröße, die eine Page belegt, in der Art, wie die Memory Management Unit aus der virtuellen Adresse eine physische Adresse berechnet, in ihrer Seitenersetzungsstrategie, welche die Reaktion auf einen so genannten Seitenfehler, die Adressierung einer nicht im physischen Speicher vorhandenen virtuellen Adresse, festlegt, und in der Behandlung von evtl. ausgelagerten Pages.
Technik Platzierungsstrategien von Betriebssystemen Fordert ein Programm Speicher vom Betriebssystem an, besitzt das Betriebssystem Freiheiten, wo im virtuellen Speicherraum des Prozesses es dem Programm den angeforderten Speicher zuweist. Mit geschickten Platzierungsstrategien kann eine kontinuierliche Fragmentierung des virtuellen Adressraums reduziert werden, was sowohl bei einer hohen Anzahl von Speicheranforderungen und -freigaben als auch bei stark gefülltem virtuellem Adressraum sehr relevant wird.
Strategien zur Wahl geeigneter Adressen sind:
FirstFit Freispeicher wird von Anfang an durchsucht, hierbei wird der erste Freibereich mit ausreichender Größe belegt. Der nicht benötigte freie Speicher wird als verkleinerter Freibereich dem Freispeicher zugefügt. Diese Strategie ist einfach zu implementieren und findet schnell einen passenden Freibereich, kann jedoch dazu führen, dass aufgrund des Verschnitts kein Freibereich für größere Blöcke gefunden werden kann.
BestFit Der Freispeicher wird vollständig durchsucht und der Bereich mit dem geringsten Verschnitt gewählt. Hierbei kann es allerdings zu externer Fragmentierung kommen, außerdem ist diese Strategie meist langsamer.
NextFit Variante von FirstFit, allerdings wird mit dem Durchsuchen des Freispeichers bei dem zuletzt belegten Speicherblock begonnen.
WorstFit Der Freispeicher wird vollständig durchsucht und der Bereich mit dem größten Verschnitt belegt. Diese Strategie ist meist langsamer als FirstFit und führt dazu, dass größere Speicherblöcke zerkleinert werden.
Paging mini|Virtuelle Speichersegmente des Intel 80286. mini|Paging des Intel 80386, mit einer Page-Seitengröße von 4 KB.
Der Begriff Paging bezeichnet im engeren Sinn lediglich den Vorgang der Abbildung der virtuellen Adressen auf die physischen. Im weiteren (fehlerhaften) Sinne wird er synonym für Swapping benutzt.
Swapping Swapping ist die Auslagerung eines realen RAM-Speicherbereichs in einen anderen, sekundären Speicher, typischerweise in eine Auslagerungsdatei auf eine Festplatte durch das Betriebssystem.
Die Idee dahinter ist, dass bei typischen Computern die Festplatte deutlich größer ist als der verfügbare elektronische Speicher (RAM): Indem der Festplattenspeicher ebenfalls verwendet werden kann, um Speicheranfragen von Programmen zu bedienen, können Anfragen, die über das verfügbare RAM hinausgehen, dann über Swap-Speicher für jeden Prozess mit mehr virtuellem Speicher bedient werden, als physisch vorhanden.
Nachteil ist, dass der auf Festplatte ausgelagerte Speicher deutlich langsamer zugreifbar ist als RAM – jedoch ermöglicht dieses Vorgehen das Funktionieren von Programmen mit hohem Speicherbedarf.