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

Schnellerer Weg zum Verschieben der Speicherseite als mremap()?

Was bringt Sie zum Nachdenken mremap könnte es jemals effizient sein, einzelne 4k-Seiten auszutauschen? Zumindest kostet eine Hin- und Rückfahrt zum Kernelspace, auch nur um einen einzelnen Wert (wie PID) zu lesen und zurückzugeben, mehr als das Verschieben von 4 KB Daten. Und das ist, bevor wir zu den Cache-Invalidierungs-/TLB-Kosten für die Neuzuordnung des Speichers kommen, die ich nicht gut genug verstehe, um sie in dieser Antwort anzusprechen, die aber ernsthafte Kosten verursachen sollten.

mremap ist im Wesentlichen für eine Sache nützlich:die Implementierung von realloc für groß Zuweisungen, die von mmap bedient wurden . Und mit groß meine ich wahrscheinlich mindestens 100.000.


Es scheint, dass es keinen schnelleren User-Land-Mechanismus zum Neuordnen von Speicherseiten gibt als memcpy(). mremap() ist viel langsamer und daher nur nützlich, um die Größe eines Speicherbereichs zu ändern, der zuvor mit mmap() zugewiesen wurde.

Aber Seitentabellen müssen extrem schnell sein, höre ich Sie sagen! Und es ist dem Benutzerland möglich, Kernelfunktionen millionenfach pro Sekunde aufzurufen! Die folgenden Referenzen helfen zu erklären, warum mremap() so langsam ist:

"An Introduction to Intel Memory Management" ist eine schöne Einführung in die Theorie der Speicherseitenzuordnung.

"Schlüsselkonzepte des virtuellen Speichers von Intel" zeigt ausführlicher, wie das alles funktioniert, falls Sie vorhaben, Ihr eigenes Betriebssystem zu schreiben :-)

"Sharing Page Tables in the Linux Kernel" zeigt einige der schwierigen architektonischen Entscheidungen zur Zuordnung von Speicherseiten unter Linux und deren Auswirkungen auf die Leistung.

Wenn wir uns alle drei Referenzen zusammen ansehen, können wir sehen, dass Kernel-Architekten bisher wenig Anstrengungen unternommen haben, um die Speicherseitenzuordnung auf effiziente Weise dem Benutzerland zugänglich zu machen. Selbst im Kernel muss die Seitentabelle manipuliert werden, indem bis zu drei Sperren verwendet werden, was langsam sein wird.

Da die Seitentabelle selbst aus 4k-Seiten besteht, ist es in Zukunft möglicherweise möglich, den Kernel so zu ändern, dass bestimmte Seitentabellenseiten für einen bestimmten Thread eindeutig sind und für die Dauer von angenommen werden kann, dass sie sperrlosen Zugriff haben Prozess. Dies würde eine sehr effiziente Manipulation dieser bestimmten Seitentabellenseite über das Benutzerland erleichtern. Dies geht jedoch über den Rahmen der ursprünglichen Frage hinaus.


Linux
  1. Zero-Copy User-Space TCP-Send von dma_mmap_coherent() gemapptem Speicher

  2. schnellerer Weg zum Mounten eines Remote-Dateisystems als sshfs?

  3. Gibt es etwas schnelleres als `find . | wc -l` um Dateien in einem Verzeichnis zu zählen?

  4. Linux - Gibt es eine Möglichkeit, die Geschwindigkeit Ihres Speichers per Software zu ermitteln?

  5. Was ist unter Linux ein schnellerer Weg als `find` oder `diff -r`, um zu sehen, ob sich etwas in einem Verzeichnis geändert hat?

Erfahren Sie, warum der Befehl „weniger“ schneller als der Befehl „mehr“ für eine effektive Dateinavigation ist

Warum ist Wget viel schneller als das Herunterladen über Chrome?

Linux-Speicherverwaltung – Virtueller Speicher und Demand Paging

Gibt es eine Möglichkeit, in einer Manpage nach einem Flag zu suchen?

Wie wird Speicher zugewiesen, der auf die Seitengröße ausgerichtet ist?

Java verwendet viel mehr Speicher als die Heap-Größe (oder die richtige Größe des Docker-Speicherlimits)