Heim >System-Tutorial >LINUX >Virtueller Linux-Speicher, verstehen Sie das gut?

Virtueller Linux-Speicher, verstehen Sie das gut?

WBOY
WBOYnach vorne
2024-02-05 12:42:14986Durchsuche

Vorwort

Kürzlich gibt es in der Gruppe ein Sharing-Thema, auf das ich mich freue: „Virtual Memory in Linux“. Eines Abends, als wir Überstunden machten, diskutierten wir über das Konzept des virtuellen Gedächtnisses. Unser Leiter stellte fest, dass mehrere Kollegen das virtuelle Gedächtnis nicht klar genug verstanden, also wählte er dieses Thema speziell für diesen Kollegen aus (lacht).

Vorher hatte ich ein gewisses Verständnis für das Konzept von Betriebssystemen, aber nach dem Abschluss empfand ich ein wenig Bedauern über die Verschwendung meines vierjährigen Informatik-Hauptfachs am College. Deshalb habe ich mir nach der Arbeit die Zeit genommen, mir den Open-Operating-System-Kurs des Harbin Institute of Technology im NetEase Cloud Classroom anzusehen und auch ein Buch „Linux Kernel Design and Implementation“ zu lesen, das die Grundkonzepte von Betriebssystemen erklärt. Darüber hinaus habe ich letztes Jahr einen einfachen Server in der Sprache C geschrieben und mehr über das zugrunde liegende System gelernt. Dieses Wissen ermöglichte mir ein besseres Verständnis der Anwendungsschicht und hat mir bei einer aktuellen Fehlerbehebung sehr geholfen.

Vor ein paar Tagen stellte mir ein anderer Kollege eine weitere Frage zum virtuellen Speicher und mir wurde klar, dass mein Verständnis des virtuellen Speichers nicht tief genug war und einige Konzepte sogar widersprüchlich waren. Daher habe ich einige Informationen durchgesehen und dieses Wissen neu geordnet, in der Hoffnung, beim nächsten Mal die praktische Anwendung flüssiger zu beherrschen.

Herkunft


Virtueller Speicher

Es besteht kein Zweifel, dass der virtuelle Speicher definitiv eines der wichtigsten Konzepte im Betriebssystem ist. Ich denke, das liegt hauptsächlich an der Bedeutung des Speichers im gesamten System. Die CPU ist sehr schnell, verfügt jedoch über eine begrenzte Kapazität und eine einzelne Funktion. Andere I/O-Hardware unterstützt verschiedene ausgefallene Funktionen, die jedoch langsamer sind als die CPU. Daher benötigen sie ein Gleitmittel, das als Puffer zwischen ihnen fungiert, und hier kommt das Gedächtnis ins Spiel.

In modernen Betriebssystemen ist Multitasking zum Standard geworden. Multitasking-Parallelität verbessert die CPU-Auslastung erheblich, führt aber auch zu Konflikten bei Speicheroperationen zwischen mehreren Prozessen. Das Konzept des virtuellen Speichers soll dieses Problem lösen.

Virtueller Linux-Speicher, verstehen Sie das gut?

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

Das Betriebssystem verfügt über einen Teil des physischen Speichers (den mittleren Teil) und zwei Prozesse (eigentlich mehr) P1 und P2. Das Betriebssystem teilt P1 bzw. P2 heimlich mit, dass mein gesamter Speicher Ihnen gehört. Verwenden Sie ihn nach Belieben und verwalten Sie ihn . genug. Aber tatsächlich hat das Betriebssystem einfach einen großen Kuchen für sie gezogen. Diese Speicher sollen an P1 und P2 vergeben worden sein, tatsächlich erhielten sie jedoch nur eine Seriennummer. Erst wenn P1 und P2 tatsächlich beginnen, diese Speicher zu verwenden, beginnt das System, sich zu bewegen und die verschiedenen Blöcke für den Prozess zusammenzusetzen. P2 glaubt, dass es A-Speicher verwendet, aber tatsächlich wurde es stillschweigend auf den echten B umgeleitet Das System weiß es nicht, selbst wenn P1 und P2 den C-Speicher teilen.

Diese Methode von Betriebssystemen, Prozesse zu täuschen, ist der virtuelle Speicher. Bei Prozessen wie P1 und P2 denken sie alle, dass sie den gesamten Speicher belegen, und sie wissen nicht und müssen sich nicht darum kümmern, welche Adresse des physischen Speichers sie verwenden.

Paginierung und Seitentabellen

Virtueller Speicher ist ein Konzept im Betriebssystem. Für das Betriebssystem ist virtueller Speicher eine Vergleichstabelle. Wenn P1 die Daten in Speicher A erhält, sollte es zur Adresse A des physischen Speichers gehen und nach den Daten im Speicher suchen B. Es sollte an die C-Adresse des physischen Speichers gehen.

Wir wissen, dass die Grundeinheit im System Byte ist. Wenn jedes Byte des virtuellen Speichers der Adresse des physischen Speichers zugeordnet wird, erfordert jeder Eintrag mindestens 8 Byte (virtuelle 32-Bit-Adresse -> physische 32-Bit-Adresse). Im Fall von 4G-Speicher werden 32 GB Speicherplatz zum Speichern der Vergleichstabelle benötigt, sodass diese Tabelle zu groß ist, um auch nur die tatsächliche physische Adresse aufzunehmen. Daher hat das Betriebssystem das Konzept von 页(Page) eingeführt.

Beim Systemstart unterteilt das Betriebssystem den gesamten physischen Speicher in Seiten in Einheiten von 4 KB. Wenn der Speicher in Zukunft zugewiesen wird, ist die Einheit eine Seite, sodass die Zuordnungstabelle der virtuellen Speicherseiten, die den physischen Speicherseiten entspricht, stark reduziert wird. Für einige Prozesse ist kein virtueller Speicher erforderlich Sie müssen die Zuordnungsbeziehung speichern, und Linux entwirft auch eine mehrstufige Seitentabelle für großen Speicher, die ausgelagert werden kann, um den Speicherverbrauch zu reduzieren. Die Zuordnungstabelle zwischen dem virtuellen Speicher des Betriebssystems und dem physischen Speicher wird 页表 genannt.

Speicheradressierung und -zuweisung

Wir wissen, dass jeder Prozess durch den virtuellen Speichermechanismus denkt, dass er den gesamten Speicher belegt. Wenn der Prozess auf den Speicher zugreift, wandelt das Betriebssystem die vom Prozess bereitgestellte virtuelle Speicheradresse in eine physische Adresse um und erhält dann die Daten an der entsprechenden physischen Adresse. In der CPU gibt es eine Hardware, die speziell zum Übersetzen virtueller Speicheradressen verwendet wird. Die CPU legt außerdem eine Cache-Strategie für die Adressierung der Seitentabelle fest. Aufgrund der Lokalität des Programms kann seine Cache-Trefferquote 98 % erreichen. 内存管理单元 MMU(Memory Management Unit)

Die obige Situation ist die Zuordnung einer virtuellen Adresse zu einer physischen Adresse im Seitentabellenspeicher. Wenn die physische Adresse, auf die der Prozess zugreift, nicht zugewiesen wurde, generiert das System ein

. Während der Interrupt-Verarbeitung wechselt das System in den Kernel-Status um die virtuelle Adresse für den Prozess zuzuweisen. 缺页中断

Funktion


Der virtuelle Speicher löst nicht nur das Problem von Speicherzugriffskonflikten zwischen mehreren Prozessen durch Speicheradressübersetzung, sondern bringt auch weitere Vorteile mit sich.

Prozessspeicherverwaltung

Es hilft bei der Verwaltung des Gedächtnisses, was sich hauptsächlich widerspiegelt in:

  • Speicherintegrität: Aufgrund der „Täuschung“ des virtuellen Speichers im Prozess geht jeder Prozess davon aus, dass der Speicher, den er erhält, eine kontinuierliche Adresse ist. Wenn wir eine Anwendung schreiben, müssen wir die Zuweisung großer Adressblöcke nicht berücksichtigen. Wir gehen immer davon aus, dass das System über genügend große Speicherblöcke verfügt.
  • Sicherheit: Wenn ein Prozess auf den Speicher zugreift, muss er über die Seitentabelle angesprochen werden. Das Betriebssystem kann eine Speicherberechtigungskontrolle implementieren, indem es jedem Element in der Seitentabelle verschiedene Zugriffsberechtigungsflags hinzufügt.

Datenaustausch

Es ist einfacher, Speicher und Daten über den virtuellen Speicher zu teilen.

Wenn ein Prozess eine Systembibliothek lädt, reserviert er immer zuerst einen Teil des Speichers und lädt die Bibliotheksdatei auf der Festplatte direkt in diesen Speicher, da die physische Speicheradresse eindeutig ist, auch wenn das System dies feststellt Dieselbe Bibliothek befindet sich im System. Sie wurde zweimal geladen, aber der von jedem Prozess angegebene Ladespeicher war unterschiedlich und das System konnte nichts tun.

Bei Verwendung von virtuellem Speicher muss das System nur die virtuelle Speicheradresse des Prozesses auf die physische Speicheradresse verweisen, an der sich die Bibliotheksdatei befindet. Wie in der Abbildung oben gezeigt, zeigen die B-Adressen der Prozesse P1 und P2 beide auf die physische Adresse C.

Es ist auch sehr einfach, gemeinsam genutzten Speicher zu verwenden, indem der virtuelle Speicher verwendet wird. 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 durch Seitenfehler-Interrupts immer begrenzt ist. 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 ist, der verfügbare Speicher jedoch nicht ausreicht, werden die vorübergehend nicht verwendeten Speicherdaten zuerst auf der Festplatte abgelegt, sodass Prozesse, die sie benötigen, zuerst verwendet werden können. und dann muss der Prozess sie erneut verwenden. Durch diese „Austausch“-Technologie kann Linux dem Prozess ermöglichen, mehr Speicher zu verwenden.

FAQ


Ich hatte auch viele Fragen zum Verständnis des virtuellen Gedächtnisses.

32-Bit und 64-Bit

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

Die CPU greift über einen physischen Bus auf den Speicher zu, sodass der Bereich der Zugriffsadressen durch die Anzahl der Maschinenbusse begrenzt ist. Auf einer 32-Bit-Maschine gibt es 32 Busse, die die Bits 1 und 1 repräsentieren 0 bzw. Die maximal zugängliche Adresse beträgt 2 ^ 32 Bit = 4 GB. Daher ist es ungültig, auf einem 32-Bit-Computer Speicher mit mehr als 4 GB einzufügen, und die CPU kann nicht auf Speicher mit mehr als 4 GB zugreifen.

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

Gemäß dem Konzept des virtuellen Speichers ist es in Ordnung, 64-Bit-Software auf einem 32-Bit-System auszuführen. Aufgrund des strukturellen Designs des Systems für virtuelle Speicheradressen können virtuelle 64-Bit-Adressen jedoch nicht in 32-Bit verwendet werden Systeme.

Physischen Speicher direkt bedienen

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

Linux ordnet jedes Gerät /dev/ 目录下的文件,我们可以通过这些设备文件直接操作硬件,内存也不例外。在 Linux 中,内存设置被映射为 /dev/mem zu, 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 VIRT-Spalte eine große Menge virtuellen Speichers belegt.

Virtueller Linux-Speicher, verstehen Sie das gut?

Der Grund für dieses Problem liegt darin, dass Java den Arena-Speicherpool von Glibc verwendet, um eine große Menge an virtuellem Speicher zuzuweisen und ihn nicht zu verwenden. Darüber hinaus werden von Java gelesene Dateien auch im virtuellen Speicher abgebildet. In der Standardkonfiguration der virtuellen Maschine belegt jeder Java-Thread-Stack 1 MB virtuellen Speicher. Für Details können Sie nachlesen, warum Multithread-Programme unter Linux so viel virtuellen Speicher verbrauchen.

Der tatsächlich belegte physische Speicher hängt von der Spalte RES (resident) ab. Der Wert dieser Spalte ist die Größe, die tatsächlich dem physischen Speicher zugeordnet ist.

Häufig verwendete Verwaltungsbefehle


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

Systemspeicherstatus anzeigen

Es gibt viele Möglichkeiten, den Systemspeicherstatus zu überprüfen freevmstat und andere Befehle können den Speicherstatus des aktuellen Systems ausgeben. Es ist zu beachten, dass der verfügbare Speicher nicht nur die freie Spalte ist , eine große Anzahl von Puffern/Cache wird verwendet, wenn der Prozess nicht ausgeführt wird. Nach der Wiederverwendung werden sie nicht sofort bereinigt. Wenn der Prozess, der sie zuvor verwendet hat, weiterhin verwendet werden kann, können sie bei Bedarf auch ausgenutzt werden .

Darüber hinaus können Sie über cat /proc/meminfo die Details der Systemspeichernutzung anzeigen, einschließlich des Status verschmutzter Seiten usw. Einzelheiten finden Sie unter: /PROC/MEMINFO Mystery.

pmap

Wenn Sie die Verteilung des virtuellen Speichers eines bestimmten Prozesses einzeln 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.

Sie können -XX Parameter hinzufügen, um detailliertere Informationen auszugeben.

Speicherkonfiguration ändern

Wir können auch die Linux-Systemkonfiguration ändern und die Dateien im Verzeichnis sysctl vm [-options] CONFIG 或 直接读写 /proc/sys/vm/ verwenden, um die Konfiguration anzuzeigen und zu ändern.

SWAP-Betrieb

Die SWAP-Funktion des virtuellen Speichers ist nicht immer vorteilhaft, wenn dem Prozess ermöglicht wird, kontinuierlich große Datenmengen zwischen Speicher und Festplatte auszutauschen, was die CPU stark belastet und die Betriebseffizienz des Systems verringert. Daher möchten wir manchmal keinen Swap verwenden.

Wir können den Befehl vm.swappiness=0 来设置内存尽量少使用 swap,或者干脆使用 swapoff ändern, um SWAP zu deaktivieren.

Zusammenfassung


Das Konzept des virtuellen Speichers ist sehr einfach zu verstehen, es werden jedoch eine Reihe sehr komplexer Erkenntnisse daraus abgeleitet. In diesem Artikel werden nur einige Grundprinzipien erläutert und viele Details übersprungen, z. B. die Verwendung von Mittelsegmentregistern bei der Adressierung des virtuellen Speichers, die Verwendung des virtuellen Speichers durch das Betriebssystem zur Verbesserung von Cache- und Pufferanwendungen usw. Wenn es eine Gelegenheit gibt, werde ich Ich werde separat darüber sprechen.

Das obige ist der detaillierte Inhalt vonVirtueller Linux-Speicher, verstehen Sie das gut?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen