Wie bringe ich Speicherpuffer zu, die vom Betriebssystem für das Caching in einer MAC OS X -Kernel -Erweiterung zurückgefordert werden können?

StackOverflow https://stackoverflow.com/questions/4762199

Frage

Basierend auf Dokumentation und XNU -Quelle, die ich gelesen habe, verstehe ich, dass Mac OS X Caches Datei E/A mit dem Unified Puffer Cache (UBC). Das UBC wächst so groß wie möglich auf dem verfügbaren RAM, aber UBC -Seiten sind einige der ersten, die geopfert werden, wenn das Gedächtnis enger wird.

In meinem Fahrer beschäftige ich mich mit verschiedenen On-Disk-Metadaten. Ich möchte in der Lage sein, den UBC oder einen ähnlichen Mechanismus zu verwenden, um MRU -Caches dieser Daten zu halten, um die Dinge zu beschleunigen, und dem Kernel die Möglichkeit geben, diesen Speicher zurückzunehmen, wann immer es erforderlich ist. Die Metadaten repräsentieren jedoch nicht Datei Daten und fällt daher nicht direkt in die Domäne des UBC. Gibt es einen Mechanismus auf niedrigerer Ebene, den ich verwenden kann, oder kann ich irgendwie nur den Teil des UBC verwenden, der sich mit den Puffern selbst befasst?

Ich suche derzeit im HFS+ Quellcode, um herauszufinden, ob und wie er den Dateisystem -Metadaten zwischenstrahlt, wenn auch ohne viel Erfolg.

Die Hauptalternative besteht natürlich darin, eine bestimmte Speicherregion für Caches zu reservieren und meine eigene LRU -Keule zu machen. Ich kann eine feste Cache -Größe auswählen oder eine Art Heuristik verwenden, aber es wird immer zu wenig Speicher verwenden, wenn RAM reichlich vorhanden ist und zu viel, wenn es nicht ist.

Aktualisieren:

Nachdem ich einige weitere gesucht habe, habe ich festgestellt, dass Instanzen von IOBufferMemoryDescriptor kann mit dem erstellt werden kIOMemoryPurgeable Möglichkeit. Dadurch können Sie anrufen IOMemoryDescriptor::setPurgeable() darauf, um das Gedächtnis "faires Spiel" zum Abwerfen zu markieren. Ich werde es versuchen und die Frage mit Ergebnissen aktualisieren.

War es hilfreich?

Lösung

Du hast Recht. Satz kIOMemoryPurgeable Als eine der Optionen, wenn Sie den Speicher anfordern. Es beginnt als nichtflüchtig und kann ausgelöst werden, wird aber nicht verworfen.

Wenn Sie das Betriebssystem abwerfen lassen möchten, rufen Sie an setPurgeable(kIOMemoryPurgeableVolatile, &oldState ); Und das Betriebssystem wird es bei Bedarf verwerfen, anstatt es auf Festplatten zu pageln.

Wenn Sie auf den Speicher zugreifen möchten, müssen Sie anrufen setPurgeable(kIOMemoryPurgeableKeepCurrent, &oldState ); und prüfe if(oldState != kIOMemoryPurgeableEmpty) Was wahr sein wird, wenn die Erinnerung noch verfügbar ist, und falsch, wenn sie verworfen wurde.

Ich wäre interessiert zu hören, wenn Sie auf Fänge stoßen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top