Ich werde oft mit dem Konzept der Virtualisierung in Betriebssystemen verwechselt. Warum benötigen wir den virtuellen Speicher für die Ausführung eines Prozesses, wenn wir RAM als physischen Speicher betrachten?
Wo steht dieser virtuelle Speicher, wenn der Prozess (Programm) von der externen Festplatte zur Ausführung in den Hauptspeicher (physischen Speicher) gebracht wird?
Wer kümmert sich um den virtuellen Speicher und wie groß ist der virtuelle Speicher?
Angenommen, die Größe des Arbeitsspeichers beträgt 4 GB (dh 2 ^ 32-1 Adressräume). Wie groß ist der virtuelle Speicher?
Antworten:
Virtueller Speicher ist unter anderem eine Abstraktion, um dem Programmierer die Illusion zu geben, unendlichen Speicher auf seinem System verfügbar zu haben.
Zuordnungen des virtuellen Speichers werden vorgenommen, um den tatsächlichen physischen Adressen zu entsprechen. Das Betriebssystem erstellt und verarbeitet diese Zuordnungen - unter Verwendung der Seitentabelle und anderer Datenstrukturen, um die Zuordnungen zu verwalten. Zuordnungen des virtuellen Speichers befinden sich immer in der Seitentabelle oder einer ähnlichen Datenstruktur (bei anderen Implementierungen des virtuellen Speichers sollten wir sie möglicherweise nicht als "Seitentabelle" bezeichnen). Die Seitentabelle befindet sich ebenfalls im physischen Speicher - häufig in vom Kernel reservierten Bereichen, über die Benutzerprogramme nicht schreiben können.
Der virtuelle Speicher ist normalerweise größer als der physische Speicher. Es gibt keinen Grund für die Zuordnung des virtuellen Speichers, wenn der virtuelle Speicher und der physische Speicher dieselbe Größe hätten.
Normalerweise befindet sich nur der benötigte Teil eines Programms im Speicher - dies ist ein Thema, das als "Paging" bezeichnet wird. Virtueller Speicher und Paging sind eng miteinander verbunden, aber nicht dasselbe Thema. Es gibt andere Implementierungen des virtuellen Speichers, z. B. die Segmentierung.
Ich könnte hier falsch annehmen, aber ich wette, die Dinge, die Ihnen schwer fallen, Ihren Kopf herumzureißen, haben mit bestimmten Implementierungen des virtuellen Speichers zu tun, höchstwahrscheinlich mit Paging. Es gibt keine Möglichkeit , Paging durchzuführen - es gibt viele Implementierungen und die in Ihrem Lehrbuch beschriebene ist wahrscheinlich nicht die gleiche wie die, die in realen Betriebssystemen wie Linux / Windows angezeigt wird - es gibt wahrscheinlich subtile Unterschiede.
Ich könnte tausend Absätze über Paging blabbern ... aber ich denke, das ist besser einer anderen Frage überlassen, die speziell auf dieses Thema abzielt.
quelle
Software läuft auf dem Betriebssystem unter einer sehr einfachen Voraussetzung - sie benötigt Speicher. Das Betriebssystem des Geräts stellt es in Form von RAM zur Verfügung. Die erforderliche Speichermenge kann variieren - einige Softwareprogramme benötigen großen Speicher, andere benötigen nur wenig Speicher. Die meisten (wenn nicht alle) Benutzer führen mehrere Anwendungen gleichzeitig auf dem Betriebssystem aus. Da der Speicher teuer ist (und die Gerätegröße begrenzt ist), ist die verfügbare Speichermenge immer begrenzt. Da alle Softwareprogramme eine bestimmte Menge an RAM benötigen und alle gleichzeitig ausgeführt werden können, muss sich das Betriebssystem um zwei Dinge kümmern:
Jetzt läuft die Hauptfrage darauf hinaus, wie der Speicher verwaltet wird. Was genau regelt, wo im Speicher die Daten einer bestimmten Software gespeichert werden?
Vorteile:
Nachteile:
Dies skaliert nicht. Theoretisch benötigt eine App möglicherweise sehr viel Speicher, wenn sie etwas wirklich Schweres tut. Um sicherzustellen, dass der Speicher nie knapp wird, muss der ihm zugewiesene Speicherbereich immer größer oder gleich dieser Speichermenge sein. Was ist, wenn eine Software, deren maximale theoretische Speichernutzung ist
2 GB
(daher eine2 GB
Speicherzuweisung aus dem RAM erforderlich ist ), auf einem Computer mit nur1 GB
Speicher installiert wird ? Sollte die Software beim Start einfach abgebrochen werden und sagen, dass der verfügbare RAM kleiner als ist2 GB
? Oder sollte es fortgesetzt werden und in dem Moment, in dem der erforderliche Speicher überschritten wird2 GB
, einfach abbrechen und mit der Meldung aussteigen, dass nicht genügend Speicher verfügbar ist?Es ist nicht möglich, eine Speicherverfälschung zu verhindern. Es gibt Millionen von Software, selbst wenn jeder von ihnen nur
1 kB
Speicher zugewiesen würde16 GB
, würde der erforderliche Gesamtspeicher übersteigen , was mehr ist als die meisten Geräte bieten. Wie können dann verschiedene Software-Speicherplätze zugewiesen werden, die nicht in die Bereiche des anderen eingreifen? Erstens gibt es keinen zentralisierten Softwaremarkt, der regeln kann, dass sich eine neue Software bei der Veröffentlichung so viel Speicher aus diesem noch nicht besetzten Bereich zuweisen mussund zweitens, selbst wenn es solche gäbe, ist es nicht möglich, dies zu tun, weil die Nr. Die Anzahl der Softwareprogramme ist praktisch unendlich (daher ist unendlich viel Speicher erforderlich, um alle zu speichern), und der auf einem Gerät verfügbare Gesamtspeicher reicht nicht aus, um auch nur einen Bruchteil des erforderlichen Speichers aufzunehmen, wodurch das Eindringen in die Speichergrenzen einer Software unvermeidlich wird auf das eines anderen. Also , was passiert , wenn Photoshop Speicherplatz zugeordnet1
zu1023
und VLC zugeordnet1000
zu1676
? Was passiert, wenn Photoshop einige Daten vor Ort speichert1008
, dann überschreibt VLC diese mit seinen eigenen Daten und später mit Photoshopgreift es zu und denkt, dass es die gleichen Daten sind, die dort zuvor gespeichert wurden? Wie Sie sich vorstellen können, werden schlimme Dinge passieren.Wie Sie sehen, ist diese Idee also ziemlich naiv.
Angenommen, das Gerät wurde gerade eingeschaltet, das Betriebssystem wurde gerade gestartet. Derzeit wird kein anderer Prozess ausgeführt (das Betriebssystem wird ignoriert, was ebenfalls ein Prozess ist!), Und Sie entscheiden sich, VLC zu starten . Daher wird VLC ein Teil des RAM von den niedrigsten Byteadressen zugewiesen. Gut. Jetzt, während das Video läuft, müssen Sie Ihren Browser starten, um eine Webseite anzuzeigen. Dann müssen Sie Notepad starten, um Text zu kritzeln. Und dann Eclipse , um etwas zu programmieren. Ziemlich bald ist Ihr Speicher
4 GB
voll und der RAM sieht folgendermaßen aus:Okay, jetzt entscheiden Sie, dass Sie Eclipse und Chrome nicht mehr geöffnet lassen müssen. Sie schließen sie, um Speicherplatz freizugeben. Der von diesen Prozessen im RAM belegte Speicherplatz wird vom Betriebssystem zurückgefordert, und es sieht jetzt so aus:
Angenommen, durch das Schließen dieser beiden wird
700 MB
Speicherplatz freigegeben - (400
+300
) MB. Jetzt müssen Sie Opera starten , das450 MB
Platz beansprucht. Nun, Sie haben insgesamt mehr als nur450 MB
Platz zur Verfügung, aber ... es ist nicht zusammenhängend, es ist in einzelne Teile unterteilt, von denen keiner groß genug ist, um zu passen450 MB
. Wenn Sie also auf eine brillante Idee gestoßen sind, verschieben wir alle Prozesse unten so weit wie möglich nach oben, sodass der700 MB
leere Raum in einem Block unten verbleibt. Das nennt mancompaction
. Großartig, außer dass ... alle Prozesse, die dort sind, ausgeführt werden. Das Verschieben bedeutet, dass die Adresse aller Inhalte verschoben wird (denken Sie daran, dass das Betriebssystem eine Zuordnung des von der Software ausgespuckten Speichers zur tatsächlichen Speicheradresse beibehält. Stellen Sie sich vor, die Software hat eine Adresse45
mit Daten ausgespuckt123
und das Betriebssystem hat sie an einem Ort gespeichert2012
und einen Eintrag in der Karte erstellt, Mapping45
auf2012
. Wenn die Software nun im Speicher bewegt wird, verwendet , was an dem Ort zu sein ,2012
wird nicht länger auf2012
, sondern in einer neuen Position, und O hat , um die Karte zu aktualisieren entsprechend abzuzubilden ,45
um die neue Adresse, damit die Software die erwarteten Daten (123
) abrufen kann, wenn sie nach dem Speicherort fragt45
. Was die Software betrifft, ist alles, was sie weiß, diese Adresse45
enthält die Daten123
!)! Stellen Sie sich einen Prozess vor, der auf eine lokale Variable verweisti
. Wenn erneut darauf zugegriffen wird, hat sich die Adresse geändert und kann nicht mehr gefunden werden. Das Gleiche gilt für alle Funktionen, Objekte, Variablen. Grundsätzlich hat alles eine Adresse. Wenn Sie einen Prozess verschieben, müssen Sie die Adresse aller Funktionen ändern. Was uns führt zu:Fein. Angenommen, Sie schaffen es auf wundersame Weise, die Prozesse nach oben zu bringen. Jetzt gibt es
700 MB
unten freien Speicherplatz:Opera passt nahtlos in den unteren Bereich. Jetzt sieht Ihr RAM so aus:
Gut. Alles sieht gut aus. Es ist jedoch nicht mehr viel Platz übrig, und jetzt müssen Sie Chrome erneut starten , ein bekanntes Speicherproblem! Zum Starten wird viel Speicher benötigt, und Sie haben kaum noch Speicherplatz ... Außer ... Sie bemerken jetzt, dass einige der Prozesse, die ursprünglich viel Platz beanspruchten, jetzt nicht mehr viel Platz benötigen. Möglicherweise haben Sie Ihr Video in VLC gestoppt , daher nimmt es immer noch etwas Platz ein, aber nicht so viel, wie für die Ausführung eines hochauflösenden Videos erforderlich ist. Ähnliches gilt für Editor und Fotos . Ihr RAM sieht jetzt so aus:
Holes
, Noch einmal! Zurück zum ersten Platz! Außer dass die Löcher früher aufgrund von Prozessen aufgetreten sind, die beendet wurden, ist dies jetzt auf Prozesse zurückzuführen, die weniger Platz benötigen als zuvor! Und Sie haben wieder das gleiche Problem, dieholes
kombinierten ergeben mehr Platz als erforderlich, aber sie sind verstreut, nicht viel isoliert zu nutzen. Sie müssen diese Prozesse also erneut verschieben, ein teurer und sehr häufiger Vorgang, da die Größe von Prozessen im Laufe ihrer Lebensdauer häufig abnimmt.Gut, jetzt erledigt Ihr Betriebssystem die erforderlichen Schritte, verschiebt Prozesse und startet Chrome. Nach einiger Zeit sieht Ihr RAM folgendermaßen aus:
Cool. Angenommen, Sie sehen Avatar erneut in VLC . Der Speicherbedarf steigt! Aber ... es ist kein Platz mehr zum Wachsen übrig, da sich der Editor unten ankuschelt. Also müssen wieder alle Prozesse nach unten verschoben werden, bis VLC genügend Platz gefunden hat!
Fein. Angenommen, Fotos werden verwendet, um einige Fotos von einer externen Festplatte zu laden. Der Zugriff auf die Festplatte führt Sie vom Bereich der Caches und des Arbeitsspeichers zum Bereich der Festplatte, der um Größenordnungen langsamer ist. Schmerzlich, unwiderruflich, transzendental langsamer. Es ist eine E / A-Operation, was bedeutet, dass sie nicht an die CPU gebunden ist (es ist eher das genaue Gegenteil), was bedeutet, dass sie momentan keinen RAM belegen muss. Es belegt jedoch immer noch hartnäckig RAM. Wenn Sie Firefox in der Zwischenzeit starten möchten , können Sie dies nicht, da nicht viel Speicher verfügbar ist. Wenn Fotos für die Dauer ihrer E / A-gebundenen Aktivität aus dem Speicher genommen würden, hätte dies viel Speicher freigegeben. gefolgt von (teurer) Verdichtung, gefolgt von Firefox .
Wie wir sehen können, haben wir selbst beim Ansatz des virtuellen Speichers so viele Probleme.
Es gibt zwei Ansätze, um diese Probleme anzugehen -
paging
undsegmentation
. Lassen Sie uns diskutierenpaging
. Bei diesem Ansatz wird der virtuelle Adressraum eines Prozesses in Blöcken auf den physischen Speicher abgebildetpages
. Eine typischepage
Größe ist4 kB
. Die Zuordnung wird durch eine so genanntepage table
virtuelle Adresse aufrechterhalten. Jetzt müssen wir nur noch herausfinden, zu welcherpage
Adresse die Adresse gehört, und dann auspage table
der entsprechenden Positionpage
im tatsächlichen physischen Speicher (bekannt alsframe
) den angegebenen Ort finden und angeben Wenn der Versatz der virtuellen Adresse innerhalb von sowohlpage
fürpage
als auch für gleich istframe
, ermitteln Sie die tatsächliche Adresse, indem Sie diesen Versatz zu der von der zurückgegebenen Adresse hinzufügenpage table
. Beispielsweise:Links befindet sich der virtuelle Adressraum eines Prozesses. Angenommen, der virtuelle Adressraum benötigt 40 Speichereinheiten. Wenn der physische Adressraum (rechts) ebenfalls 40 Speichereinheiten hätte, wäre es möglich gewesen, alle Standorte von links auf einen Standort rechts abzubilden, und wir wären so glücklich gewesen. Aber wie es das Pech hätte, verfügt der physische Speicher nicht nur über weniger (hier 24) Speichereinheiten, sondern muss auch von mehreren Prozessen gemeinsam genutzt werden! Gut, mal sehen, wie wir damit auskommen.
Wenn der Prozess startet, wird beispielsweise eine Speicherzugriffsanforderung für den Speicherort
35
gestellt. Hier ist die Seitengröße8
(jederpage
enthält8
Standorte, der gesamte virtuelle Adressraum von40
Standorten enthält somit5
Seiten). Dieser Ort gehört also zur Seite Nr.4
(35/8
). Innerhalb dieserpage
Position hat diese Position einen Versatz von3
(35%8
). Dieser Ort kann also durch das Tupel(pageIndex, offset)
= angegeben werden(4,3)
. Dies ist nur der Anfang, sodass noch kein Teil des Prozesses im eigentlichen physischen Speicher gespeichert ist. Also diepage table
, die eine Zuordnung der Seiten links zu den tatsächlichen Seiten rechts (wo sie aufgerufen werden) aufrechterhältframes
) ist derzeit leer. Das Betriebssystem gibt also die CPU frei, lässt einen Gerätetreiber auf die Festplatte zugreifen und ruft die Seiten-Nr.4
für diesen Prozess (im Grunde ein Speicherblock aus dem Programm auf der Festplatte, dessen Adressen von32
bis reichen39
). Wenn es eintrifft, weist das Betriebssystem die Seite irgendwo im RAM zu, beispielsweise im ersten Frame selbst, und derpage table
für diesen Prozess wird zur Kenntnis genommen, dass die Seite4
dem Frame0
im RAM zugeordnet ist. Jetzt sind die Daten endlich im physischen Speicher. Das Betriebssystem fragt die Seitentabelle erneut nach dem Tupel ab(4,3)
. Diesmal besagt die Seitentabelle, dass die Seite4
bereits einem Frame0
im RAM zugeordnet ist. Das Betriebssystem wechselt also einfach zum0
dritten Frame im RAM und greift auf die versetzten Daten3
in diesem Frame zu (nehmen Sie sich einen Moment Zeit, um dies zu verstehen. Das Ganzepage
, der von der Festplatte abgerufen wurde, wird nach verschobenframe
. Was auch immer der Versatz eines einzelnen Speicherplatzes auf einer Seite war, er ist auch im Frame derselbe, da sich die Speichereinheit innerhalb despage
/frame
relativ immer noch an derselben Stelle befindet!) Und die Daten zurückgibt! Da die Daten bei der ersten Abfrage selbst nicht im Speicher gefunden wurden, sondern von der Festplatte abgerufen werden mussten, um in den Speicher geladen zu werden, handelt es sich um einen Fehler .Fein. Angenommen, es wird ein Speicherzugriff für den Speicherort
28
vorgenommen. Es läuft darauf hinaus(3,4)
.Page table
Im Moment gibt es nur einen Eintrag, der die Seite4
dem Frame zuordnet0
. Dies ist also wieder ein Fehler , der Prozess gibt die CPU frei, der Gerätetreiber ruft die Seite von der Festplatte ab, der Prozess erlangt wieder die Kontrolle über die CPU undpage table
wird aktualisiert. Angenommen, die Seite3
ist jetzt dem Frame1
im RAM zugeordnet. So(3,4)
wird(1,4)
, und die Daten an dieser Stelle im RAM werden zurückgegeben. Gut. Auf diese Weise nehme an, der nächste Speicherzugriff für die Lage ist8
, was übersetzt(1,0)
. Die Seite1
befindet sich noch nicht im Speicher, der gleiche Vorgang wird wiederholt und diepage
wird im Frame zugewiesen2
im RAM. Jetzt sieht das RAM-Prozess-Mapping wie im obigen Bild aus. Zu diesem Zeitpunkt ist der RAM, für den nur 24 Speichereinheiten verfügbar waren, voll. Angenommen, die nächste Speicherzugriffsanforderung für diesen Prozess stammt von der Adresse30
. Es(3,6)
wird zugeordnet undpage table
sagt, dass sich die Seite3
im RAM befindet, und es wird dem Frame zugeordnet1
. Yay! Die Daten werden also vom RAM-Speicherort abgerufen(1,6)
und zurückgegeben. Dies stellt einen Treffer dar , da die erforderlichen Daten direkt aus dem RAM abgerufen werden können und somit sehr schnell sind. Ebenso sagen die nächsten Zugriffsanforderungen, für die Standorte11
,32
,26
,27
alle sind Treffer , dh durch den Prozess angeforderten Daten werden direkt im RAM gefunden , ohne an anderer Stelle suchen zu müssen.Angenommen, es wird eine Speicherzugriffsanforderung für den Speicherort
3
gesendet. Es übersetzt in(0,3)
undpage table
für diesen Prozess, der derzeit 3 Einträge für Seiten enthält1
,3
und4
sagt, dass sich diese Seite nicht im Speicher befindet. Wie in früheren Fällen wird es von der Festplatte abgerufen, im Gegensatz zu früheren Fällen ist der Arbeitsspeicher jedoch voll! Was tun jetzt? Hier liegt die Schönheit des virtuellen Speichers, ein Frame aus dem RAM wird entfernt! (Verschiedene Faktoren bestimmen, welcher Frame entfernt werden soll. Es kann daraufLRU
basieren, wo der Frame, auf den zuletzt für einen Prozess zugegriffen wurde, entfernt werden soll. Es kann einefirst-come-first-evicted
Basis sein, auf der der Frame, der vor langer Zeit zugewiesen wurde, entfernt wird usw. .) Also wird ein Rahmen entfernt. Sagen Sie Bild 1 (wählen Sie es einfach zufällig aus). Diesframe
ist jedoch einigen zugeordnetpage
! (Derzeit wird es von der Seitentabelle auf die Seite3
unseres einzigen Prozesses abgebildet .) Dieser Prozess muss also über diese tragische Nachricht informiert werden, dass einerframe
, der Ihnen unglücklicherweise gehört, aus dem RAM entfernt werden soll, um Platz für einen anderen zu schaffenpages
. Der Prozess muss sicherstellen, dass er seinepage table
Informationen mit diesen Informationen aktualisiert , dh den Eintrag für dieses Seitenrahmen-Duo entfernt, damit erpage
dem Prozess bei der nächsten Anforderung mitteilt, dass sich dieserpage
nicht mehr im Speicher befindet und muss von der Festplatte abgerufen werden. Gut. Der Frame1
wird entfernt, die Seite0
wird eingefügt und dort in den RAM gestellt, und der Eintrag für die Seite3
wird entfernt und durch die0
Zuordnung der Seite zu demselben Frame ersetzt1
. Jetzt sieht unser Mapping so aus (beachten Sie die Farbänderung in der zweitenframe
auf der rechten Seite):Sah was gerade passiert ist? Der Prozess musste wachsen, er benötigte mehr Speicherplatz als der verfügbare RAM, aber im Gegensatz zu unserem früheren Szenario, in dem jeder Prozess im RAM verschoben werden musste, um einem wachsenden Prozess Rechnung zu tragen, geschah dies hier nur durch einen
page
Austausch! Möglich wurde dies durch die Tatsache, dass der Speicher für einen Prozess nicht mehr zusammenhängend sein muss, sondern sich an verschiedenen Stellen in Blöcken befinden kann, das Betriebssystem die Informationen darüber verwaltet, wo sie sich befinden, und bei Bedarf entsprechend abgefragt wird. Hinweis: Sie denken vielleicht, was ist, wenn es sich meistens um einemiss
handelt und die Daten ständig von der Festplatte in den Speicher geladen werden müssen? Ja, theoretisch ist dies möglich, aber die meisten Compiler sind wie folgt konzipiertlocality of reference
Wenn also Daten von einem Speicherort verwendet werden, befinden sich die nächsten benötigten Daten an einem sehr nahe gelegenen Ort, möglicherweise von demselbenpage
, derpage
gerade in den Speicher geladen wurde. Infolgedessen wird der nächste Fehler nach einiger Zeit auftreten. Die meisten anstehenden Speicheranforderungen werden von der gerade eingebrachten Seite oder den bereits im Speicher befindlichen Seiten erfüllt, die kürzlich verwendet wurden. Das exakt gleiche Prinzip ermöglicht es uns, auch das zuletzt verwendete zu entfernenpage
, mit der Logik, dass das, was seit einiger Zeit nicht mehr verwendet wurde, wahrscheinlich auch nicht mehr verwendet wird. Dies ist jedoch nicht immer der Fall, und in Ausnahmefällen kann die Leistung darunter leiden. Dazu später mehr.Cool. Früher hatten wir ein Problem, bei dem es schwierig ist, den leeren Raum von anderen Prozessen zurückzugewinnen, obwohl ein Prozess kleiner wird (da dies eine kostspielige Verdichtung erfordern würde). Wenn ein Prozess kleiner wird, ist es jetzt einfach, viele seiner
pages
Prozesse werden nicht mehr verwendet. Wenn andere Prozesse mehr Speicher benötigen, werden durch eine einfacheLRU
Räumung automatisch die weniger genutztenpages
aus dem RAM entfernt und durch die neuen Seiten von ersetzt die anderen Prozesse (und natürlich die Aktualisierungpage tables
all dieser Prozesse sowie des ursprünglichen Prozesses, der jetzt weniger Platz benötigt), all dies ohne kostspielige Verdichtungsoperation!Nehmen Sie sich für Problem 2 einen Moment Zeit, um dies zu verstehen. Das Szenario selbst ist vollständig entfernt! Es ist nicht erforderlich, einen Prozess zu verschieben, um einen neuen Prozess aufzunehmen, da jetzt der gesamte Prozess nie mehr auf einmal passen muss, sondern nur bestimmte Seiten ad hoc passen müssen. Dies geschieht durch Entfernen
frames
aus dem RAM. Alles geschieht in Einheiten vonpages
, daher gibt es kein Konzept vonhole
jetzt und daher keine Frage von irgendetwas, das sich bewegt! Möglicherweise mussten 10pages
wegen dieser neuen Anforderung verschoben werden, vonpages
denen Tausende unberührt bleiben. Während früher alle Prozesse (jedes Bit von ihnen) verschoben werden mussten!Wenn der Prozess nun eine E / A-Operation ausführen muss, kann er die CPU leicht freigeben! Das Betriebssystem entfernt einfach alles
pages
aus dem RAM (speichert es möglicherweise in einem Cache), während neue Prozesse in der Zwischenzeit den RAM belegen. Wenn die E / A-Operation abgeschlossen ist, stellt das Betriebssystem diese einfachpages
im RAM wieder her (natürlich durch Ersetzen derpages
von einigen anderen Prozessen, möglicherweise von denen, die den ursprünglichen Prozess ersetzt haben, oder von einigen, die selbst E / A ausführen müssen) O jetzt, und kann daher die Erinnerung aufgeben!)Und natürlich greift jetzt kein Prozess mehr direkt auf den RAM zu. Jeder Prozess greift auf einen virtuellen Speicherort zu, der einer physischen RAM-Adresse zugeordnet und
page-table
von diesem Prozess verwaltet wird. Die Zuordnung ist vom Betriebssystem unterstützt. Das Betriebssystem teilt dem Prozess mit, welcher Frame leer ist, sodass dort eine neue Seite für einen Prozess angepasst werden kann. Da diese Speicherzuweisung vom Betriebssystem selbst überwacht wird, kann leicht sichergestellt werden, dass kein Prozess in den Inhalt eines anderen Prozesses eingreift, indem nur leere Frames aus dem RAM zugewiesen werden oder wenn in den Inhalt eines anderen Prozesses im RAM eingegriffen wird, mit dem Prozess kommuniziert wird um es zu aktualisierenpage-table
.So
paging
(unter anderen Techniken), in Verbindung mit dem virtuellen Speichern, ist die heutige , welche Kräfte Software läuft auf O-es! Dies befreit den Softwareentwickler von der Sorge, wie viel Speicher auf dem Gerät des Benutzers verfügbar ist, wo die Daten gespeichert werden sollen, wie verhindert werden kann, dass andere Prozesse die Daten seiner Software beschädigen usw. Dies ist jedoch natürlich nicht vollständig sicher. Es gibt Mängel:Paging
gibt dem Benutzer letztendlich die Illusion eines unendlichen Speichers, indem er die Festplatte als sekundäres Backup verwendet. Das Abrufen von Daten aus dem Sekundärspeicher, um in den Speicher zu passen (aufgerufenpage swap
, und der Fall, dass die gewünschte Seite im RAM nicht gefunden wird, wird aufgerufenpage fault
) ist teuer, da es sich um eine E / A-Operation handelt. Dies verlangsamt den Prozess. Mehrere solcher Seitentauschvorgänge finden nacheinander statt, und der Vorgang wird schmerzhaft langsam. Haben Sie jemals gesehen, dass Ihre Software einwandfrei läuft und plötzlich so langsam wird, dass sie fast hängt, oder Sie haben keine andere Möglichkeit, sie neu zu starten? Möglicherweise wurden zu viele Seitentauschvorgänge durchgeführt, wodurch es langsam wurde (aufgerufenthrashing
).Also zurück zu OP,
Warum benötigen wir den virtuellen Speicher zum Ausführen eines Prozesses? - Wie die Antwort ausführlich erklärt, um Software die Illusion zu vermitteln, dass das Gerät / Betriebssystem über unendlichen Speicher verfügt, sodass jede große oder kleine Software ausgeführt werden kann, ohne sich Gedanken über die Speicherzuweisung oder andere Prozesse zu machen, die ihre Daten beschädigen, selbst wenn parallel laufen. Es ist ein Konzept, das in der Praxis durch verschiedene Techniken umgesetzt wird, von denen eine, wie hier beschrieben, Paging ist . Es kann auch Segmentierung sein .
Wo steht dieser virtuelle Speicher, wenn der Prozess (Programm) von der externen Festplatte zur Ausführung in den Hauptspeicher (physischen Speicher) gebracht wird? - Der virtuelle Speicher steht an sich nirgendwo, er ist eine Abstraktion, die immer vorhanden ist, wenn die Software / der Prozess / das Programm gestartet wird, eine neue Seitentabelle dafür erstellt wird und die Zuordnung der von ihr ausgespuckten Adressen enthält Prozess zur tatsächlichen physischen Adresse im RAM. Da die durch den Prozess ausgespuckten Adressen in gewissem Sinne keine echten Adressen sind, sind sie tatsächlich das, was Sie sagen können
the virtual memory
.Wer kümmert sich um den virtuellen Speicher und wie groß ist der virtuelle Speicher? - Es wird gemeinsam vom Betriebssystem und der Software erledigt. Stellen Sie sich eine Funktion in Ihrem Code vor (die schließlich kompiliert und in die ausführbare Datei umgewandelt wurde, die den Prozess ausgelöst hat), die eine lokale Variable enthält - eine
int i
. Wenn der Code ausgeführt wird,i
wird eine Speicheradresse im Stapel der Funktion abgerufen. Diese Funktion wird selbst als Objekt an einem anderen Ort gespeichert. Diese Adressen werden vom Compiler generiert (der Compiler, der Ihren Code in die ausführbare Datei kompiliert hat) - virtuelle Adressen. Wenn es ausgeführt wird,i
muss es sich mindestens für die Dauer dieser Funktion irgendwo in der tatsächlichen physischen Adresse befinden (es sei denn, es ist eine statische Variable!), Damit das Betriebssystem die vom Compiler generierte virtuelle Adresse von abbildeti
in eine tatsächliche physische Adresse, so dassi
dieser Prozess , wenn innerhalb dieser Funktion ein Code den Wert von benötigt , das Betriebssystem nach dieser virtuellen Adresse abfragen kann und das Betriebssystem wiederum die physische Adresse nach dem gespeicherten Wert abfragen und zurückgeben kann.Angenommen, die Größe des Arbeitsspeichers beträgt 4 GB (dh 2 ^ 32-1 Adressräume). Wie groß ist der virtuelle Speicher? - Die Größe des Arbeitsspeichers hängt nicht von der Größe des virtuellen Speichers ab, sondern vom Betriebssystem. Unter 32-Bit-Windows ist dies beispielsweise
16 TB
unter 64-Bit-Windows der Fall256 TB
. Natürlich ist es auch durch die Festplattengröße begrenzt, da dort der Speicher gesichert wird.quelle
Ich kopiere schamlos die Auszüge aus der Manpage von oben
quelle
Siehe hier: Physischer gegen virtuellen Speicher
Der virtuelle Speicher wird auf der Festplatte gespeichert und verwendet, wenn der RAM gefüllt ist. Der physische Speicher ist auf die Größe der im Computer installierten RAM-Chips beschränkt. Der virtuelle Speicher ist durch die Größe der Festplatte begrenzt, sodass der virtuelle Speicher mehr Speicherplatz bietet.
quelle