2009-02-04 13 views
5

Die meisten der Literatur zu Virtual Memory weisen darauf hin, dass das Verständnis von Virtual Memory als Anwendungsentwickler mir helfen kann, seine leistungsfähigen Fähigkeiten zu nutzen. Ich war schon einige Zeit an der Entwicklung von Anwendungen für Linux beteiligt, kümmerte mich aber nicht um die Komplexität des virtuellen Speichers, während ich code. Fehle ich etwas? Wenn ja, erläutern Sie, wie ich die Funktionsweise von Virtual Memory nutzen kann. Sonst lass es mich wissen, wenn ich mit der Frage keinen Sinn mache!Virtueller Speicher

Antwort

4

Nun, das Konzept ist eigentlich ziemlich einfach. Ich werde es hier nicht wiederholen, aber Sie sollten sich ein Buch über OS Design holen und es wird dort erklärt. Ich empfehle die "Operating System Concepts" von Silberscahtz und Galvin - das war es, was ich an der Universität verwenden musste und es ist gut.

Ein paar Dinge, die ich mir vorstellen kann, was Wissen Sie virtuellen Speicher geben, sind vielleicht:

  • Learning-Speicher auf Seite Grenzen zuzuweisen Abfall zu vermeiden (gilt nur für den virtuellen Speicher, nicht die übliche Haufen/Stapelspeicher);
  • Sperren Sie einige Seiten im RAM, damit sie nicht auf die Festplatte wechseln;
  • Guardian Seiten;
  • Reservieren eines Adressbereichs und späteres Übertragen des tatsächlichen Speichers;
  • Vielleicht mit dem NX (nicht ausführbare) Bit, um die Sicherheit zu erhöhen, aber ich bin nicht sicher auf diesem.
  • PAE für Zugriff auf> 4 GB auf einem 32-Bit-System.

Dennoch würden alle diese Dinge nur in ganz bestimmten Szenarien verwendet werden. In der Tat müssen 99% der Anwendungen sich nicht darum kümmern.

Hinzugefügt: Das heißt, es ist definitiv gut, all diese Dinge zu wissen, so dass Sie solche Szenarien identifizieren können, wenn sie entstehen. Passen Sie nur auf - mit Macht kommt Verantwortung.

+0

Auch; Der virtuelle Speicher bietet die Möglichkeit, die Fragmentierung des physischen Speichers zu maskieren. – RandomNickName42

+0

@ RandomNickName42 - Es wird auch für Memory-Mapped-Dateien und teilweise Laden von EXE /. DLL-Dateien verwendet, aber zu wissen, dass nicht viel im Alltag hilft - außer ein wenig mehr über das komplexe Biest, das der heutige Computer ist zu verstehen. –

1

Für die meisten Anwendungen kann der Programmierer die Funktionsweise des Computerspeichers ohne Schaden nicht bemerken. Aber manchmal - zum Beispiel wenn Sie den Fußabdruck Ihres Programms verbessern wollen - müssen Sie den Speicher selbst manipulieren. In solchen Situationen ist es wichtig zu wissen, wie der Speicher funktioniert.

Mit anderen Worten, obwohl Sie in der Tat ohne es überleben können, wird das Lernen über virtuelles Gedächtnis Sie nur zu einem besseren Programmierer machen.

Und ich würde denken, die Wikipedia article kann ein guter Anfang sein.

1

In 9 von 10 Fällen müssen Sie sich keine Gedanken über die Verwaltung des virtuellen Speichers machen. Das ist die Aufgabe des Kernels. Kann in einigen hoch spezialisierten Anwendungen müssen Sie um sie herum zwicken.

Ich kenne einen Artikel, der über Computerspeicherverwaltung mit Schwerpunkt auf Linux spricht [http://lwn.net/Articles/250967]. Hoffe das hilft.

2

Es ist eine vage Frage.

Die Art und Weise, wie Sie virtuellen Speicher verwenden können, ist hauptsächlich durch die Verwendung von Speicher-Mapped-Dateien. Weitere Informationen finden Sie auf der Manpage mmap().

Obwohl Sie es wahrscheinlich implizit sowieso verwenden, da jede dynamische Bibliothek als eine zugeordnete Datei implementiert ist und viele Datenbankbibliotheken sie auch verwenden.

Die Schnittstelle, um zugeordnete Dateien aus höheren Programmiersprachen zu verwenden, ist oft ziemlich unpraktisch, was sie weniger nützlich macht.

Die wichtigsten Vorteile von Mapped-Dateien verwenden, sind:

  • kein Overhead Systemaufruf, wenn Teile der Datei zugreifen (dies könnte tatsächlich ein Nachteil sein, als ein Seitenfehler wahrscheinlich so viel Overhead hat sowieso, wenn es passiert)
  • Keine Notwendigkeit, Daten von OS-Puffer in Anwendungspuffer zu kopieren - dies kann die Leistung verbessern
  • Fähigkeit, Speicher zwischen Prozessen zu teilen.

Einige Nachteile sind:

  • 32-Bit-Maschinen leicht aus Adressraum laufen kann
  • Tricky Datei
  • keine einfache Möglichkeit, richtig erstreckt zu handhaben, um zu sehen, wie viele/welche Seiten derzeit resident (es gibt jedoch einige Möglichkeiten)
  • Nicht gut für Echtzeit-Anwendungen, da ein Seitenfehler eine IO-Anfrage verursachen kann, die den Thread blockiert (die Datei kann jedoch im Speicher gesperrt werden, aber nur wenn vorhanden genug).
1

Wenn Sie sich mit der Leistung befassen, ist es wichtig, die Speicherhierarchie zu verstehen.

Bei kleinen Datensätzen, die vollständig im physischen Speicher enthalten sind, müssen Sie sich um das Caching kümmern (der Zugriff auf den Speicher aus dem Cache ist viel schneller).

Wenn Sie mit großen Datenmengen arbeiten, die aufgrund fehlender physischer Speicher ausgelagert werden können, müssen Sie darauf achten, dass Ihre Zugriffsmuster lokalisiert bleiben.

Zum Beispiel, wenn Sie eine Matrix in C (int a[rows][cols]) deklarieren, wird es von Zeilen zugeordnet. Beim Scannen der Matrix müssen Sie also nach Zeilen und nicht nach Spalten suchen. Sonst werden Sie die gleichen Daten viele Male ein- und auslagern.

Ein weiteres Problem ist der Unterschied zwischen schmutzig und sauber im Speicher gehaltenen Daten. Bereinigungsdaten sind Informationen, die aus Dateien geladen werden, die nicht vom Programm geändert wurden. Das Betriebssystem kann Daten sauber puffern (möglicherweise abhängig davon, wie es geladen wurde), ohne es auf die Festplatte zu schreiben. Schmutzige Seiten müssen zuerst in die Auslagerungsdatei geschrieben werden.