Wie vergrößert virtueller Speicher tatsächlich den Speicherplatz?


70

Ich verstehe, dass der virtuelle Speicher das Programm täuscht, indem er mehr Speicher anzeigt, als tatsächlich verfügbar ist.

Letztendlich muss es aber die logische Adresse auf die tatsächlich physikalische Adresse abbilden. Wie erhöht es nun das Gedächtnis?


12
Das ist das alte Konzept. Die ursprüngliche Motivation für den virtuellen Speicher war eine Form der Speicherverwaltung, um einen Adressraum bereitzustellen, der größer als der physische Speicher ist. In dieser Zeit war der Speicher jedoch niedrig und sehr teuer. Heutzutage liegt der Hauptgrund für die Verwendung des virtuellen Speichers in der Prozesssicherheit.
Sägemehl

2
"Wie erhöht es nun den Speicher?" Das tut es nicht. Die Anwendung kennt den physischen Speicher des Systems nicht. Sie kennt nur den virtuellen Speicher.
Dies

2
Denken Sie daran, dass virtuelle Speichersysteme ziemlich intelligent sind. Wenn n Prozesse dieselbe Nur-Lese-Seite haben, können alle n Prozesse dieselbe Seite des physischen Speichers verwenden.
Eric Lippert

65
Stellen Sie sich den virtuellen Speicher nicht als Narren vor . Speicher ist die abstrakte Fähigkeit, Daten zu speichern und abzurufen . Der virtuelle Speicher bietet eine Implementierung für diese Abstraktion. Dass ein Teil dieser Abstraktion durch RAM und ein anderer Teil durch Festplatte gesichert wird, ist ein Implementierungsdetail der Abstraktion.
Eric Lippert

4
@HagenvonEitzen Ich bin mir nicht sicher, wie der Speicher "immer" auf der Festplatte ist ... abgesehen von Seiten, die ursprünglich von der Festplatte gelesen wurden, kann der Inhalt einer Seite niemals auf der Festplatte sein, und dies gilt insbesondere für Seiten, die im Speicher abgelegt sind, z weil es für die Kernelfunktionalität entscheidend ist.
Michael

Antworten:


116

Es erhöht das physische Gedächtnis überhaupt nicht. Sein Zweck ist etwas ganz anderes. Sie kann andere Sicherungsspeicher zur Verfügung stellen, die es Programmen ermöglichen, mehr Speicher zu verwenden, als physisch verfügbar ist.

Virtueller Speicher wird verwendet, um Prozesse voneinander zu trennen und zu isolieren und um den Speicherzugriff auf alternative Speicherorte umzuleiten.

Mit dem virtuellen Speicher kann das System jedem Prozess einen eigenen Speicherplatz zuweisen, der von anderen Prozessen isoliert ist. Mit Programmen, die effektiv in ihrem eigenen Bereich arbeiten, erhalten sie vollen Zugriff auf den gesamten Adressraum, anstatt sich um andere Programme kümmern zu müssen, die möglicherweise ebenfalls dieselben Adressen verwenden müssen. Dies hat den Nebeneffekt, dass Zuverlässigkeit und Sicherheit erhöht werden, da sich Prozesse nicht leicht gegenseitig stören können.

Der virtuelle Speicherplatz einer Anwendung wird nach Bedarf aufgebaut. Eine Anwendung scheint sich (für sich) in einem einzigen zusammenhängenden Speicherblock zu befinden, könnte jedoch tatsächlich vollständig über den physischen Speicher verstreut sein.

Der virtuelle Speicher ermöglicht auch das Abfangen und Umleiten von Speicherzugriffen, wodurch Funktionen wie eine Auslagerungsdatei verwendet werden können. Dies bedeutet, dass wir Teile des Speichers, die in letzter Zeit nicht auf die Festplatte ausgelagert wurden, verschieben und einen Zeiger einrichten können, der besagt, dass sich dieser Speicherblock in Datei x an Position y befindet, und dann den physischen Speicher freigeben können Bereich für die Verwendung durch eine andere Anwendung. Wenn eine Anwendung diesen Speicher benötigt, kann er von der Festplatte zurückgelesen, an einer anderen Stelle des physischen Arbeitsspeichers (möglicherweise anders als zuvor) abgelegt und wieder an derselben Stelle des virtuellen Speichers wie zuvor zugeordnet werden.

In der gleichen Weise wie die Auslagerungsdatei verwendet wird, kann der virtuelle Speicher auch dem Betriebssystem ermöglichen, das effektive "verzögerte" Laden von gemeinsam genutzten Bibliotheken für ein Programm durchzuführen. Wenn das Hauptprogramm dem Betriebssystem mitteilt, dass es eine bestimmte Bibliothek verwenden möchte, kann das Betriebssystem Zeit sparen, indem es die Anforderungen für die Bibliothek überprüft und den Speicherplatz im virtuellen Speicherbereich für die Anwendung zuweist, anstatt die gesamte Bibliothek zu laden Darin können Sie das Laden von Seiten der Bibliothek von der Festplatte verschieben, bis sie tatsächlich benötigt werden. Auf diese Weise werden die einzigen Teile der Bibliothek, die in den RAM geladen werden, die Teile, die tatsächlich vom Programm verwendet werden, Teile, die niemals verwendet werden, werden niemals geladen und verschwenden daher keinen RAM.

Mit diesen Techniken verbessern wir die Stabilität des Systems und ermöglichen es, dass mehr Prozesse auf engstem Raum ablaufen, ohne dass sie sich gegenseitig übermäßig beeinflussen. Es erhöht nicht das Gedächtnis, sondern ermöglicht es uns, das, was wir haben, effektiver zu nutzen.

Die Auslagerungsdatei wird durch virtuelle Speichersysteme aktiviert, aber in der Vergangenheit war verwirrt wie sein der virtuelle Speicher.


Kommentare sind nicht für längere Diskussionen gedacht. Diese Unterhaltung wurde in den Chat verschoben .
Sathyajith Bhat

21

Erklärung des Laien

Das System muss jede virtuelle Adresse der physischen Adresse zuordnen, wenn dieser Speicher verwendet wird, aber nicht der gesamte Speicher wird gleichzeitig verwendet . Angenommen, Ihr Browser verfügt über 20 Registerkarten, von denen jede 1 GB Speicherplatz beansprucht. In einem Betriebssystem ohne Unterstützung für virtuellen Speicher benötigen Sie 20 GB RAM, damit dies funktioniert. Der Trick ist, dass Sie nicht alle 20 Registerkarten gleichzeitig durchsuchen. Das Betriebssystem mit virtuellem Speicher ermöglicht es Ihnen, Ihren Browser mit nur ein paar GB RAM so zu verwenden und inaktive Registerkarten auf die Festplatte zu verschieben.

Komplexere Aspekte

Der virtuelle Speicher wird nicht ausschließlich zum Austauschen verwendet. Das Hauptziel besteht darin, eine RAM-Fragmentierung zu vermeiden, was auf Systemen ohne virtuelle Speicherverwaltung ein großes Problem darstellt: Sie haben zwar 1 GB RAM frei, aber wenn es in Stücken von 10 MB vorliegt, kann eine Anwendung, die 100 MB anfordert, nicht funktionieren .

Im Laufe der Zeit wurde der virtuelle Speicher noch häufiger genutzt, vor allem durch zufälligen Dateizugriff: Viele Anwendungen wie Datenbanken werden schmerzhaft langsam, wenn sie gezwungen sind, Dateien nacheinander zu lesen, und arbeiten viel schneller, wenn das Betriebssystem vorgibt, dass sich die gesamte Datei in (virtual) befindet ) Arbeitsspeicher und Optimierung von Festplatten-E / A und Caching anhand von Zugriffsmustern.


9
Es ist traurig, dass wir in einer Welt leben, in der jeder Browser-Tab 1 GB Speicher benötigt
bis zum

9
@tbodt Ich beschuldige die alten Ägypter. Wenn sie nur wüssten, was sie tun, indem sie diese nervigen Katzen domestizieren!
Dmitry Grigoryev

@tbodt Es ist auch ein bisschen übertrieben. Mein Browser mit 8 geöffneten Registerkarten benötigt nur 500 MB Speicher.
Random832

2
@ Random832 Sicher ist es eine Übertreibung, obwohl ich mir nicht sicher bin, ob es eine Grenze zwischen Übertreibung und Zukunftssicherheit gibt. Mein erster PC hatte 32 MB RAM und ich konnte problemlos 8 Registerkarten in Opera öffnen, ohne merklich zu tauschen. Jetzt sind es 500 MB, in weiteren 20 Jahren könnten es auch 8 GB sein.
Dmitry Grigoryev

5

Virtueller Speicher vergrößert den Speicher nicht im Sinne des tatsächlichen Hinzufügens von mehr Hauptspeicherhardware. Aber es KANN den Bereich der verwendbaren Adressen vergrößern . Man könnte also ein laufendes Programm haben, das aus einem Codesegment und einem Datensegment (Stack & Heap) besteht, und beide könnten einen Bereich von virtuellen Adressen belegen, der größer ist als der Bereich von physischen Adressen, der durch den physisch-realen Speicherplatz von bereitgestellt wird Maschine. Der Trick ist, dass nur ein kleiner Teil dieser virtuellen Adressen zu einem bestimmten Zeitpunkt vom physischen Hauptspeicher gesichert wird (aber letztendlich wird alles vom Festplattenspeicher gesichert) . Dies funktioniert aufgrund des Phänomens der Referenzlokalität: Zu jedem Zeitpunkt werden nur die Anweisungen in einem oder mehreren kleinen zusammenhängenden Abschnitten des Programmsegments ausgeführt, und es werden nur Daten in einem oder mehreren kleinen zusammenhängenden Abschnitten des Datensegments verarbeitet [natürlich ist das Verhalten tatsächlich komplexer , aber es folgt diesem Muster für einen großen Teil der Zeit]


4

Ich verstehe, dass der virtuelle Speicher das Programm täuscht, indem er mehr Speicher anzeigt, als tatsächlich verfügbar ist.

Die ursprüngliche Motivation für den virtuellen Speicher war eine Form der Speicherverwaltung, um einen Adressraum bereitzustellen, der größer als der physische Speicher ist.
Die Software könnte den gesamten Adressraum der CPU nutzen (z. B. 2 ^ 32-Adressraum), während der tatsächlich installierte physische Speicher nur einen Bruchteil dieser Anzahl ausmacht.
Große Programme können auf Computern mit virtuellem Speicher portiert werden, ohne dass große (installierte) Speicheranforderungen erforderlich sind.
Diese Verwendung von virtuellem Speicher war früher bei Großrechnern und Ferritkernspeichern (die physikalisch und teuer mit geringer Dichte waren) üblich.

Letztendlich muss es aber die logische Adresse auf die tatsächlich physikalische Adresse abbilden. Wie erhöht es nun das Gedächtnis?

Der virtuelle Speicher wurde aus einer einfachen Technik entwickelt, um mehr Adressraum für das Programm bereitzustellen.
Der virtuelle Speicher ist eine Schlüsselkomponente für die Sicherheit jedes Prozesses in modernen Betriebssystemen, sodass ein Prozess keinen anderen Prozess stören oder durch einen anderen Prozess gefährdet werden kann.
Multiprocessing (nicht zu verwechseln mit Multiprocess ors ) mit virtuellem Speicher bietet dem System jedoch mehr sichtbaren Speicher als physischen Speicher.

Jeder erstellte Prozess verfügt über einen eigenen virtuellen Adressraum, dh einen eigenen virtuellen Speicher.
Die Menge an physischem Speicher, die für jeden Prozess tatsächlich verwendet (und dem virtuellen Speicher zugeordnet) wird, ist dynamisch. Normalerweise wird nur der virtuelle Speicher, der den Code (alias Text) und die Datenseiten / -segmente zur Ausführung des Prozesses enthält, dem physischen Speicher (alias im Speicher) zugeordnet.

Nicht notwendiger Code (da er derzeit nicht ausgeführt wird) und Daten (da er nicht referenziert / verarbeitet wird) müssen nicht ständig im Arbeitsspeicher vorhanden sein. Die Code- und / oder Datenseiten / -segmente können in den Sicherungsspeicher "ausgelagert" werden (z. B. Speicherplatz oder Auslagerungsdatei auf einer Festplatte oder SSD) und später nach Bedarf "eingelagert" werden (auch "on demand" genannt). ).

Der virtuelle Speicher ermöglicht die effiziente Nutzung des endlichen physischen Speichers unter zahlreichen Prozessen, von denen jeder über einen eigenen geschützten virtuellen Adressraum verfügt. Die Summe dieser virtuellen Speicher ist normalerweise größer als der installierte physische Speicher.
Der "erhöhte Speicher" ist nun aus der Systemperspektive und nicht nur aus der Programmperspektive.


3

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.


2

Dies geschieht durch temporäre Karteneinträge.

Wenn ein Programm auf eine logische Adresse zugreift, sucht die CPU in der Karte nach einer entsprechenden physikalischen Adresse. Wenn es gefunden wird, wird der Speicherzugriff wie erwartet fortgesetzt. Wenn es nicht gefunden wird, muss eine physikalische Adresse zugewiesen und der Inhalt aus einem anderen Speicher geladen werden - dem "Swap Space". Wenn jeder physischen Adresse bereits eine logische Adresse zugewiesen wurde, müssen einige logische Adressen "ausgelagert" werden (ihr Inhalt wird in den Auslagerungsbereich zurückgespeichert), um physische Adressen verfügbar zu machen.

Der maximal zugewiesene Speicher ist die Größe des Auslagerungsspeichers, der viel größer sein kann als der installierte Speicher. Es kann hilfreich sein, den Auslagerungsspeicher als "echten" Speicher und den Arbeitsspeicher als Hochgeschwindigkeits-Cache für den Auslagerungsspeicher zu betrachten.

(Dies ist alles andere als eine gründliche Beschreibung. Sie soll die unmittelbare Frage beantworten, ohne auf relevante, aber unnötige Details einzugehen.)


1

Das Grundkonzept beruht auf der Tatsache, dass eine moderne CPU Übersetzungstabellen verwalten kann, die verfolgen, "welche Adressbereiche einem bestimmten Prozess zugewiesen wurden und welche physikalischen Adressen (denken Sie an A00..Axx-Leitungen auf einem Speicherbus), falls vorhanden , werden derzeit verwendet, um die Daten tatsächlich zu speichern. "IF ANY", da "none at all" ein möglicher und akzeptabler Zustand ist: In diesem Fall wird eine Fehlerbedingung (ein sogenannter "Seitenfehler") auf Hardwareebene ausgelöst - und dieser Fehler löst einen Handler auf Betriebssystemebene aus, der z. B. Speicherinhalte, die in eine Auslagerungsdatei geschrieben wurden, an einen beliebigen freien Speicherort im physischen Speicher zurückladen (bei einem Lesevorgang) oder einen tatsächlichen Speicherort zum Ablegen von Inhalten finden kann (in im Falle eines Schreibvorgangs) die oben genannte Übersetzungstabelle aktualisieren,und nur dann Handsteuerung zurück zu dem Prozess, der versucht hat, auf diesen Speicher zuzugreifen.


1

Virtueller Speicher:

1) Ermöglicht das Zuordnen eines großen virtuellen Adressraums zu einer kleineren Menge an physischem Speicher, wobei überschüssiger Speicher auf Festplatte oder SSD oder zukünftig auf NVRAM und andere Geräte "ausgelagert" wird.

2) ermöglicht das Zuordnen eines größeren virtuellen Adressraums (z. B. 64 Bit) zu einem kleineren physischen Adressraum (z. B. 32 oder 64 Bit)

3) Ermöglicht die Zuordnung eines kleineren virtuellen Adressraums (z. B. 32 Bit) zu einem größeren physischen Adressraum (z. B. 40 Bit), wodurch ältere Anwendungen die Vorteile eines physischeren DRAM nutzen können.

4) Ermöglicht, dass physischer Speicher, der im physischen Adressraum fragmentiert und nicht zusammenhängend ist, im virtuellen Adressraum zusammenhängend wird.

5) ermöglicht es Prozessen, ihren eigenen virtuellen Adressraum zuzuweisen und somit voneinander isoliert zu sein.

6) ermöglicht es verschiedenen virtuellen Adressen, die dieselben Datenwerte gemeinsam nutzen, eine einzelne physische Seite zuzuweisen.

Dies kann innerhalb eines einzelnen Prozesses oder Betriebssystems geschehen - die meisten von BSD UNIX abgeleiteten Betriebssysteme verfügen über eine einzige schreibgeschützte Seite mit Nullen, die auf eine beliebige mit Nullen gefüllte virtuelle Seite abgebildet werden kann und Seite nicht geteilt und beschreibbar gemacht).

Dies kann zwischen Prozessen passieren - z. B. UNIX fork () erstellt untergeordnete Prozesse, die fast den gesamten virtuellen Speicher auf COW-Weise gemeinsam nutzen.

Dies kann zwischen Betriebssystemen passieren - z. B. können auf Gastbetriebssystemen auf einem Host für virtuelle Maschinen Seiten dedupliziert, die COW gemeinsam genutzt usw. werden.

7) Der virtuelle Speicher kann die Zuordnung von Teilen des virtuellen Adressraums zu Dateien oder zum Speicher anderer Prozessoren ermöglichen, sei es im selben Multiprozessorsystem oder über das Internet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.