2013-10-13 23 views
24

Also mein Verständnis ist, dass jeder Prozess seinen eigenen virtuellen Speicherbereich von 0x0 bis 0xFF .... F hat. Diese virtuellen Adressen entsprechen Adressen im physikalischen Speicher (RAM). Warum ist dieses Abstraktionsniveau hilfreich? Warum nicht einfach die direkten Adressen benutzen?Warum brauchen wir virtuellen Speicher?

Ich verstehe, warum Paging ist vorteilhaft, aber nicht virtuellen Speicher.

Antwort

29

Es gibt viele Gründe, dies zu tun:

  • Wenn Sie eine kompilierte binäre haben, jede Funktion eine feste Adresse im Speicher hat und die Montageanleitung Funktionen die Adresse fest codierten haben anzurufen. Wenn kein virtueller Speicher vorhanden war, konnten zwei Programme nicht gleichzeitig in den Speicher geladen und ausgeführt werden, da sie möglicherweise unterschiedliche Funktionen unter derselben physischen Adresse hätten.

  • Wenn zwei oder mehr Programme gleichzeitig ausgeführt werden (oder zwischen ihnen umgeschaltet werden) und direkte Adressen verwenden, kann ein Speicherfehler in einem Programm (z. B. das Lesen eines ungültigen Zeigers) den verwendeten Speicher zerstören durch den anderen Prozess, mehrere Programme aufgrund eines einzigen Absturzes herunterzunehmen.

  • In ähnlicher Weise gibt es ein Sicherheitsproblem, bei dem ein Prozess vertrauliche Daten in einem anderen Programm lesen könnte, indem er erraten würde, welche physikalische Adresse er hätte und nur direkt lesen würde.

  • Wenn Sie versuchen, die beiden oben genannten Probleme durch Paging aus den gesamten Speicher für einen Prozess zu bekämpfen, wenn sie einem zweiten Prozess wechseln, entstehen Sie massiven Performance-Einbußen, weil Sie zu Seite alle Speicher haben könnte.

  • Je nach Hardware sind einige Speicheradressen für physische Geräte (z. B. Video-RAM, externe Geräte usw.) reserviert. Wenn Programme kompiliert werden, ohne zu wissen, dass diese Adressen signifikant sind, können sie physisch verstopft werden. in Geräten durch Lesen und Schreiben in ihren Speicher. Schlimmer noch, wenn dieser Speicher schreibgeschützt oder schreibgeschützt ist, schreibt das Programm möglicherweise Bits in eine Adresse, in der Erwartung, dass sie dort bleiben und dann verschiedene Werte zurücklesen.

Hoffe, das hilft!

+0

Das hilft viel. Aber was ist mit Fragmentierung? Bestimmte Dinge (beispielsweise ein Array) müssen zusammenhängend zugewiesen werden. Wenn ein Array zusammenhängend im virtuellen Speicher zugewiesen wird, bedeutet das, dass es auch im physischen Speicher zusammenhängend ist? Oder tritt dieses Fragmentierungsniveau nicht auf? – user2079802

+2

@ user2079802- Nicht unbedingt. Wenn sich das Array über mehrere Seiten virtuellen Speichers erstreckt, kann das Betriebssystem diese Seiten vollständig unterschiedlichen Bereichen des physischen Speichers zuordnen. Es liegt am Betriebssystem, sicherzustellen, dass dies nicht zu Leistungsproblemen führt. – templatetypedef

+0

Eine andere Sache. Wenn Sie die Adresse einer Variablen erhalten, zum Beispiel mit & in C, ist das ihre virtuelle Adresse, richtig? – user2079802

-1

Der Hauptzweck des virtuellen Speichers ist Multitasking und das Ausführen großer Programme. Es wäre großartig, physischen Speicher zu verwenden, weil es viel schneller wäre, aber RAM-Speicher ist viel teurer als ROM.

Viel Glück!

+0

Siehe den OP-Kommentar zum Paging. –

+2

Diese Antwort ist falsch. Es verwirrt den virtuellen Speicher mit dem Swapping. –

8

Kurzantwort: Programmcode und Daten, die für die Ausführung eines Prozesses erforderlich sind, müssen im Hauptspeicher ausgeführt werden, aber der Hauptspeicher ist möglicherweise nicht groß genug, um die Anforderungen eines gesamten Prozesses zu erfüllen.

Zwei Vorschläge

(1) einen sehr großen Hauptspeicher mit einem beliebigen Bedarf an Speicherzuweisung zu erleichtern: es wegen der sehr hohen Kosten nicht machbar ist.

(2) Virtueller Speicher: Erlaubt die Ausführung von Prozessen, die möglicherweise nicht vollständig im Speicher vorhanden sind, durch automatische Speicherzuweisung auf Anfrage. Der Begriff virtueller Speicher bezieht sich auf die Abstraktion der Trennung von LOGISCHEM Speicher - Speicher im Prozess gesehen - vom PHYSISCHEN Speicher - Speicher, wie er vom Prozessor gesehen wird.Aufgrund dieser Trennung muss der Programmierer nur den logischen Speicherplatz berücksichtigen, während das Betriebssystem zwei oder mehr Ebenen des physischen Speicherplatzes verwaltet.

Mehr:

frühe Computer-Programmierer Programme in Abschnitte unterteilt, die in dem Hauptspeicher für einen Zeitraum von Verarbeitungszeit übertragen wurden. Als höhere Sprachen populär wurden, litt die Effizienz komplexer Programme unter schlechten Overlay-Systemen. Das Problem der Speicherzuweisung wurde komplexer.

Zwei Theorien zur Lösung des Problems der ineffizienten Speicherverwaltung entstanden - statische und dynamische Zuordnung. Bei der statischen Zuweisung wird davon ausgegangen, dass die Verfügbarkeit von Speicherressourcen und die Speicherreferenzzeichenfolge eines Programms vorhergesagt werden kann. Bei der dynamischen Zuweisung wird die Speicherbelegung erhöht und verringert sich mit den tatsächlichen Programmanforderungen und nicht mit der Vorhersage des Speicherbedarfs.

Programmziele und Maschinenfortschritte in den 60er Jahren machten die Voraussagen für die statische Zuordnung schwierig, wenn nicht gar unmöglich. Daher wurde die dynamische Zuweisungslösung allgemein akzeptiert, aber Meinungen zur Implementierung waren noch geteilt.

Eine Gruppe glaubte, dass der Programmierer weiterhin für die Speicherzuweisung verantwortlich sein sollte, die von Systemaufrufen zur Zuweisung oder Freigabe von Speicher ausgeführt würde. Die zweite Gruppe unterstützte die automatische Speicherzuweisung, die vom Betriebssystem durchgeführt wurde, aufgrund der zunehmenden Komplexität der Speicherzuweisung und der sich abzeichnenden Wichtigkeit des Multiprogrammierens.

Im Jahr 1961 schlugen zwei Gruppen einen einstufigen Speicher vor. Ein Vorschlag verlangte einen sehr großen Hauptspeicher, um die Notwendigkeit einer Speicherzuweisung zu verringern. Diese Lösung war aufgrund sehr hoher Kosten nicht möglich. Der zweite Vorschlag wird als virtueller Speicher bezeichnet.

CNE/modules/vm/grün/defn.html