Virtuelle und physische Adresszuordnung in 32-Bit-Windows

681
Aman Yadav

Korrigiere mich, dass ich falsch liege.

Q1) Ich verstehe, dass wir im 32-Bit-Modus einen virtuellen Adressraum von 4 GB erhalten. Dies liegt daran, dass 32-Bit-Windows nur 4 GB physischen Arbeitsspeicher unterstützen kann.

F2) Jeder Prozess erhält seinen eigenen privaten Adressraum von 4 GB. 2 GB Benutzermodus und 2 GB Kernel. Ordnet der Prozess seinen gesamten Code dem Benutzermodus zu, und die Betriebssystemkomponenten, die der Prozess benötigt, um mit dem Prozessor zu kommunizieren, um den Code auszuführen, werden im Kernelmodus geladen.

F3) Wenn ein Prozess einen eigenen privaten 4-GB-Speicherplatz erhält. Wenn ich 3 Prozess lade, beträgt der Adressraum insgesamt 12 GB. Habe ich ein Leistungsproblem, da ich nur 4 GB RAM habe?

Die virtuelle Adresse ist jedoch so ausgelegt, dass sie den Prozessbedarf bei weniger RAM erfüllt. SO meine eigentliche Frage: Wenn ein Prozess (eine einzelne Prozessanwendung) geladen wird, ordnet er den gesamten Code der virtuellen Adresse mit 4 GB zu, unabhängig davon, ob die Anwendung derzeit nur einen bestimmten Teil des gesamten Codes ausführt.

Was ich verstehe ist, dass, wenn ein Prozess gestartet wird, der gesamte Code in den virtuellen Adressraum des 2-GB-Benutzermodus geladen wird und die restlichen 2 GB OS-Kernel-Dateien laden. Wenn Sie nun Seitentabellen verwenden, wird die virtuelle Adresse im RAM und auf der Festplatte der physischen Adresse zugeordnet. Werden alle virtuellen 4-GB-Adressen dem physischen 4-GB-RAM zugeordnet und verbleiben in der Auslagerungsdatei? Wenn ich mich weigere, die Seitendatei zu verwenden, bedeutet dies, dass nur ein Prozess mit einer virtuellen Adresse von 4 GB unter 32-Bit-Betriebssystemen mit 4 GB ausgeführt werden kann.

================================================== ============================ Vielen Dank für die vorherigen Antworten.

Ich bin immer noch etwas verwirrt darüber, wie der Adressraum von Benutzer und Kernel aufgeteilt wird.

1) Wird der Kernel-Adressraum von 2 GB von allen Prozessen gemeinsam genutzt, weil er systemweit ist und zur Startzeit geladen wird? oder Bekommt jeder Prozess einen Kernspeicher-Adressraum von 2 GB? 2) Ich lese einige schlecht geschriebene Anwendungen, die den gesamten Adressraum belegen.? Bedeutet das, dass jetzt keine anderen Anwendungen auf einem 4-GB-Computer ausgeführt werden können.? 3) Wenn ein Kernel-Adressraum von allen Prozessen gemeinsam genutzt wird, ist der Adressraum immer leer oder nie, da die Kernel-Adresse (glaube ich) auf der OS-Architektur festgelegt bleibt und von allen Prozessen gemeinsam genutzt wird. 4) Durch die Verwendung des USERVA-Switches wird die Kernel-Adresse nur für Anwendungen mit großer Adresserkennung auf 1 GB reduziert. Warum tut es nicht für alle Prozesse, wenn der Kernel-Adressraum bei 2 GB (was ich glaube) unter allen Prozessen gemeinsam genutzt wird.? 5) Wie genau unterscheiden wir den virtuellen Speicher (s / w) und den virtuellen Adressraum? ? Wenn eine Anwendung 5 GB Speicherplatz pro devloper benötigt, wird sie nicht auf einem 32-Bit-Computer mit 2 GB-Adresse ausgeführt (Ist der virtuelle Speicher des Prozesses = virtueller Adressraum des Prozesses?)

0
Das meiste davon wurde auf Ihre vorherige Frage [Speicherverwaltung in 32-Bit-Windows] (https://superuser.com/q/1343368/241386) beantwortet. Die virtuellen Adressen von 3 Prozessen summieren sich nicht auf 12 GB, da sie nicht linear zugeordnet werden. Andernfalls würde Tonnen von Arbeitsspeicher verschwendet, wenn ein Prozess nur 10 MB RAM benötigt, aber den gesamten 4 GB-Adressblock belegt. Wenn Sie den Task-Manager öffnen, werden Sie feststellen, dass es Tausende von Prozessen gibt. Bedeutet das, dass der Computer TB RAM benötigt? phuclv vor 5 Jahren 0

2 Antworten auf die Frage

0
harrymc

F1: Nein. Dies liegt daran, dass ein 32-Bit-Register nur 4 GB eindeutige Adressen enthalten kann.

F2: Falsch, es gibt keine Unterteilung des Benutzerspeichers in Benutzer und Kernel. Der Kernel befindet sich nicht im Adressraum des Prozesses.

F3: Ja, Windows tauscht bei Bedarf die ältesten Speicherseiten aus.

Wirkliche Frage: Ja, ein Prozess kann nicht gestartet werden, ohne dass das Mapping den gesamten Speicher des Arbeitsspeichers vertauscht, sodass er jederzeit vollständig oder teilweise ausgelagert werden kann.

Im Übrigen schlage ich vor, dass Sie zuerst in Wikipedia lesen:

0
sawdust

Korrigiere mich, dass ich falsch liege.

Gern. Sind Sie bereit?


Q1) Ich verstehe, dass wir im 32-Bit-Modus einen virtuellen Adressraum von 4 GB erhalten.

Richtig.

Dies liegt daran, dass 32-Bit-Windows nur 4 GB physischen Arbeitsspeicher unterstützen kann.

Nein, die Größe des virtuellen Speichers ist unabhängig von der Größe des physischen oder installierten Speichers.
Diese Größen sind nur gleich, weil beide Werte (für Adressen) verwenden, die 32 Bit breit sind. Ein Prozessor könnte so ausgelegt sein, dass er eine virtuelle Adressgröße hat, die sich von seiner physikalischen Adressgröße unterscheidet. IIRC wurde bereits gemacht, als die Hardwaredimensionen und -kosten viel höher waren als heute.


F2) Jeder Prozess erhält seinen eigenen privaten Adressraum von 4 GB.

Ja, ein virtueller Adressraum.

2 GB Benutzermodus und 2 GB Kernel.

Nein, "Benutzermodus" bezieht sich auf den Betriebszustand der CPU, dh CPU-Modi. Der Speicher hat keinen "Benutzermodus" (noch "Kernelmodus").
Der virtuelle Speicher ist in Benutzer- und Kernelbereich unterteilt.

Ordnet der Prozess seinen gesamten Code dem Benutzermodus zu, und die für die Kommunikation des Prozessors mit dem Prozessor zur Ausführung des Codes benötigten BS-Komponenten werden im Kernel-Modus geladen.

Diese Frage kann nur sinnvoll sein, wenn "Modus" durch "Leerzeichen" ersetzt wird.

Der Kernel wird beim Booten in den physischen Speicher geladen.
Die Ausführung des Kernels steuert das System, z. B. das Starten und Verwalten von Prozessen.
Der Kernel wird in den virtuellen Adressraum jedes Prozesses abgebildet. Aus diesem Grund ist ein Teil des virtuellen Speichers des Prozesses "Kernel Space".

Der Programmcode und die (gemeinsam genutzten) Bibliotheken werden dem virtuellen Speicher im Benutzerbereich zugeordnet.

Das Betriebssystem "kommuniziert nicht mit dem Prozessor" (auch kein Prozess).
Der Prozessor / CPU führt Anweisungen aus. Es gibt keine "Kommunikation" mit der CPU.
Ein Prozess ist ein konzeptioneller Job oder eine Aufgabe, dem Ressourcen wie virtueller und physischer Arbeitsspeicher sowie geplante CPU-Zeit zugewiesen werden.
Die einzige Interaktion zwischen einem Prozess und dem Prozessor / CPU besteht in der Ausführung von Anweisungen für diesen Prozess. Die Interaktion zwischen dem Kernel und dem Prozessor / CPU ist die Ausführung von Anweisungen für diesen Kernel und das Weiterleiten von Ausnahmen und Interrupts.


F3) Wenn ein Prozess einen eigenen privaten 4-GB-Speicherplatz erhält.

Es gibt kein "wenn" . Jeder Prozess erhält 4 GB virtuellen Speicher.

Wenn ich 3 Prozess lade, beträgt der Adressraum insgesamt 12 GB. Habe ich ein Leistungsproblem, da ich nur 4 GB RAM habe?

Überhaupt nicht wahrscheinlich, da typische Prozesse selten ihren gesamten virtuellen Speicher verwenden. Und selbst wenn es einen Backup-Speicher gibt (z. B. Auslagerungsdatei oder Auslagerungsspeicher), um Situationen zu behandeln, in denen weniger physischer Speicher als der virtuelle Adressraum vorhanden ist (der ursprüngliche Grund für die Verwendung des virtuellen Speichers).


Die virtuelle Adresse ist jedoch so ausgelegt, dass sie den Prozessbedarf bei weniger RAM erfüllt.

Sie meinen wahrscheinlich virtuellen Speicher, nicht "virtuelle Adresse" .

SO meine eigentliche Frage: Wenn ein Prozess (eine einzelne Prozessanwendung) geladen wird, ordnet er den gesamten Code der virtuellen Adresse mit 4 GB zu, unabhängig davon, ob die Anwendung derzeit nur einen bestimmten Teil des gesamten Codes ausführt.

(Warum wird Ihre "echte Frage" nicht mit einer Nummer versehen?)
Ich habe keine endgültige Antwort, würde aber erwarten, dass das gesamte Programm geladen würde, um Relokationen durchzuführen und externe Verknüpfungen aufzulösen ( zB zu Bibliotheken).
Was geladen wird, muss zugeordnet werden, dh physischer Speicher zugewiesen.

Was ich verstehe ist, dass, wenn ein Prozess gestartet wird, der gesamte Code in den virtuellen Adressraum des 2-GB-Benutzermodus geladen wird und die restlichen 2 GB OS-Kernel-Dateien laden.

Sie missbrauchen wieder "Benutzermodus" .
Das Laden des Kernelcodes wird beim Booten ausgeführt, nicht wenn ein Prozess gestartet wird.

Wenn Sie nun Seitentabellen verwenden, wird die virtuelle Adresse im RAM und auf der Festplatte der physischen Adresse zugeordnet. Werden alle virtuellen 4-GB-Adressen dem physischen 4-GB-RAM zugeordnet und verbleiben in der Auslagerungsdatei?

Nein, Seitentabellen ordnen nur virtuellen Speicher (in Seiteneinheiten) dem physischen Speicher zu. Es gibt keine Zuordnung zu "Festplatte" . Das klingt nach einem weit verbreiteten Missverständnis über die Funktionsweise der Auslagerungsdatei und des virtuellen Speichers.
Die Seitendatei ist ein Sicherungsspeicher. Sie enthält vorübergehend Inhalte der virtuellen Speicherseiten, die nicht speicherresident sein können (dh zugewiesener physischer Speicher).

Wenn ich mich weigere, die Seitendatei zu verwenden, bedeutet dies, dass nur ein Prozess mit einer virtuellen Adresse von 4 GB unter 32-Bit-Betriebssystemen mit 4 GB ausgeführt werden kann.

Nein, da ein Prozess normalerweise nicht den gesamten virtuellen Adressraum verwendet und somit keine physischen Arbeitsspeicher von 4 GB benötigt.
Ich habe gesehen, dass mehr als zwei Dutzend Prozesse auf einem 32-Bit-Linux-System mit nur 512 MB RAM und ohne Auslagerungsdatei ausgeführt wurden.