Heim >System-Tutorial >LINUX >Eingehende Analyse der Prinzipien des virtuellen Linux-Speichers, verabschieden Sie sich von Problemen mit unzureichendem Speicher!

Eingehende Analyse der Prinzipien des virtuellen Linux-Speichers, verabschieden Sie sich von Problemen mit unzureichendem Speicher!

王林
王林nach vorne
2024-02-09 13:21:31803Durchsuche

Vor ein paar Tagen kam ein anderer Kollege, um eine weitere Frage zum virtuellen Gedächtnis zu stellen. Ich stellte fest, dass mein Verständnis des virtuellen Gedächtnisses nicht tief genug war und einige Konzepte etwas widersprüchlich waren. Also ging ich die Informationen durch und ordnete dieses Wissen neu, in der Hoffnung, dass ich sie beim nächsten Mal reibungsloser nutzen kann.

Linux 虚拟内存原理深度解析,从此告别内存不足问题!

Vor nicht allzu langer Zeit gab es in der Gruppe einen weiteren Austausch, auf den ich mich gefreut habe: „Linux Virtual Memory“. Eines Abends, als wir Überstunden machten, diskutierten wir über das Konzept des virtuellen Gedächtnisses. Nachdem der Leiter herausfand, dass mehrere Kollegen das virtuelle Gedächtnis nicht klar verstanden, wählte er das Thema speziell für diesen Studenten aus (lachend).

Ich habe schon vorher einige Konzepte über Betriebssysteme gelernt, hauptsächlich weil ich mich über die verschwendeten vier Studienjahre nach dem Abschluss geärgert habe. Mir tat mein Hintergrund in der Informatik ein wenig leid, also habe ich mir nach der Arbeit die Zeit genommen, das Öffnen des Betriebssystems zu beobachten Klasse des Harbin Institute of Technology im NetEase Cloud Classroom habe ich auch ein relativ oberflächliches Buch über Betriebssysteme gelesen, „Linux Kernel Design and Implementation“, und als ich letztes Jahr einen einfachen Server in C geschrieben habe, habe ich auch mehr über das zugrunde liegende gelernt Kenntnis des Systems. Dank dieses Wissens habe ich ein besseres Gefühl der Kontrolle über das Wissen der Anwendungsschicht und es hat mir auch beim letzten Mal bei der Fehlerbehebung geholfen.

Vor ein paar Tagen kam ein anderer Kollege, um eine weitere Frage zum virtuellen Gedächtnis zu stellen. Ich stellte fest, dass mein Verständnis des virtuellen Gedächtnisses nicht tief genug war und einige Konzepte etwas widersprüchlich waren. Also ging ich die Informationen durch und ordnete dieses Wissen neu, in der Hoffnung, dass ich sie beim nächsten Mal reibungsloser nutzen kann.

Der Ursprung des virtuellen Speichers

Es besteht kein Zweifel, dass der virtuelle Speicher definitiv eines der wichtigsten Konzepte im Betriebssystem ist. Ich denke, das liegt vor allem an der wichtigen „strategischen Position“ des Gedächtnisses. Die CPU ist zu schnell, hat aber eine geringe Kapazität und eine einzige Funktion. Andere I/O-Hardware unterstützt verschiedene ausgefallene Funktionen, aber sie sind im Vergleich zur CPU zu langsam. Zwischen ihnen wird also ein Gleitmittel als Puffer benötigt, und hier kommt das Gedächtnis ins Spiel.

In modernen Betriebssystemen ist Multitasking Standard. Multitasking-Parallelität verbessert die CPU-Auslastung erheblich, führt aber auch zu Konflikten bei Speicheroperationen zwischen mehreren Prozessen. Zur Lösung dieses Problems wurde das Konzept des virtuellen Speichers vorgeschlagen.

Linux 虚拟内存原理深度解析,从此告别内存不足问题!

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. Wenn P1 die Daten im A-Speicher erhält, sollte er zur A-Adresse des physischen Speichers gehen, um die Daten im B-Speicher zu finden . 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. Daher ist diese Tabelle zu groß, um auch nur die tatsächliche physische Adresse aufzunehmen. 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. 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 des virtuellen Speichers des Betriebssystems zum physischen Speicher wird als Seitentabelle bezeichnet.

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 befindet sich eine Hardware, die Speicherverwaltungseinheit MMU (Memory Management Unit), die speziell zum Übersetzen virtueller Speicheradressen verwendet wird. Die CPU legt auch eine Cache-Strategie für die Adressierung der Seitentabelle fest. Aufgrund der Lokalität des Programms kann seine Cache-Trefferquote 98 % erreichen.

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 einen Seitenfehler-Interrupt Der Kernel-Status für die Prozessvirtualisierung weist eine physische Adresse zu.

Funktion

Der virtuelle Speicher löst nicht nur das Problem von Speicherzugriffskonflikten zwischen mehreren Prozessen durch Speicheradressenü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 es sich bei dem erhaltenen Speicher um eine kontinuierliche Adresse handelt. 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 der physische 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, ihn zuerst verwenden 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 Speichers.

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, daher ist der Bereich der Zugriffsadressen durch die Anzahl der Maschinenbusse begrenzt. Auf einer 32-Bit-Maschine gibt es 32 Busse, die die Bits 1 und 1 darstellen 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 einer Datei im Verzeichnis /dev/ zu. Wir können die Hardware direkt über diese Gerätedateien bedienen, und der Speicher bildet da keine Ausnahme. Unter Linux werden die Speichereinstellungen /dev/mem zugeordnet, 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 virtuellen Speichers belegt.

Linux 虚拟内存原理深度解析,从此告别内存不足问题!

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 tatsächliche Größe, die 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, z. B. free und vmstat. Es ist zu beachten, dass der verfügbare Speicher nicht nur die freie Spalte ist Im Betriebssystem befinden sich viele Puffer/Cache. Prozesse werden nicht sofort bereinigt, nachdem sie nicht mehr verwendet wurden. Wenn die Prozesse, die sie zuvor verwendet haben, weiterhin verwendet werden können, können sie bei Bedarf auch ausgenutzt werden.

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

pmap

Wenn Sie die Verteilung des virtuellen Speichers eines 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, sysctl vm [-options] CONFIG verwenden oder Dateien im Verzeichnis /proc/sys/vm/ direkt lesen und schreiben, 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 beansprucht und die Betriebseffizienz des Systems verringert. Daher möchten wir manchmal keinen Swap 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 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 vonEingehende Analyse der Prinzipien des virtuellen Linux-Speichers, verabschieden Sie sich von Problemen mit unzureichendem Speicher!. 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