Seitenverwaltung in Betriebssystemkernen

7

Ich habe mir einige meiner alten Bücher zur OS-Theorie angesehen und festgestellt, dass eine eklatante Lücke in all diesen OS-Büchern darin besteht, wie man tatsächlich freie physische Seiten verfolgt (dh Algorithmen zur tatsächlichen Implementierung der freien Liste). Ich weiß ziemlich gut, wie Userland-Speicherzuordnungen funktionieren, aber ein großer Unterschied bei der physischen Seitenzuweisung besteht darin, dass die Fragmentierung physischer Seiten kein Problem darstellen sollte, da die Seitentabelle nur die physischen Seiten auswählen kann, ohne sich darum kümmern zu müssen, ob sie vorhanden sind sind zusammenhängend oder nicht. Da die Vermeidung von Fragmentierung eines der Hauptanliegen von Userland-Zuweisern ist, scheint die physische Seitenzuweisung ein grundlegend anderes Problem zu sein. Ich denke, dass dies nicht ganz richtig ist, wenn man Superseiten unterstützen möchte, um den Druck auf den TLB zu verringern.

Meine Frage: Welche Techniken werden in modernen Hochleistungskernen für dieses Problem verwendet? Wird dieses Problem auch in NUMA-Systemen erheblich komplizierter?

eof
quelle

Antworten:

5

Die Verwaltung von Seitenrahmen ist konzeptionell sehr einfach. Alles, was Sie wirklich brauchen, ist eine verknüpfte Liste. Es gibt jedoch zwei Hauptfaktoren, die die Dinge komplizieren:

  • DMA. DMA ist eines der wenigen Dinge, für die möglicherweise ein physischer Puffer erforderlich ist, der größer als eine Seite ist. Darüber hinaus gibt es ältere Geräte, mit denen man fertig werden muss. Auf x86 können 32-Bit-Geräte beispielsweise DMA nur von physischen Adressen unterhalb der 4G-Grenze ausführen. Für ISA ist es noch schlimmer.
  • Cache-Färbung , eine äußerst wichtige Optimierung.

Die meisten Betriebssysteme verwenden überraschend einfache Techniken.

Windows verwendet zum Beispiel nur eine Reihe verknüpfter Listen (oder zumindest das letzte Mal, als jemand etwas darüber gesagt hat). Es ist schwer zu sagen, da wir den Quellcode nicht sehen können, aber es gibt wahrscheinlich N * M verknüpfte Listen, in denen N die Anzahl der möglichen Zustände ist, in denen sich eine Seite befinden kann (z. B. in Gebrauch, kostenlos, wartet darauf, ausgelagert zu werden). und M ist die Anzahl der Farben.

Linux verwendet bekanntermaßen einen Buddy-Allokator , um physische Seiten zu verwalten. Dies ist nur geringfügig komplizierter als eine Reihe verknüpfter Listen, wenn Sie darüber nachdenken.

Das wahrscheinlich ausgefeilteste Verwaltungsschema, das ausführlich dokumentiert wurde, ist das von Solaris. Siehe Bonwick & Adams, Magazine und Vmem: Erweiterung des Plattenzuordners auf viele CPUs und beliebige Ressourcen , USENIX 2001. Das Buch Solaris Internals enthält auch eine ausführliche Diskussion . Der Solaris-Plattenzuweiser ist sehr bemüht, Sperrenkonflikte, Cache-Thrashing und dergleichen zu vermeiden, und kann seine Implementierung bei Bedarf auch für verschiedene Datentypen optimieren.

Interessant ist, dass Solaris denselben Speicherzuweiser verwendet, um Seitenrahmen zu verarbeiten, den es zum Behandeln von Kernelobjekten verwendet, indem Plattenzuordnungen in Plattenzuordnungen verschachtelt werden. Das Papier ist auf jeden Fall eine Lektüre wert.

Pseudonym
quelle