GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux Memory Management – ​​Swapping, Caches und Shared VM

Dieser Artikel ist Teil unserer laufenden UNIX-Kernel-Übersichtsserie.

Im vorherigen Artikel der Kernel-Reihe haben wir über den virtuellen Linux-Speicher und das Demand-Paging gesprochen.

Obwohl virtueller Speicher und Bedarfspaging die Bausteine ​​des Linux-Speicherverwaltungssystems sind, gibt es verschiedene andere Konzepte, die die Linux-Speicherverwaltung sehr leistungsfähig machen.

In diesem Artikel werden wir versuchen, einige dieser Konzepte (Swapping, Caching und Shared Virtual Memory) anzusprechen.

Ich. Linux-Swapping

Angenommen, es gibt eine Situation, in der ein Prozess eine seiner virtuellen Seiten im physischen Speicher haben muss, aber der physische Speicher keinen Platz mehr hat, um weitere Seiten einzubringen.

Was passiert in diesem Fall?

Nun, das Betriebssystem muss diese Situation bewältigen, indem es zulässt, dass sich diese Seite im physischen Speicher befindet. Aber dazu muss eine Seite, die sich bereits im physischen Speicher befindet, verworfen werden.

Wenn nun die zu verwerfende Seite aus einem ausführbaren Bild oder einer Datendatei stammt und auf die Seite nicht geschrieben wurde, kann sie bei Bedarf einfach verworfen werden, dieselbe Seite kann einfach aus derselben ausführbaren Datei in den physischen Speicher zurückgebracht werden Bild- oder Datendatei.

Aber nehmen wir an, die Seite, die das Betriebssystem verwerfen wird, ist diejenige, auf die geschrieben wurde, dann wird diese Art von Seite als schmutzige Seite bezeichnet.

Eine schmutzige Seite muss aufbewahrt werden, um sie zu einem späteren Zeitpunkt zu verwenden. Wenn schmutzige Seiten aus dem physischen Speicher gelöscht werden, werden sie in einer speziellen Datei gespeichert, die als Auslagerungsdateien bekannt ist. Dies wird als Swapping bezeichnet .

Die Zeit, die für den Zugriff auf eine Auslagerungsseite benötigt wird, ist im Vergleich zur Prozessorgeschwindigkeit ziemlich beträchtlich.

Wir sehen also, dass das Betriebssystem einen guten Auslagerungsalgorithmus haben sollte, um zwischen Verwerfen und Auslagern zu entscheiden. Ein ineffizienter Auslagerungsalgorithmus kann zu einem Phänomen führen, bei dem das Betriebssystem so sehr damit beschäftigt ist, Dateien auszutauschen und dann wieder in den physischen Speicher zurückzulesen, dass es tatsächlich sehr weniger Zeit für die eigentliche Arbeit aufwendet, die die Verarbeitungsanforderungen erfordern. Dieses Phänomen wird als Thrashing bezeichnet .

Außerdem wird ein Satz von Seiten, den ein Prozess kontinuierlich verwendet, als Arbeitssatz bezeichnet. Ein guter Swap-Algorithmus würde das Betriebssystem selten ins Trudeln bringen und würde auch sicherstellen, dass der Arbeitssatz aller Prozesse immer im physischen Speicher vorhanden ist.

Linux entscheidet, welche Seiten im Speicher gehalten und welche entfernt werden, nach dem Schema „Zuletzt verwendet ‘.

Bei diesem Schema ist jeder Seite im physikalischen Speicher ein Alter zugeordnet. Das Alter ändert sich mit der Tatsache, ob die Seite aufgerufen wird oder nicht. Wenn auf die Seite häufig zugegriffen wird, sollte diese Seite ziemlich jung sein, während, wenn auf eine Seite nicht zugegriffen wird, diese Seite älter wird. Die älteren Altersseiten werden zum Auslagern/Verwerfen aus dem physischen Speicher angeboten.

II. Caches

Um das Beste aus dem System herauszuholen, werden schnelle Prozessoren und Betriebssysteme entwickelt. Das ist zwar gut, aber ein Aspekt, der den Prozessor, das Betriebssystem und ihre Interaktion schneller macht, ist das Konzept der Caches.

Einige der wichtigen Caches in Linux werden unten beschrieben.

1. Linux-Swap-Cache

Wie bereits oben besprochen, werden nur schmutzige Seiten ausgetauscht, da wir die geänderten Seiten behalten müssen. Nehmen wir auch an, wenn eine Seite geändert und ausgetauscht wurde, jetzt, wenn dieselbe Seite wieder in den physischen Speicher gebracht wurde und sie jetzt erneut ausgetauscht werden muss, die Seite jedoch nicht weiter geändert wurde, besteht keine Notwendigkeit, dies auszutauschen Seite. Verwerfen Sie es einfach, da diese Version der Seite bereits in der Auslagerungsdatei vorhanden ist. Dies spart viel Zeit, die sonst verschwendet worden wäre.

Um nun das obige Konzept zu implementieren, verwendet Linux den Swap-Cache.

  • Ein Swap-Cache ist nichts anderes als eine Liste von Seitentabelleneinträgen mit einem Eintrag pro physikalischer Seite.
  • Jeder Eintrag entspricht einer ausgelagerten Seite zusammen mit den Informationen über die Auslagerungsdatei, in der die Seite zusammen mit ihrer genauen Position in der Auslagerungsdatei gehalten wird.
  • Wenn irgendein Seitentabelleneintrag im Swap-Cache ungleich Null ist, stellt er eine Seite dar, die in einer Swap-Datei gehalten wird und diese Seite nicht weiter modifiziert wurde.
  • Wenn eine Seite ihren Eintrag im Swap-Cache hat und weiter modifiziert wird, wird ihr Eintrag aus dem Swap-Cache entfernt.
  • Auf diese Weise enthält der Cache nur Informationen zu den Seiten, die seit dem letzten Austausch nicht geändert wurden.

Wir sehen also, dass der Swap-Cache sehr dazu beiträgt, die Effizienz des Swap-Mechanismus zu steigern.

2. Hardware-Cache

Wie wir bereits im vorherigen Artikel besprochen haben, liest ein Prozessor Seitentabelleneinträge, um eine virtuelle Adresse in eine physikalische Adresse umzuwandeln. Normalerweise speichert ein Prozessor die Informationen von Seitentabelleneinträgen in einem Hardware-Cache .

Dieser Hardware-Cache besteht aus Translational Look-aside Buffers oder TLB s.

Wann immer ein Prozessor eine virtuelle Adresse übersetzen muss, versucht er, die Seitentabelleneintragsinformationen von den TLBs abzurufen. Wenn es den Eintrag findet, fährt es fort, aber wenn der Prozessor keinen solchen Eintrag finden kann, teilt es dem Betriebssystem mit, dass ein TLB-Fehlschlag aufgetreten ist, und bittet das Betriebssystem, die Dinge zu beheben.

Um diese Informationen über den TLB-Fehltreffer an das OS zu liefern, wird eine Art Ausnahmemechanismus verwendet, der prozessorabhängig ist. Nun findet das Betriebssystem den richtigen Eintrag und aktualisiert damit den TLB-Eintrag. Wenn die Ausnahme behoben ist (nachdem das Betriebssystem das Problem behoben hat), versucht der Prozessor erneut, die TLBs nach dem Eintrag zu durchsuchen, und dieses Mal findet er einen gültigen Eintrag.

3. Linux-Puffer-Cache

Ein Puffer-Cache enthält Datenpuffer, die die Blockgerätetreiber verwenden.

Ein Blockgerätetreiber ist einer, der auf Datenblöcken arbeitet, d. h. auf ihn kann zugegriffen werden, indem feste Blöcke oder Datenblöcke gelesen oder geschrieben werden. Ein Puffer-Cache wird indiziert. Die Gerätekennung wird für die Indizierung verwendet.

Der Puffer-Cache macht das Lesen/Schreiben sehr effizient und schnell. Betrachten Sie beispielsweise ein Blockgerät, beispielsweise eine Festplatte. Das Lesen/Schreiben einer Festplatte erfordert Datei-I/O, was ziemlich teuer ist, wenn wir es bei jedem Lese- oder Schreibvorgang auf der Festplatte tun. Dieser Puffer-Cache, der dazwischen sitzt, spart Zeit, da Lese- und Schreibvorgänge darauf ausgeführt werden und der Rest vom Cache erledigt wird.

Um Swap, Memory, Page, Block IO, Traps, Disks und CPU-Aktivität anzuzeigen, können Sie Tools wie vmstat oder sar verwenden.

III. Gemeinsam genutzter virtueller Speicher

Beim Schreiben von Code wird von den Entwicklern sehr darauf geachtet, dass kein Codeabschnitt unnötig wiederholt wird. Beispielsweise werden Funktionen in Programmen verwendet, damit derselbe Codeabschnitt jederzeit innerhalb des Codes aufgerufen werden kann.

Eine Gruppe von Funktionen, die allgemein verwendet werden können, sind in Bibliotheken zusammengefasst. Dazu kommt das Konzept des gemeinsam genutzten Speichers, der einmal in den Speicher geladen wird und von mehreren Prozessen verwendet werden kann.

Virtueller Speicher macht es Prozessen leicht, Speicher gemeinsam zu nutzen. Dies liegt daran, dass die physische Adresse durch Seitentabellen abgebildet wird und es sehr wahrscheinlich ist, dass dieselbe physische Seitenrahmennummer in Seitentabellen mehrerer Prozesse abgebildet wird. Dieses Konzept ist als gemeinsam genutzter virtueller Speicher bekannt .


Linux
  1. Linux-Speichernutzung

  2. ipcs-Befehlsbeispiele unter Linux

  3. CPU-Auslastung und Speicherauslastung eines einzelnen Prozesses unter Linux abrufen?

  4. Was sind speicherabgebildete Seiten und anonyme Seiten?

  5. Gemeinsamer Linux-Speicher:shmget() vs. mmap()?

Plesk CPU- und Speicherüberwachung

So überprüfen Sie den gemeinsam genutzten Linux-Speicher mit dem ipcs-Befehl

Linux-Paketverwaltung mit YUM und RPM

Linux-Speicherverwaltung – Virtueller Speicher und Demand Paging

So verwenden Sie Shared Memory mit Linux in C

Führt Linux opportunistisches Swapping durch oder ist es ein Mythos?