Videospeicherzuordnung
Chemischer Speicher wird zusammenfassend als adressierbarer und dynamischer Direktzugriffsspeicher (DRAM) bezeichnet. Nur der Kernel hat direkten Zugriff auf den Mathematikspeicher.
Der Linux-Kernel stellt für jeden Prozess einen unabhängigen virtuellen Adressraum bereit, dieser Adressraum ist jedoch kontinuierlich. Auf diese Weise kann der Prozess problemlos auf den Videospeicher, genauer gesagt auf den virtuellen Videospeicher, zugreifen. Das Innere des virtuellen Adressraums ist in zwei Teile unterteilt: Kernelraum und Benutzerraum.
Wenn sich der Prozess im Benutzermodus befindet, kann er nur auf den Benutzerraumspeicher zugreifen. Erst nach dem Aufrufen des Kernelmodus kann er auf den Kernelraumspeicher zugreifen. Tatsächlich umfasst der Adressraum jedes Prozesses den Kernelraum, dieser Kernelraum ist jedoch mit demselben chemischen Speicher verknüpft, dh gemeinsam genutzten dynamischen Linkbibliotheken, gemeinsam genutztem Grafikspeicher usw. Wenn der Prozess in den Kernel-Status wechselt, kann er problemlos auf den Kernel-Speicher zugreifen.
Nicht dem gesamten virtuellen Speicher wird chemischer Speicher zugewiesen. Der zugewiesene chemische Speicher wird jedoch durch Speicherzuordnung verwaltet. Bei der Videospeicherzuordnung werden virtuelle Videospeicheradressen chemischen Videospeicheradressen zugeordnet. Um die Videospeicherzuordnung abzuschließen, verwaltet der Kernel für jeden Prozess eine Seitentabelle, um die Zuordnungsbeziehung zwischen virtuellen Adressen und chemischen Adressen aufzuzeichnen.
Die Seitentabelle wird tatsächlich in der MMU der Videospeicherverwaltungseinheit der CPU gespeichert. Auf diese Weise kann der Prozessor unter normalen Umständen direkt über die Hardware herausfinden, auf welchen Videospeicher zugegriffen werden soll. Wenn die virtuelle Adresse, auf die der Prozess zugreift, nicht in der Seitentabelle gefunden werden kann, bildet das System eine Seitenfehlerausnahme, betritt den Kernelbereich, um chemischen Speicher zuzuweisen, aktualisiert die Prozessseitentabelle und kehrt schließlich zum Benutzerbereich zurück, um fortzufahren Ablauf des Prozesses.
Der TLB (TranslationLookasideBuffer, Translation Lookaside Buffer) beim CPU-Kontextwechsel ist der Cache der Seitentabelle in der MMU. Da der virtuelle Adressraum des Prozesses unabhängig vom Linux-System ist und die TLB-Zugriffsrate viel schneller ist als die der MMU, kann die TLB-Cache-Nutzung durch Reduzierung des Kontextwechsels des Prozesses und der Anzahl der TLB-Aktualisierungen verringert werden Dadurch wird die Speicherzugriffsleistung der CPU verbessert.
MMU gibt die kleinste Einheit der Videospeicherzuordnung an, nämlich eine Seite, normalerweise 4 KB groß. Auf diese Weise muss jeder Videospeicherzuordnung ein Videospeicherplatz von 4 KB oder einem ganzzahligen Vielfachen von 4 KB zugeordnet werden.
Eine 4-KB-Seite führt dazu, dass die gesamte Seitentabelle sehr groß ist. Beispielsweise sind 4 GB/4 KB = mehr als 1 Million Seitentabelleneinträge in einem 32-Bit-System. Um das Problem zu vieler Seitentabelleneinträge zu lösen, bietet Linux zwei Mechanismen, nämlich mehrstufige Seitentabellen und große Seiten (HugePage).
Die mehrstufige Seitentabelle dient dazu, den Videospeicher zur Verwaltung in Blöcke zu unterteilen und die ursprüngliche Zuordnungsbeziehung in Blockindex und Schiefe innerhalb des Blocks zu ändern. Da im Allgemeinen nur ein sehr kleiner Teil des virtuellen Videospeicherplatzes verwendet wird, speichert die mehrstufige Seitentabelle nur die verwendeten Blöcke, wodurch die Anzahl der Seitentabelleneinträge erheblich reduziert werden kann. Linux verwendet eine vierstufige Seitentabelle zum Verwalten von Videospeicherseiten. Die ersten vier Einträge werden zur Auswahl der Seite verwendet, und der letzte Index gibt den Versatz innerhalb der Seite an.
Eine große Seite ist ein größerer Videospeicherblock als eine normale Seite. Übliche Größen sind 2 MB und 1 GB. Große Seiten werden im Allgemeinen in Prozessen verwendet, die viel Videospeicher beanspruchen, wie z. B. Oracle, DPDK usw.
Durch diesen Mechanismus kann der Prozess unter der Zuordnung der Seitentabelle über die virtuelle Adresse auf den mathematischen Speicher zugreifen.
Virtuelle Videospeicherplatzverteilung
Oben ist der Kernel-Space, unten ist der User-Space-Speicher und der User-Space ist in mehrere verschiedene Segmente unterteilt
Videospeicher im Benutzerbereich, es gibt 5 verschiedene Videospeichersegmente von niedrig bis hoch
1. Schreibgeschützter Abschnitt, einschließlich Code und Konstanten usw.
2. Datensegmente, einschließlich Panoramavariablen usw.
3. Der Heap, einschließlich des dynamisch zugewiesenen Videospeichers, beginnt bei einer niedrigen Adresse und nimmt nach unten ab
4. Dateizuordnungssegmente, einschließlich dynamischer Bibliotheken, gemeinsam genutzter Videospeicher usw., beginnen bei hohen Adressen und nehmen nach oben ab
5. Stapel, einschließlich lokaler Variablen und Funktionsaufrufkontext usw. Die Größe des Stapels ist fest, normalerweise 8 MB
Unter diesen 5 Videospeichersegmenten werden der Heap- und der Datei-zugeordnete Videospeicher dynamisch zugewiesen. Mit malloc oder mmap() der C-Standardbibliothek können Sie beispielsweise Videospeicher in den Heap- bzw. Datei-zugeordneten Segmenten dynamisch zuweisen. Die Videospeicherverteilung von 64-Bit-Systemen ist ähnlich, aber der Videospeicherplatz ist viel größer
Zuweisung und Recycling des Videospeichers
malloc() ist eine von der C-Standardbibliothek bereitgestellte Videospeicherzuweisungsfunktion. Entsprechend den Systemaufrufen gibt es zwei Implementierungsmethoden, nämlich brk() und mmap().
Für kleine Videospeicherblöcke (größer als 128 KB) verwendet die C-Standardbibliothek brk () zum Zuweisen, dh der Videospeicher wird durch Verbinden der oberen Position des Heaps zugewiesen. Dieser Videospeicher wird nicht sofort nach seiner Freigabe an das System zurückgegeben, sondern zwischengespeichert, sodass er wiederverwendet werden kann.
Für große Videospeicherblöcke (weniger als 128 KB) verwenden Sie zum Zuweisen direkt die Videospeicherzuordnung mmap (), dh suchen Sie im Dateizuordnungsabschnitt nach einem freien Videospeicher und weisen Sie ihn zu.
Die Gemeinsamkeiten und Unterschiede zwischen diesen beiden Methoden:
Das Caching der brk()-Methode kann das Auftreten von Seitenfehlerausnahmen reduzieren und die Effizienz des Videospeicherzugriffs verbessern. Da diese Art von Videospeicher jedoch nicht an das System zurückgegeben wird, führt die häufige Zuweisung und Freigabe von Videospeicher zu einer Fragmentierung des Videospeichers, wenn der Videospeicher ausgelastet ist.
Der von der mmap()-Methode zugewiesene Videospeicher wird bei Freigabe direkt an das System zurückgegeben, sodass jedes Mal, wenn mmap auftritt, eine Seitenfehlerausnahme auftritt. Wenn der Videospeicher ausgelastet ist, führt die häufige Zuweisung des Videospeichers zu einer großen Anzahl von Seitenfehlerausnahmen, wodurch die Verwaltungslast des Kernels verringert wird. Dies ist auch der Grund, warum malloc mmap nur für große Videospeicherblöcke verwendet.
Es ist zu beachten, dass bei diesen beiden Aufrufen der Videospeicher nicht tatsächlich zugewiesen wird. Diese Art von Videospeicher wird nur zugewiesen, wenn zum ersten Mal darauf zugegriffen wird. Das heißt, sie gelangt über eine Seitenfehlerausnahme in den Kernel, und dann weist der Kernel den Videospeicher zu.
Im Allgemeinen verwendet Linux ein Buddy-System, um die Zuweisung des Videospeichers zu verwalten. Wie oben erwähnt, wird diese Art von Grafiken in der MMU in Seiteneinheiten verwaltet. Das Partnersystem verwaltet auch den Grafikspeicher in Seiteneinheiten und reduziert die Fragmentierung des Grafikspeichers durch die Zusammenführung benachbarter Seiten (z. B. Fragmentierung des Videospeichers durch die brk-Methode).
Aber im tatsächlichen Systembetrieb gibt es eine große Anzahl von Objekten, die kleiner als eine Seite sind, beispielsweise weniger als 1 KB. Wenn ihnen separate Seiten zugewiesen werden, wird viel Videospeicher verschwendet.
Im Benutzerbereich Linux-Benutzer zugewiesener Bereich wird der von malloc über brk() zugewiesene Videospeicher bei Freigabe nicht sofort an das System zurückgegeben, sondern zwischengespeichert und erneut verwendet.
Im Kernelbereich verwaltet Linux kleinen Videospeicher über den Slab Allocator. Sie können sich Slab als einen auf dem Partnersystem aufgebauten Cache vorstellen. Seine Hauptfunktion besteht darin, kleine Objekte im Kernel zuzuweisen und freizugeben.
Recycling des Videospeichers: Wenn Sie den Videospeicher nur zuweisen, ohne ihn freizugeben, führt dies zu Videospeicherverlusten und verbraucht sogar den Videospeicher des Systems. Nachdem die Anwendung den Videospeicher aufgebraucht hat, muss sie daher immer noch free() oder unmap() aufrufen, um den ungenutzten Videospeicher freizugeben. Tatsächlich lässt das System nicht zu, dass ein Prozess den gesamten Videospeicher belegt. Wenn festgestellt wird, dass der Videospeicher knapp ist, verwendet das System auch eine Reihe von Mechanismen, um den Videospeicher zurückzugewinnen, z. B. die folgenden drei Formen:
(1) Recyceln Sie den Cache. Verwenden Sie beispielsweise den LRU-Algorithmus (LeastRecentlyUsed), um die zuletzt verwendeten Videospeicherseiten wiederzuverwenden.
(2) Recyceln Sie den selten genutzten Videospeicher und übertragen Sie den selten genutzten Videospeicher über die Swap-Partition (Swap) direkt auf das Laufwerk C. Obwohl Swap einen Teil des C-Laufwerksspeichers als Videospeicher verwendet. Es kann Daten, die vom Prozess vorübergehend nicht verwendet werden, im Laufwerk C speichern (dieser Vorgang wird als Auslagern bezeichnet). Wenn der Prozess auf diese Videospeicher zugreift, kann er diese Daten dann vom Laufwerk C in den Videospeicher lesen sogenanntes Einwechseln). Swap erhöht den verfügbaren Videospeicher des Systems, aber im Allgemeinen erfolgt Swap nur, wenn der Videospeicher nicht ausreicht. Und da die Lese- und Schreibgeschwindigkeit des Laufwerks C viel langsamer ist als die des Videospeichers, führt Swap zu einer erheblichen Leistung des Videospeichers Probleme.
(3) Prozesse beenden, wenn der Videospeicher knapp ist, beendet das System die Prozesse, die viel Videospeicher belegen, direkt über OOM (OutofMemory, ein Schutzmechanismus des Kernels). OOM überwacht die Speichernutzung von Prozessen, verwendet jedoch oom_score, um die Speichernutzung jedes Prozesses zu bewerten:
Je mehr Grafikspeicher von einem Prozess verbraucht wird, desto höher ist der oom_score
Je mehr CPU ein Prozess beansprucht, desto kleiner ist der oom_score.
Auf diese Weise gilt: Je größer der oom_score des Prozesses, desto mehr Videospeicher wird verbraucht und desto einfacher ist es, ihn durch OOM zu töten, was das System besser schützen kann.
Tatsächlich kann der Administrator für tatsächliche Arbeitsanforderungen automatisch den oom_adj des Prozesses über das /proc-Dateisystem festlegen und so den oom_score des Prozesses anpassen. Der Bereich von oom_adj ist [-17,15]. Je größer der Wert, desto einfacher ist es, den Prozess durch OOM zu beenden; je kleiner der Wert, desto unwahrscheinlicher ist es, dass der Prozess durch OOM beendet wird ist streng verboten. Wenn Sie den folgenden Befehl verwenden, können Sie den oom_adj des sshd-Prozesses auf -16 anpassen, sodass der sshd-Prozess nicht so einfach von OOM beendet wird.
echo-16>/proc/$(pidofsshd)/oom_adj
Puffer und Cache
Puffer und Cache im kostenlosen Befehl bedeuten beide Cache, aber ihre Verwendung ist unterschiedlich
1. Puffer ist der vom Kernel-Puffer verwendete Videospeicher, entsprechend dem Pufferwert in /proc/meminfo
2. Cache ist der vom Kernel-Seiten-Cache und Slab verwendete Videospeicher. Er entspricht der Summe aus Cache und SReclaimable in /proc/meminfo
Einfach ausgedrückt ist Puffer ein Cache für Laufwerksdaten und Cache ein Cache für Dateidaten. Sie werden sowohl in Leseanforderungen als auch in Schreibanforderungen verwendet.
Cache (Cache) ist aus Sicht der CPU darauf ausgelegt, die Datenaustauschrate zwischen der CPU und dem Videospeicher zu erhöhen, wie z. B. den Cache der ersten Ebene, den Cache der zweiten Ebene und den Cache der dritten Ebene, die wir normalerweise sehen. Die von der CPU zum Ausführen des Programms verwendeten Anweisungen und Daten zielen alle auf den Videospeicher ab, dh sie werden aus dem Videospeicher abgerufen. Da die Lese- und Schreibgeschwindigkeit des Videospeichers langsam ist, wird der Cache zwischen CPU und Videospeicher reduziert, um die Datenaustauschrate zwischen CPU und Videospeicher zu erhöhen. Seine Geschwindigkeit ist schneller als die des Videospeichers Der vom Linux-Benutzer zugewiesene Speicherplatz ist hoch und die Kosten sind hoch. Da in der CPU nicht zu viele integrierte Schaltkreise integriert werden können, ist der Cache normalerweise relativ klein. Um die Geschwindigkeit weiter zu verbessern, haben Intel und andere Unternehmen das Niveau reduziert 2-Cache und sogar der Level-5-Cache basieren auf dem Prinzip der Programmlokalität, bei dem die Befehle und Daten, auf die zugegriffen wird, häufig in einem bestimmten Block konzentriert sind In den Cache muss die CPU nicht auf den Videospeicher zugreifen, was die Zugriffsrate erhöht. Wenn im Cache kein Inhalt vorhanden ist, den die CPU benötigt, muss dennoch auf den Videospeicher zugegriffen werden.
Aus der Perspektive des Videospeicher-Lesens und des C-Disk-Lesens kann Cache als das Betriebssystem verstanden werden, das mehr Videospeicher verwendet, um Daten zwischenzuspeichern, auf die erneut zugegriffen werden kann, um eine höhere Leseeffizienz zu erreichen.Puffer sollen die Datenaustauschrate zwischen Videospeicher und Festplatte (oder anderen E/A-Geräten) erhöhen. Zentralisieren Sie verstreute Schreibvorgänge, um die Fragmentierung des C-Laufwerks und wiederholte Festplattensuchen zu reduzieren und so die Systemleistung zu verbessern. Linux verfügt über einen Daemon-Prozess, der regelmäßig den Pufferinhalt löscht (d. h. auf das Laufwerk C schreibt), und der Puffer kann auch automatisch über den Synchronisierungsbefehl gelöscht werden.
Einfach ausgedrückt: Der Puffer wird gerade auf das Laufwerk C geschrieben und der Cache wird vom Laufwerk C gelesen. Puffer werden von verschiedenen Prozessen zugewiesen und in Aspekten wie Eingabewarteschlangen verwendet. Ein einfaches Gegenbeispiel ist, dass ein Prozess das Einlesen mehrerer Arrays erfordert. Bevor alle Arrays vollständig eingelesen sind, legt der Prozess die ursprünglich gelesenen Arrays in den Puffer und speichert sie.
Cache wird häufig für E/A-Anfragen auf dem Laufwerk C verwendet. Wenn mehrere Prozesse auf eine Datei zugreifen möchten, wird die Datei zwischengespeichert, um den letzten Zugriff zu erleichtern, was die Systemleistung verbessern kann.
Das obige ist der detaillierte Inhalt vonVertiefendes Verständnis des Linux-Kernels: die Zuordnungsbeziehung zwischen virtuellem Adressraum und physischem Speicher. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!