Virtueller Speicher - Virtual memory

Der virtuelle Speicher kombiniert aktiven RAM und inaktiven Speicher auf dem DASD , um einen großen Bereich zusammenhängender Adressen zu bilden.

In der Datenverarbeitung ist virtueller Speicher oder virtueller Speicher eine Speicherverwaltungstechnik , die eine "idealisierte Abstraktion der tatsächlich auf einer bestimmten Maschine verfügbaren Speicherressourcen" bereitstellt, die "den Benutzern die Illusion eines sehr großen (Haupt-)Speichers erweckt".

Das Betriebssystem des Computers ordnet unter Verwendung einer Kombination aus Hardware und Software von einem Programm verwendete Speicheradressen , die als virtuelle Adressen bezeichnet werden , physischen Adressen im Computerspeicher zu . Der Hauptspeicher erscheint aus der Sicht eines Prozesses oder einer Aufgabe als zusammenhängender Adressraum oder eine Sammlung zusammenhängender Segmente . Das Betriebssystem verwaltet virtuelle Adressräume und die Zuordnung von realem Speicher zu virtuellem Speicher. Adreßübersetzungshardware in der CPU, die oft als Speicherverwaltungseinheit (MMU) bezeichnet wird, übersetzt automatisch virtuelle Adressen in physikalische Adressen. Software innerhalb des Betriebssystems kann diese Fähigkeiten erweitern, indem sie z. B. Plattenspeicher verwendet , um einen virtuellen Adressraum bereitzustellen, der die Kapazität des realen Speichers überschreiten kann und somit auf mehr Speicher verweist, als physisch im Computer vorhanden ist.

Zu den Hauptvorteilen des virtuellen Speichers gehören die Befreiung von Anwendungen von der Verwaltung eines gemeinsam genutzten Speicherbereichs, die Möglichkeit, den von Bibliotheken verwendeten Speicher zwischen Prozessen gemeinsam zu nutzen, die erhöhte Sicherheit aufgrund der Speicherisolierung und die Möglichkeit, konzeptionell mehr Speicher zu verwenden, als physisch verfügbar wäre, mit die Technik des Paging oder der Segmentierung.

Eigenschaften

Der virtuelle Speicher erleichtert die Anwendungsprogrammierung, indem er die Fragmentierung des physischen Speichers verbirgt. indem die Last der Verwaltung der Speicherhierarchie an den Kernel delegiert wird (wodurch die Notwendigkeit beseitigt wird, dass das Programm Overlays explizit handhabt ); und, wenn jeder Prozess in seinem eigenen dedizierten Adressraum ausgeführt wird, durch Umgehen der Notwendigkeit , den Programmcode zu verschieben oder mit relativer Adressierung auf den Speicher zuzugreifen .

Die Speichervirtualisierung kann als Verallgemeinerung des Konzepts des virtuellen Speichers betrachtet werden.

Verwendungszweck

Virtueller Speicher ist ein integraler Bestandteil einer modernen Computerarchitektur ; Implementierungen erfordern normalerweise Hardwareunterstützung, typischerweise in Form einer Speicherverwaltungseinheit, die in die CPU eingebaut ist . Obwohl dies nicht erforderlich ist, können Emulatoren und virtuelle Maschinen Hardwareunterstützung verwenden, um die Leistung ihrer virtuellen Speicherimplementierungen zu erhöhen. Ältere Betriebssysteme, wie die für die Großrechner der 1960er Jahre und die für Personalcomputer der frühen bis Mitte der 1980er Jahre (z. B. DOS ), haben im Allgemeinen keine virtuelle Speicherfunktionalität, obwohl bemerkenswerte Ausnahmen für Großrechner der 1960er Jahre umfassen:

In den 1960er und frühen 70er Jahren war Computerspeicher sehr teuer. Die Einführung des virtuellen Speichers ermöglichte es Softwaresystemen mit großem Speicherbedarf, auf Computern mit weniger realem Speicher zu laufen. Die daraus resultierenden Einsparungen boten einen starken Anreiz, für alle Systeme auf virtuellen Speicher umzusteigen. Die zusätzliche Fähigkeit, virtuelle Adressräume bereitzustellen, fügte ein weiteres Maß an Sicherheit und Zuverlässigkeit hinzu, wodurch virtueller Speicher für den Markt noch attraktiver wurde.

Die meisten modernen Betriebssysteme, die virtuellen Speicher unterstützen, führen außerdem jeden Prozess in einem eigenen dedizierten Adressraum aus . Jedes Programm scheint somit alleinigen Zugriff auf den virtuellen Speicher zu haben. Einige ältere Betriebssysteme (wie OS/VS1 und OS/VS2 SVS ) und sogar moderne (wie IBM i ) sind jedoch Betriebssysteme mit einem einzigen Adressraum, die alle Prozesse in einem einzigen Adressraum ausführen, der aus virtualisiertem Speicher besteht.

Eingebettete Systeme und andere Spezialcomputersysteme, die sehr schnelle und/oder sehr konsistente Reaktionszeiten erfordern, können sich aufgrund des verringerten Determinismus dafür entscheiden, keinen virtuellen Speicher zu verwenden ; virtuelle Speichersysteme lösen unvorhersehbare Traps aus , die als Reaktion auf Eingaben unerwünschte und unvorhersehbare Verzögerungen erzeugen können, insbesondere wenn die Trap erfordert, dass Daten aus dem Sekundärspeicher in den Hauptspeicher gelesen werden. Die Hardware zum Übersetzen virtueller Adressen in physikalische Adressen erfordert in der Regel eine beträchtliche Chipfläche zur Implementierung, und nicht alle in eingebetteten Systemen verwendeten Chips enthalten diese Hardware, was ein weiterer Grund ist, warum einige dieser Systeme keinen virtuellen Speicher verwenden.

Geschichte

In den 1940er und 1950er Jahren hatten alle größeren Programme Logik für die Verwaltung von Primär- und Sekundärspeicher, wie zum Beispiel enthalten überlagern . Virtueller Speicher wurde daher nicht nur eingeführt, um den Primärspeicher zu erweitern, sondern um eine solche Erweiterung für Programmierer so einfach wie möglich zu machen. Um Multiprogramming und Multitasking zu ermöglichen , teilten viele frühe Systeme den Speicher auf mehrere Programme ohne virtuellen Speicher auf, wie beispielsweise die frühen Modelle des PDP-10 über Register .

Eine Behauptung, dass das Konzept des virtuellen Speichers erstmals 1956 von dem deutschen Physiker Fritz-Rudolf Güntsch an der Technischen Universität Berlin in seiner Doktorarbeit Logical Design of a Digital Computer with Multiple Asynchronous Rotating Drums and Automatic High Speed ​​Memory Operation entwickelt wurde, ist nicht haltbar bis hin zur sorgfältigen Prüfung. Der von Güntsch vorgeschlagene (aber nie gebaute) Computer hatte einen Adressraum von 10 5 Wörtern, der genau auf die 10 5 Wörter der Trommeln abgebildet wurde , dh die Adressen waren echte Adressen und es gab keine Form der indirekten Abbildung, ein wesentliches Merkmal von virtueller Speicher. Was Güntsch erfand, war eine Form von Cache-Speicher , da sein Hochgeschwindigkeitsspeicher eine Kopie einiger Codeblöcke oder Daten enthalten sollte, die von den Trommeln genommen wurden. Tatsächlich schrieb er (wie in der Übersetzung zitiert): „Der Programmierer muss die Existenz des Primärspeichers nicht respektieren (er muss nicht einmal wissen, dass er existiert), denn es gibt nur eine Art von Adressen ( sic ), mit denen man programmieren kann als ob es nur einen Speicher gäbe.“ Genau dies ist bei Computern mit Cache-Speicher der Fall, von denen eines der frühesten kommerziellen Beispiele das IBM System/360 Model 85 war. Im Model 85 waren alle Adressen echte Adressen, die sich auf den Hauptkernspeicher bezogen. Ein für den Benutzer unsichtbarer Halbleiter-Cache-Speicher hielt den Inhalt von Teilen des Hauptspeichers, der von dem aktuell ausgeführten Programm verwendet wird. Dies ist genau analog zu Güntschs System, das als Mittel zur Verbesserung der Leistung konzipiert wurde, anstatt die Probleme der Multiprogrammierung zu lösen.

Das erste echte virtuelle Speichersystem wurde an der University of Manchester implementiert , um ein einstufiges Speichersystem als Teil des Atlas-Computers zu schaffen . Es verwendete einen Paging- Mechanismus, um die virtuellen Adressen, die dem Programmierer zur Verfügung standen, auf den realen Speicher abzubilden, der aus 16.384 Wörtern des primären Kernspeichers mit zusätzlichen 98.304 Wörtern des sekundären Trommelspeichers bestand . Der erste Atlas wurde 1962 in Auftrag gegeben, aber bis 1959 wurden funktionierende Prototypen des Paging entwickelt. 1961 brachte die Burroughs Corporation den ersten kommerziellen Computer mit virtuellem Speicher, den B5000 , mit Segmentierung statt Paging auf den Markt .

Bevor virtueller Speicher in Mainstream-Betriebssysteme implementiert werden konnte, mussten viele Probleme angegangen werden. Die dynamische Adressübersetzung erforderte teure und schwer zu bauende spezialisierte Hardware; anfängliche Implementierungen verlangsamten den Zugriff auf den Speicher geringfügig. Es gab Bedenken, dass neue systemweite Algorithmen, die Sekundärspeicher verwenden, weniger effektiv sein würden als zuvor verwendete anwendungsspezifische Algorithmen. 1969 war die Debatte über virtuellen Speicher für kommerzielle Computer beendet; Ein IBM- Forschungsteam unter der Leitung von David Sayre zeigte, dass ihr virtuelles Speicher-Overlay-System durchweg besser funktionierte als die besten manuell gesteuerten Systeme. In den 1970er Jahren bot die IBM 370-Serie mit ihren auf virtuellem Speicher basierenden Betriebssystemen Geschäftsanwendern die Möglichkeit, mehrere ältere Systeme auf weniger, leistungsstärkere Mainframes mit verbessertem Preis-Leistungs-Verhältnis zu migrieren. Der erste Minicomputer , der virtuellen Speicher einführte, war der norwegische NORD-1 ; Während der 1970er Jahre implementierten andere Minicomputer virtuellen Speicher, insbesondere VAX- Modelle, auf denen VMS ausgeführt wurde .

Virtueller Speicher wurde mit dem geschützten Modus des Intel 80286- Prozessors in die x86- Architektur eingeführt , aber seine Segment-Swapping-Technik skalierte schlecht auf größere Segmentgrößen. Der Intel 80386 führte Paging-Unterstützung unterhalb der bestehenden Segmentierungsschicht ein , wodurch die Page-Fault-Ausnahme ohne Doppelfehler mit anderen Ausnahmen verkettet werden kann . Das Laden von Segmentdeskriptoren war jedoch eine kostspielige Operation, die Betriebssystementwickler dazu veranlasste, sich ausschließlich auf das Paging zu verlassen und nicht auf eine Kombination aus Paging und Segmentierung.

Ausgelagerter virtueller Speicher

Nahezu alle aktuellen Implementierungen von virtuellem Speicher unterteilen einen virtuellen Adressraum in Seiten , Blöcke von zusammenhängenden virtuellen Speicheradressen. Seiten auf modernen Systemen sind normalerweise mindestens 4 Kilobyte groß; Systeme mit großen virtuellen Adressbereichen oder Mengen an realem Speicher verwenden im Allgemeinen größere Seitengrößen.

Seitentabellen

Seitentabellen werden verwendet, um die von der Anwendung gesehenen virtuellen Adressen in physikalische Adressen zu übersetzen, die von der Hardware verwendet werden, um Anweisungen zu verarbeiten; solche Hardware, die diese spezifische Übersetzung handhabt, wird oft als Speicherverwaltungseinheit bezeichnet . Jeder Eintrag in der Seitentabelle enthält ein Flag, das anzeigt, ob sich die entsprechende Seite im Realspeicher befindet oder nicht. Wenn sie sich im Realspeicher befindet, enthält der Seitentabelleneintrag die Realspeicheradresse, unter der die Seite gespeichert ist. Wenn ein Verweis auf eine Seite von der Hardware vorgenommen wird, wenn der Seitentabelleneintrag für die Seite zeigt an, dass es derzeit nicht in Realspeicher ist, stellt sich die Hardware einen Seitenfehler Ausnahme , die Paging - Supervisor - Komponente des Aufrufen Betriebssystem .

Systeme können eine Seitentabelle für das gesamte System, separate Seitentabellen für jede Anwendung und jedes Segment, einen Baum von Seitentabellen für große Segmente oder eine Kombination davon haben. Wenn nur eine Seitentabelle vorhanden ist, verwenden verschiedene gleichzeitig laufende Anwendungen verschiedene Teile eines einzigen Bereichs virtueller Adressen. Wenn mehrere Seiten- oder Segmenttabellen vorhanden sind, gibt es mehrere virtuelle Adressräume und gleichzeitige Anwendungen mit separaten Seitentabellen leiten an verschiedene reale Adressen um.

Einige frühere Systeme mit kleineren realen Speichergrößen, wie beispielsweise der SDS 940 , verwendeten Seitenregister anstelle von Seitentabellen im Speicher für die Adressübersetzung.

Paging-Supervisor

Dieser Teil des Betriebssystems erstellt und verwaltet Seitentabellen. Wenn die Hardware eine Seitenfehlerausnahme auslöst, greift der Paging-Supervisor auf den sekundären Speicher zu, gibt die Seite mit der virtuellen Adresse zurück, die zum Seitenfehler geführt hat, aktualisiert die Seitentabellen, um den physischen Ort der virtuellen Adresse widerzuspiegeln, und teilt dem Übersetzungsmechanismus mit, starten Sie die Anfrage erneut.

Wenn der gesamte physikalische Speicher bereits verwendet wird, muss der Paging-Supervisor eine Seite im Primärspeicher freigeben, um die eingelagerte Seite zu halten. Der Supervisor verwendet einen von einer Vielzahl von Seitenersetzungsalgorithmen, wie beispielsweise den zuletzt verwendeten , um zu bestimmen, welche Seite freizugeben ist.

Angepinnte Seiten

Betriebssysteme haben Speicherbereiche, die gepinnt sind (nie auf sekundären Speicher ausgelagert). Andere verwendete Begriffe sind gesperrte , fixierte oder verkabelte Seiten. Zum Beispiel Interrupt verlassen Mechanismen auf einem Array von Zeigern auf ihre Handler, wie E / A - Abschluss und Seitenfehler . Wenn die Seiten, die diese Zeiger enthalten, oder der Code, den sie aufrufen, auslagerbar wären, würde die Unterbrechungsbehandlung viel komplexer und zeitaufwendiger, insbesondere im Fall von Seitenfehlerunterbrechungen. Daher ist ein Teil der Seitentabellenstrukturen nicht auslagerungsfähig.

Einige Seiten können für kurze Zeiträume angeheftet werden, andere möglicherweise für längere Zeiträume und wieder andere müssen möglicherweise dauerhaft angeheftet werden. Zum Beispiel:

  • Der Paging-Supervisor-Code und die Treiber für sekundäre Speichergeräte, auf denen sich Seiten befinden, müssen permanent gepinnt werden, da sonst das Paging nicht einmal funktionieren würde, weil der erforderliche Code nicht verfügbar wäre.
  • Zeitabhängige Komponenten können gepinnt werden, um variable Paging-Verzögerungen zu vermeiden.
  • Datenpuffer , auf die direkt von Peripheriegeräten zugegriffen wird, die direkten Speicherzugriff oder E/A-Kanäle verwenden, müssen sich während des E/A-Vorgangs in gepinnten Seiten befinden, da solche Geräte und die Busse, an die sie angeschlossen sind, erwarten, dass Datenpuffer gefunden werden an physischen Speicheradressen; ungeachtet dessen, ob der Bus eine Speicherverwaltungseinheit für E/A hat , können Übertragungen nicht gestoppt werden, wenn ein Seitenfehler auftritt, und dann nicht wieder gestartet werden, wenn der Seitenfehler verarbeitet wurde.

In den Betriebssystemen von IBM für System/370 und Nachfolgesysteme ist der Begriff "fixiert", und solche Seiten können langfristig fixiert sein, können kurzfristig fixiert sein oder können nicht fixiert (dh seitenfähig) sein. Systemsteuerungsstrukturen sind oft langfristig fixiert (gemessen in Wanduhrzeit, dh in Sekunden gemessene Zeit, anstatt in Sekundenbruchteilen gemessene Zeit), während I/O-Puffer normalerweise kurzfristig fixiert sind (normalerweise in signifikanten weniger als die Uhrzeit der Wanduhr, möglicherweise für mehrere zehn Millisekunden). Tatsächlich verfügt das OS über eine spezielle Einrichtung zum "schnellen Fixieren" dieser kurzfristigen festen Datenpuffer (das Fixieren erfolgt ohne Rückgriff auf einen zeitaufwendigen Supervisor-Call-Befehl ).

Multics verwendet den Begriff "verdrahtet". OpenVMS und Windows bezeichnen Seiten, die temporär nicht auslagerbar gemacht wurden (wie bei I/O-Puffern), als "gesperrt" und einfach "nicht auslagerbar" für diejenigen, die nie auslagerbar sind. Die Single UNIX Specification verwendet auch den Begriff "locked" in der Spezifikation für , ebenso wie die Manpages auf vielen Unix-ähnlichen Systemen. mlock()mlock()

Virtuell-realer Betrieb

In OS/VS1 und ähnlichen Betriebssystemen werden einige Teile des Systemspeichers im "virtuell-realen" Modus verwaltet, der als "V=R" bezeichnet wird. In diesem Modus entspricht jede virtuelle Adresse der gleichen realen Adresse. Dieser Modus wird für Interrupt- Mechanismen, für den Paging-Supervisor und die Page-Tabellen in älteren Systemen und für Anwendungsprogramme verwendet, die ein nicht standardmäßiges E/A-Management verwenden. IBMs z/OS hat beispielsweise 3 Modi (virtuell-virtuell, virtuell-real und virtuell-fest).

Prügel

Wenn Paging und Seitenstehlen verwendet werden, kann ein als " Thrashing " bezeichnetes Problem auftreten, bei dem der Computer unangemessen viel Zeit damit verbringt, Seiten zu und von einem Sicherungsspeicher zu übertragen, wodurch die nützliche Arbeit verlangsamt wird. Der Arbeitssatz einer Aufgabe ist die Mindestmenge an Seiten, die im Arbeitsspeicher vorhanden sein sollte, damit sie nützliche Fortschritte macht. Thrashing tritt auf, wenn nicht genügend Speicher verfügbar ist, um die Arbeitssätze aller aktiven Programme zu speichern. Das Hinzufügen von echtem Speicher ist die einfachste Reaktion, aber eine Verbesserung des Anwendungsdesigns, der Planung und der Speichernutzung kann hilfreich sein. Eine andere Lösung besteht darin, die Anzahl der aktiven Tasks auf dem System zu reduzieren. Dies reduziert den Bedarf an Realspeicher, indem der gesamte Arbeitssatz eines oder mehrerer Prozesse ausgelagert wird.

Segmentierter virtueller Speicher

Einige Systeme, wie das Burroughs B5500, verwenden eine Segmentierung anstelle von Paging und unterteilen virtuelle Adressräume in Segmente variabler Länge. Eine virtuelle Adresse besteht hier aus einer Segmentnummer und einem Offset innerhalb des Segments. Der Intel 80286 unterstützt optional ein ähnliches Segmentierungsschema, wird aber selten verwendet. Segmentierung und Paging können zusammen verwendet werden, indem jedes Segment in Seiten unterteilt wird; Systeme mit dieser Speicherstruktur, wie zum Beispiel Multics und IBM System/38 , sind normalerweise Paging-vorherrschend, wobei die Segmentierung Speicherschutz bietet.

In den Intel 80386- und späteren IA-32- Prozessoren befinden sich die Segmente in einem 32-Bit- linearen, ausgelagerten Adressraum. Segmente können in diesen Bereich hinein und aus ihm heraus bewegt werden; Seiten dort können in und aus dem Hauptspeicher "pagen", wodurch zwei Ebenen des virtuellen Speichers bereitgestellt werden; Wenn überhaupt, tun dies nur wenige Betriebssysteme und verwenden stattdessen nur Paging. Frühe nicht hardwareunterstützte x86-Virtualisierungslösungen kombinierten Paging und Segmentierung, da x86-Paging nur zwei Schutzdomänen bietet, während ein VMM, Gastbetriebssystem oder Gastanwendungsstack drei benötigt. Der Unterschied zwischen Paging- und Segmentierungssystemen besteht nicht nur in der Speicheraufteilung; Die Segmentierung ist für Benutzerprozesse als Teil der Semantik des Speichermodells sichtbar. Anstelle eines Speichers, der wie ein einzelner großer Raum aussieht, ist er daher in mehrere Räume strukturiert.

Dieser Unterschied hat wichtige Konsequenzen; Ein Segment ist keine Seite mit variabler Länge oder eine einfache Möglichkeit, den Adressraum zu verlängern. Die Segmentierung, die ein einstufiges Speichermodell bereitstellen kann, bei dem es keine Unterscheidung zwischen Prozessspeicher und Dateisystem gibt, besteht nur aus einer Liste von Segmenten (Dateien), die in den potenziellen Adressraum des Prozesses abgebildet werden.

Dies ist nicht dasselbe wie die Mechanismen, die von Aufrufen wie mmap und Win32 's MapViewOfFile bereitgestellt werden, da Zeiger zwischen Dateien nicht funktionieren, wenn Dateien an semi-beliebigen Orten zugeordnet werden. In Multics wird eine Datei (oder ein Segment aus einer Multi-Segment-Datei) einem Segment im Adressraum zugeordnet, sodass Dateien immer an einer Segmentgrenze zugeordnet werden. Der Linkage-Abschnitt einer Datei kann Zeiger enthalten, für die ein Versuch, den Zeiger in ein Register zu laden oder einen indirekten Verweis über ihn zu erstellen, einen Trap verursacht. Der unaufgelöste Zeiger enthält eine Angabe des Namens des Segments, auf das sich der Zeiger bezieht, und einen Offset innerhalb des Segments; Der Handler für den Trap bildet das Segment in den Adressraum ab, fügt die Segmentnummer in den Zeiger ein, ändert das Tag-Feld im Zeiger, sodass er keinen Trap mehr verursacht, und kehrt zu dem Code zurück, in dem der Trap aufgetreten ist, und führt erneut aus die Anweisung, die die Falle verursacht hat. Dies macht einen Linker vollständig überflüssig und funktioniert, wenn verschiedene Prozesse dieselbe Datei an verschiedenen Stellen in ihren privaten Adressräumen abbilden.

Adressraum-Swapping

Einige Betriebssysteme ermöglichen das Austauschen ganzer Adressräume zusätzlich zu den Möglichkeiten, die sie für Paging und Segmentierung haben. In diesem Fall schreibt das Betriebssystem diese Seiten und Segmente, die sich derzeit im Realspeicher befinden, in Auslagerungsdateien. Bei einem Einlagerungsvorgang liest das Betriebssystem die Daten aus den Auslagerungsdateien zurück, liest jedoch nicht automatisch Seiten zurück, die zum Zeitpunkt des Auslagerungsvorgangs ausgelagert wurden.

IBMs MVS von OS/VS2 Release 2 bis z/OS ermöglicht das Markieren eines Adressraums als nicht austauschbar; Dadurch werden keine Seiten im Adressraum angeheftet. Dies kann für die Dauer eines Jobs durch Eingabe des Namens eines geeigneten Hauptprogramms in die Programmeigenschaftentabelle mit einem nicht austauschbaren Flag erfolgen. Darüber hinaus kann ein privilegierter Code einen Adressraum unter Verwendung eines SYSEVENT Supervisor Call-Befehls (SVC) vorübergehend unaustauschbar machen ; Bestimmte Änderungen an den Eigenschaften des Adressraums erfordern, dass das Betriebssystem ihn mit SYSEVENT TRANSWAP auslagert und dann wieder einlagert.

Das Auslagern erfordert nicht unbedingt Speicherverwaltungshardware, wenn beispielsweise mehrere Jobs in denselben Speicherbereich ein- und ausgelagert werden.

Siehe auch

Anmerkungen

Verweise

Weiterlesen

  • Hennessy, John L.; und Patterson, David A.; Computerarchitektur, ein quantitativer Ansatz ( ISBN  1-55860-724-2 )

Externe Links