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.