Eine kurze Diskussion über den virtuellen Speicher von Linux

Eine kurze Diskussion über den virtuellen Speicher von Linux

Herkunft

Virtueller Speicher

Der virtuelle Speicher ist zweifellos eines der wichtigsten Konzepte in Betriebssystemen. Ich denke, das liegt vor allem an der wichtigen „strategischen Position“ des Speichers. Die CPU ist zu schnell, hat aber eine geringe Kapazität und eingeschränkte Funktionalität. Andere I/O-Hardware unterstützt eine Vielzahl ausgefallener Funktionen, ist aber im Vergleich zur CPU zu langsam. Daher ist zwischen ihnen ein Schmiermittel erforderlich, das als Puffer fungiert, und hier kommt das Gedächtnis ins Spiel.

Das obige Bild ist die einfachste und intuitivste Erklärung des virtuellen Speichers.

Das Betriebssystem verfügt über einen physischen Speicher (den mittleren Teil) und zwei Prozesse (eigentlich gibt es mehr) P1 und P2. Das Betriebssystem teilt P1 und P2 heimlich mit, dass mein gesamter Speicher Ihnen gehört und Sie ihn verwenden können, wie Sie möchten, so viel Sie wollen. Tatsächlich hat das Betriebssystem ihnen jedoch nur ein großes Bild gezeichnet und gesagt, dass der gesamte Speicher an P1 und P2 vergeben sei, aber in Wirklichkeit hat es ihnen nur eine Seriennummer zugewiesen. Erst wenn P1 und P2 tatsächlich anfangen, den Speicher zu verwenden, beginnt das System, die Blöcke zu verschieben und zusammenzusetzen, damit der Prozess sie verwenden kann. P2 glaubt, Speicher A zu verwenden, wurde aber tatsächlich vom System stillschweigend auf den echten Speicher B umgeleitet. Selbst wenn P1 und P2 Speicher C gemeinsam nutzen, wissen sie es nicht einmal.

Die Methode des Betriebssystems, Prozesse zu täuschen, ist der virtuelle Speicher. Bei Prozessen wie P1 und P2 denken alle, dass sie den gesamten Speicher belegen, aber sie wissen nicht, welche Adresse des physischen Speichers sie verwenden, und es ist ihnen auch egal.

Paging und Seitentabellen

Virtueller Speicher ist ein Konzept des Betriebssystems. Für das Betriebssystem ist virtueller Speicher eine Reihe von Vergleichstabellen. Wenn P1 Daten im Speicher A abruft, sollte es an Adresse A im physischen Speicher gehen, und wenn es nach Daten im Speicher B sucht, sollte es an Adresse C im physischen Speicher gehen.

Wir wissen, dass die Grundeinheit im System Byte ist. Wenn jedes Byte des virtuellen Speichers der Adresse des physischen Speichers zugeordnet wird, benötigt jeder Eintrag mindestens 8 Byte (32-Bit-virtuelle Adresse -> 32-Bit-physische Adresse). Bei 4G-Speicher sind 32 GB Speicherplatz erforderlich, um die Vergleichstabelle zu speichern. Dann ist diese Tabelle so groß, dass die tatsächliche physische Adresse nicht enthalten ist. Daher führt das Betriebssystem das Konzept der Seite ein.

Beim Systemstart unterteilt das Betriebssystem den gesamten physischen Speicher in Seiten in Einheiten von 4 KB. Bei der anschließenden Speicherzuweisung werden Seiten als Einheiten verwendet. Daher wird die Zuordnungstabelle der virtuellen Speicherseiten, die den physischen Speicherseiten entsprechen, erheblich reduziert. Für 4G-Speicher wird nur eine 8M-Zuordnungstabelle benötigt. Die Zuordnungsbeziehung des von einigen Prozessen nicht verwendeten virtuellen Speichers muss nicht gespeichert werden. Darüber hinaus hat Linux eine mehrstufige Seitentabelle für großen Speicher entwickelt, die den Speicherverbrauch weiter reduzieren kann. Die Zuordnungstabelle vom virtuellen Speicher des Betriebssystems zum physischen Speicher wird als Seitentabelle bezeichnet.

Speicheradressierung und -zuweisung

Wir wissen, dass durch den virtuellen Speichermechanismus jeder Prozess denkt, dass er den gesamten Speicher belegt. Wenn der Prozess auf den Speicher zugreift, konvertiert das Betriebssystem die vom Prozess bereitgestellte virtuelle Speicheradresse in eine physische Adresse und ruft dann die Daten von der entsprechenden physischen Adresse ab. In der CPU befindet sich eine Art Hardware, die Speicherverwaltungseinheit MMU (Memory Management Unit), die speziell zum Übersetzen virtueller Speicheradressen verwendet wird. Die CPU legt außerdem eine Cache-Strategie für die Seitentabellenadressierung fest. Aufgrund der Lokalität des Programms kann die Cache-Trefferquote 98 % erreichen.

Die obige Situation besteht darin, dass in der Seitentabelle eine Zuordnung von der virtuellen Adresse zur physischen Adresse besteht. Wenn die vom Prozess aufgerufene physische Adresse nicht zugewiesen wurde, generiert das System einen Seitenfehler-Interrupt. Wenn der Interrupt verarbeitet wird, wechselt das System in den Kernelstatus, um der virtuellen Adresse des Prozesses eine physische Adresse zuzuweisen.

Funktion

Virtueller Speicher löst nicht nur das Problem von Speicherzugriffskonflikten zwischen mehreren Prozessen durch Speicheradressübersetzung, sondern bietet auch weitere Vorteile.

Prozessspeicherverwaltung

Es unterstützt den Prozess der Speicherverwaltung, hauptsächlich bei:

  • Speicherintegrität: Aufgrund der „Täuschung“ des virtuellen Speichers gegenüber dem Prozess glaubt jeder Prozess, dass der von ihm erhaltene Speicher eine fortlaufende Adresse ist. Beim Schreiben von Anwendungen müssen wir uns keine Gedanken über die Zuweisung großer Adressblöcke machen. Wir können immer davon ausgehen, dass das System über genügend große Speicherblöcke verfügt.
  • Sicherheit: Da ein Prozess bei jedem Speicherzugriff diesen über die Seitentabelle adressieren muss, kann das Betriebssystem eine Speicherberechtigungssteuerung implementieren, indem es jedem Element in der Seitentabelle verschiedene Identifikationsbits für die Zugriffsberechtigung hinzufügt.

Weitergabe von Daten

Virtueller Speicher erleichtert die gemeinsame Nutzung von Speicher und Daten.

Wenn ein Prozess eine Systembibliothek lädt, weist er immer zuerst einen Speicherblock zu und lädt die Bibliotheksdatei von der Festplatte in diesen Speicher. Bei direkter Verwendung des physischen Speichers ist die Adresse des physischen Speichers eindeutig. Selbst wenn das System feststellt, dass dieselbe Bibliothek zweimal im System geladen ist, kann das System nichts tun, da der von jedem Prozess angegebene Ladespeicher unterschiedlich ist.

Bei Verwendung des virtuellen Speichers muss das System nur die virtuelle Speicheradresse des Prozesses auf die physische Speicheradresse verweisen, an der sich die Bibliotheksdatei befindet. Wie in der obigen Abbildung gezeigt, verweisen die B-Adressen der Prozesse P1 und P2 beide auf die physikalische Adresse C.

Durch die Verwendung von virtuellem Speicher ist es außerdem sehr einfach, gemeinsam genutzten Speicher zu verwenden. Das System muss lediglich die virtuelle Speicheradresse jedes Prozesses auf die vom System zugewiesene gemeinsam genutzte Speicheradresse verweisen.

TAUSCHEN

Der virtuelle Speicher ermöglicht es Prozessen, den Speicher zu „erweitern“.

Wir haben bereits erwähnt, dass der virtuelle Speicher dem Prozess über Seitenfehlerinterrupts physischen Speicher zuweist. Der Speicher ist immer begrenzt. Was passiert, wenn der gesamte physische Speicher belegt ist?

Linux schlägt das Konzept von SWAP vor. SWAP-Partitionen können in Linux verwendet werden. Wenn physischer Speicher zugewiesen wird, der verfügbare Speicher jedoch nicht ausreicht, werden vorübergehend ungenutzte Speicherdaten zuerst auf der Festplatte abgelegt, damit der Prozess, der sie benötigt, sie zuerst verwenden kann. Wenn der Prozess diese Daten erneut verwenden muss, werden die Daten in den Speicher geladen. Durch diese „Swap“-Technologie kann Linux dem Prozess ermöglichen, mehr Speicher zu verwenden.

Häufig gestellte Fragen

Beim Erlernen des virtuellen Speichers hatte ich auch viele Fragen.

32-Bit und 64-Bit

Das häufigste Problem betrifft 32-Bit und 64-Bit.

Die CPU greift über den physischen Bus auf den Speicher zu, sodass der Bereich der Zugriffsadresse durch die Anzahl der Maschinenbusse begrenzt ist. Auf einer 32-Bit-Maschine gibt es 32 Busse, und jeder Bus hat hohe und niedrige Potenziale, die jeweils Bit 1 und 0 darstellen. Die maximal zugängliche Adresse beträgt 2^32bit = 4GB. Daher ist es ungültig, mehr als 4G Speicher auf einer 32-Bit-Maschine einzufügen, und die CPU kann nicht auf mehr als 4G Speicher zugreifen.

64-Bit-Maschinen verfügen jedoch nicht über einen 64-Bit-Bus und ihr maximaler Speicher wird durch das Betriebssystem begrenzt. Linux unterstützt derzeit maximal 256 GB Speicher.

Gemäß dem Konzept des virtuellen Speichers ist es nicht unmöglich, 64-Bit-Software auf einem 32-Bit-System auszuführen. Aufgrund des strukturellen Designs der virtuellen Speicheradresse des Systems kann die 64-Bit-virtuelle Adresse jedoch nicht in einem 32-Bit-System verwendet werden.

Direkte Bedienung des physischen Speichers

Das Betriebssystem verwendet virtuellen Speicher. Was müssen wir tun, wenn wir den Speicher direkt bedienen möchten?

Linux ordnet jedes Gerät Dateien im Verzeichnis /dev/ zu. Wir können die Hardware direkt über diese Gerätedateien steuern, und der Speicher bildet hier keine Ausnahme. Unter Linux werden die Speichereinstellungen auf /dev/mem abgebildet und der Root-Benutzer kann den Speicher direkt bedienen, indem er diese Datei liest und schreibt.

Der JVM-Prozess belegt zu viel virtuellen Speicher

Wenn wir TOP verwenden, um die Systemleistung anzuzeigen, werden wir feststellen, dass der Java-Prozess in der Spalte VIRT eine große Menge des virtuellen Speichers belegt.

Der Grund für dieses Problem liegt darin, dass Java den Arena-Speicherpool von Glibc nutzt, um eine große Menge an virtuellem Speicher zuzuweisen, und diesen nicht verwendet. Darüber hinaus werden die von Java gelesenen Dateien auch als virtueller Speicher zugeordnet. Unter der Standardkonfiguration der virtuellen Maschine belegt jeder Java-Thread-Stapel 1 MB virtuellen Speicher. Sie können nachschauen, warum Multithread-Programme unter Linux so viel virtuellen Speicher verbrauchen.

Der tatsächlich belegte physikalische Speicher ist in der Spalte RES (Resident) ersichtlich. Der Wert dieser Spalte ist die Größe, die tatsächlich dem physikalischen Speicher zugeordnet ist.

Allgemeine Verwaltungsbefehle

Wir können den virtuellen Speicher von Linux auch selbst verwalten.

Überprüfen des Systemspeicherstatus

Es gibt viele Möglichkeiten, den Systemspeicherstatus anzuzeigen. Befehle wie free und vmstat können den aktuellen Systemspeicherstatus anzeigen. Es ist zu beachten, dass der verfügbare Speicher nicht nur die freie Spalte ist. Aufgrund der trägen Natur des Betriebssystems werden viele Puffer/Caches nicht sofort gelöscht, nachdem der Prozess nicht mehr verwendet wird. Wenn der Prozess, der sie zuvor verwendet hat, erneut ausgeführt wird, können sie weiterhin verwendet und bei Bedarf verwendet werden.

Darüber hinaus können Sie mit cat /proc/meminfo ausführliche Informationen zur Systemspeichernutzung anzeigen, einschließlich des Status schmutziger Seiten. Weitere Einzelheiten finden Sie unter: /PROC/MEMINFO-Geheimnis.

pmap

Wenn Sie die virtuelle Speicherverteilung eines bestimmten Prozesses separat anzeigen möchten, können Sie den Befehl pmap pid verwenden, der die Belegung jedes virtuellen Speichersegments von der niedrigen bis zur hohen Adresse auflistet.

Um ausführlichere Informationen auszugeben, können Sie den Parameter -XX hinzufügen.

Speicherkonfiguration ändern

Wir können auch die Linux-Systemkonfiguration ändern, sysctl vm [-options] CONFIG verwenden oder direkt Dateien im Verzeichnis /proc/sys/vm/ lesen und schreiben, um die Konfiguration anzuzeigen und zu ändern.

SWAP-Vorgang

Die SWAP-Funktion des virtuellen Speichers ist nicht immer von Vorteil. Wenn der Prozess ständig große Datenmengen zwischen Speicher und Festplatte austauschen kann, wird die CPU stark beansprucht und die Systemleistung verringert. Daher möchten wir Swap manchmal nicht verwenden.

Wir können vm.swappiness=0 ändern, um den Speicher so einzustellen, dass Swap so wenig wie möglich verwendet wird, oder einfach den Befehl swapoff verwenden, um SWAP zu deaktivieren.

Zusammenfassung

Das Konzept des virtuellen Speichers ist sehr leicht zu verstehen, führt aber zu einer Reihe sehr komplexer Erkenntnisse. In diesem Artikel werden nur einige grundlegende Prinzipien behandelt und viele Details ausgelassen, wie etwa die Verwendung von Segmentregistern bei der Adressierung des virtuellen Speichers, die Verwendung des virtuellen Speichers im Betriebssystem zur Verbesserung von Cache- und Pufferanwendungen usw., die bei Gelegenheit separat besprochen werden.

Oben finden Sie eine kurze Erläuterung der Details des virtuellen Linux-Speichers. Weitere Informationen zum virtuellen Linux-Speicher finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Detailliertes Tutorial von VMware zum Erstellen einer virtuellen Linux-Maschine und zum Einrichten eines virtuellen Maschinennetzwerks
  • Das neueste, äußerst detaillierte grafische Tutorial zur Installation von Kali Linux auf der virtuellen Maschine VMware
  • Eine kurze Analyse von virtuellen Adressen und physischen Adressen in Betriebssystemen

<<:  So verwenden Sie Font Awesome 5 in Vue-Entwicklungsprojekten

>>:  Können Sie alle Testfragen zum Erstellen der Webseite beantworten?

Artikel empfehlen

Beispiel für die Erschöpfung der MySQL-Auto-Increment-ID

Anzeigedefinitions-ID Wenn die in der Tabelle def...

9 praktische Tipps zum Erstellen von Webinhaltsseiten

Inhalt 1. Geben Sie den Lesern einen Grund zu blei...

So installieren Sie JDK und Mysql auf dem Linux-System Ubuntu 18.04

Plattformbereitstellung 1. JDK installieren Schri...

Interpretation von 17 Werbewirksamkeitsmaßen

1. 85 % der Anzeigen werden nicht gelesen <br ...

Eingabetyp begrenzen (mehrere Methoden)

1. Es können nur chinesische Schriftzeichen eingeg...

Beispielcode zum Erzielen eines Aushöhlungseffekts mit reinem CSS

Ich habe kürzlich den Aushöhlungseffekt untersuch...

61 Dinge, die jeder Webentwickler wissen sollte

Normalerweise müssen Sie die Reden aller Teilnehme...

Konfigurieren Sie die Java-Entwicklungsumgebung in Ubuntu 20.04 LTS

Laden Sie das Java Development Kit jdk herunter D...

Implementierung von Check Constraints in MySQL 8.0

Hallo zusammen, ich bin Tony, ein Lehrer, der nur...

Vue führt einen einfachen zufälligen Namensaufruf durch

Inhaltsverzeichnis Layoutteil: <div id="a...

Implementierung eines Nginx-Load-Balancing-Clusters

(1) Experimentelle Umgebung youxi1 192.168.5.101 ...

Eine kurze Diskussion über den CSS-Kaskadierungsmechanismus

Warum hat CSS einen Kaskadierungsmechanismus? Da ...