Sind Sie schon einmal auf verschiedene Speicherprobleme in Linux-Systemen gestoßen? Wie Speicherlecks, Speicherfragmentierung usw. Diese Probleme können durch ein umfassendes Verständnis des Speicherrecyclingmechanismus des Linux-Kernels gelöst werden.
Egal wie viel Speicher auf dem Computer vorhanden ist, er reicht nicht aus. Daher muss der Linux-Kernel einige selten verwendete Speicherseiten zurückfordern, um sicherzustellen, dass das System weiterhin Speicher verwendet. Es gibt drei Methoden zum Seitenrecycling: Seitenrückschreiben, Seitenaustausch und Seitenverwerfen: Wenn der Sicherungsspeicher einer selten verwendeten Seite ein Blockgerät ist (z. B. eine Dateizuordnung), kann der Speicher direkt mit dem Blockgerät synchronisiert werden, um ihn freizugeben Die Seite kann wiederverwendet werden. Wenn die Seite keinen Sicherungsspeicher hat, kann sie auf eine bestimmte Auslagerungspartition und dann wieder in den Speicher ausgelagert werden, wenn der Sicherungsspeicher der Seite eine Datei ist. Da der Inhalt der Datei im Speicher jedoch nicht geändert werden kann (z. B. eine ausführbare Datei), kann er direkt verworfen werden, wenn er derzeit nicht benötigt wird.
2.1 Seitenrahmen-Recycling
LRU (Least Recent Used), die am wenigsten kürzlich verwendete verknüpfte Liste, wird nach der jüngsten Verwendung geordnet. Die am wenigsten verwendete Liste befindet sich am Ende der verknüpften Liste, was durch die folgende Makrodefinition ersichtlich ist:
#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))
Jede Zone verfügt über 5 LRU-verknüpfte Listen zum Speichern verschiedener zuletzt verwendeter Seiten.
Aufzählung lru_list {
LRU_INACTIVE_ANON = LRU_BASE,
LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE,
LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE,
LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
Darunter können die Seiten in den vier verknüpften Listen INACTIVE_ANON, ACTIVE_ANON, INACTIVE_FILE und ACTIVE_FILE recycelt werden. ANON steht für anonyme Zuordnung, kein Sicherungsspeicher; FILE steht für Dateizuordnung.
Beim Recycling von Seiten werden zuerst INAKTIVE Seiten recycelt. Nur wenn nur sehr wenige INAKTIVE Seiten vorhanden sind, werden AKTIVE Seiten für das Recycling berücksichtigt.
Um die Aktivität der Seite auszuwerten, führt der Kernel zwei Flags ein, PG_referend und PG_active. Warum brauchen wir zwei Bits? Angenommen, nur ein PG_active wird verwendet, um zu identifizieren, ob die Seite aktiv ist. Dieses Bit wird gesetzt, wenn auf die Seite zugegriffen wird. Wann ist es jedoch gelöscht? Dies erfordert die Wartung einer großen Anzahl von Kernel-Timern, und dieser Ansatz ist zum Scheitern verurteilt.
Ein eleganterer Ansatz kann mit zwei Flags implementiert werden: Eines zeigt den aktuellen Aktivitätsgrad an und eines gibt an, ob kürzlich darauf verwiesen wurde. Die folgende Abbildung veranschaulicht den grundlegenden Algorithmus.
Grundsätzlich gibt es folgende Schritte: Wobei Shrink_page_list der Prozess des tatsächlichen Recyclings von Seiten ist 4.1 kswapd Kurz gesagt ist der Speicherrecyclingmechanismus des Linux-Kernels ein sehr wichtiges Konzept, das Ihnen helfen kann, die Speicherverwaltung in Linux-Systemen besser zu verstehen. Wenn Sie mehr über dieses Konzept erfahren möchten, können Sie sich die in diesem Artikel bereitgestellten Ressourcen ansehen. (1)《Den Linux-Kernel verstehen》
(1) Wenn die Seite aktiv ist, setzen Sie das PG_active-Bit und speichern Sie es in der ACTIVE LRU-Liste; andernfalls setzen Sie es auf INACTIVE
(2) Bei jedem Zugriff auf die Seite wird das PG_referenced-Bit gesetzt. Die Funktion mark_page_accessed ist für diese Arbeit verantwortlich
(3) PG_referenced und die durch die umgekehrte Zuordnung bereitgestellten Informationen werden verwendet, um den Grad der Seitenaktivität zu bestimmen. Jedes Mal, wenn dieses Bit gelöscht wird, wird der Grad der Seitenaktivität erkannt
(4) Geben Sie mark_page_accessed erneut ein. Wenn festgestellt wird, dass PG_referenced festgelegt wurde, bedeutet dies, dass page_referenced nicht überprüft wird, sodass mark_page_accessed häufiger aufgerufen wird als page_referenced, was bedeutet, dass häufig auf die Seite zugegriffen wird. Wenn sich die Seite in der verknüpften Liste INACTIVE befindet, verschieben Sie sie auf ACTIVE. Außerdem wird das Flag PG_active gesetzt und PG_referenced gelöscht
(5) Eine umgekehrte Übertragung ist auch möglich. Wenn die Seitenaktivität nachlässt, kann page_referenced zweimal hintereinander aufgerufen werden, ohne dass dazwischen mark_page_accessed erfolgt.
Wenn der Zugriff auf eine Speicherseite stabil ist, sind die Aufrufe von page_referenced und mark_page_accessed von Natur aus ausgeglichen und die Seite bleibt in der aktuellen LRU-Liste. Diese Lösung stellt außerdem sicher, dass Speicherseiten nicht schnell zwischen ACTIVE- und INACTIVE-verknüpften Listen wechseln.
2.2 Slab****-Cache-Recycling
Das Slab-Cache-Recycling ist relativ flexibel und alle in Shrinker_list registrierten Methoden werden ausgeführt.
Der Kernel registriert standardmäßig die prune_super-Methode für jedes Dateisystem. Diese Funktion wird verwendet, um den Dentry- und Inode-Cache zu recyceln, der nicht mehr im Dateisystem verwendet wird
Der Lowmemorykiller-Mechanismus von Android registriert eine Methode zum selektiven Beenden von Prozessen und zum Zurückgewinnen des vom Prozess verwendeten Speichers.
3****So recyceln Sie Seitenrahmen4 Häufigkeit des regelmäßigen Recyclings
kswapd ist ein Speicherrecycling-Thread, der vom Kernel für jeden Speicherknoten erstellt wird. Warum ist ein periodisches Recycling erforderlich, wenn es einen Recyclingmechanismus gibt? Da einige Speicherzuweisungen das Warten auf die Wiederherstellung nicht blockieren dürfen, z. B. Speicherzuweisungen in Interrupt- und Ausnahmehandlern, dürfen einige Speicherzuweisungen den E/A-Zugriff nicht aktivieren. Nur in wenigen Fällen von Speichermangel kann der Recyclingprozess vollständig ausgeführt werden. Daher ist es unbedingt erforderlich, die Leerlaufzeit des Systems zu nutzen, um Speicher zurückzugewinnen.
Diese Funktion zeichnet die im letzten Ausgleichsvorgang verwendete Zuordnungsreihenfolge auf, wenn kswapd_max_order größer als der letzte Wert oder classzone_idx kleiner als der letzte Wert ist, wird balance_pgdat aufgerufen, um die Speicherdomäne erneut auszugleichen. Die Ruhezeit beträgt HZ/10, für den Arm (HZ=100) beträgt die Ruhezeit 1 ms.
balance_pgdat gleicht den Vorgang bis zur Zone_wartermark_ok der Speicherdomäne aus.
4.2 Cache_Reap
Cache_reap wird verwendet, um inaktive Objekte in der Platte wiederzuverwenden. Wenn die inaktiven Objekte auf einer Seite wiederhergestellt werden können, werden sie wieder an das Buddy-System freigegeben. Bei jedem Aufruf von „cache_reap“ werden alle „slab_caches“ durchlaufen und dann für 2*HZ in den Ruhezustand versetzt. Für Arm (HZ=100) beträgt der Zyklus 20 ms. 5 Referenzen
(2)《professionelle Linux-Kernel-Architektur》
Das obige ist der detaillierte Inhalt vonSpeicherrecyclingmechanismus des Linux-Kernels: Vertiefendes Verständnis der Speicherverwaltung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!