Frage

Betriebssysteme lesen von der Festplatte mehr als das, was ein Programm tatsächlich anfordert, weil ein Programm wahrscheinlich in der Nähe Informationen in der Zukunft notwendig ist. In meiner Anwendung, wenn ich einen Artikel von der Festplatte holen, würde Ich mag ein Intervall von Informationen rund um das Element zu zeigen. Es gibt einen Kompromiss zwischen dem, wie viele Informationen Ich bitte und zeigen und Geschwindigkeit. Da jedoch bereits das Betriebssystem liest mehr, als ich gebeten, diese Bytes bereits im Speicher Zugriff ist frei. Was API kann ich verwenden, um herauszufinden, was in dem OS-Caches ist?

Alternativ könnte ich Memory-Mapped-Dateien verwenden. In diesem Fall reduziert sich das Problem auf, herauszufinden, ob eine Seite auf die Festplatte ausgelagert wird oder nicht. Kann dies in allen gängigen OS getan werden?

EDIT: Verwandte Papier http://www.azulsystems.com/events/mspc_2008 /2008_MSPC.pdf

War es hilfreich?

Lösung

Sie können in der Tat Ihre zweite Methode verwenden, zumindest unter Linux. mmap() die Datei, dann die mincore()-Funktion verwenden, um zu bestimmen, welche Seiten resident sind. Aus der Manpage:

int mincore(void *addr, size_t length, unsigned char *vec);

mincore() liefert einen Vektor, dass zeigt an, ob Seiten des rufenden Prozess des virtuellen Speichers sind resident im Kern (RAM), und bewirkt so keine Plattenzugriff (Seitenfehler), wenn verwiesen. Die Kernel-Renditen Aufenthalt Informationen über die Seiten an der Adresse addr starten, und Weiterbildung für length Bytes.

Es gibt natürlich eine Race-Bedingung hier - mincore() können Ihnen sagen, dass eine Seite ansässig ist, aber es könnte dann einfach ausgelagert werden, bevor Sie darauf zugreifen. C'est la vie .

Andere Tipps

Sie sind ausgehend von einer falschen Vermutung aus. Zumindest auf Linux, wird das Betriebssystem versuchen, den Zugriff des Programms Muster herauszufinden. Wenn Sie eine Datei sequenziell gelesen, wird der Kernel sequentiell Prefetch. Wenn Sie die Datei viel herumspringen, wird der Kernel wahrscheinlich zunächst verwechselt werden, aber dann wird es aufhören Prefetching.

Wenn Sie also eigentlich sind Zugriff auf die Dateien nacheinander, wissen Sie, was wahrscheinlich ist Prefetch: den nächsten Datenblock. Wenn Sie zufällig suchen sind, wahrscheinlich nichts anderes in der Nähe ist vorab abgerufen.

Versuchen Sie, diese eine andere Art und Weise zu nähern. Vor dem Aufruf von read () erhält die Informationen, die Sie Notwendigkeit , Anruf fadvise () das OS wissen zu lassen, was Sie wollen es Laden starten ..

Ich bin auch neugierig, zu wissen, welche Art von Anwendung, die Sie verwenden, das korrekt nur Betrieb auf Daten ausführen kann, die in der Dateicache zufällig passiert sein. Ich fühle mich wie wir einen guten Weg finden konnten, um Ihren Bedarf zu adressieren, wenn Sie ein wenig mehr Info gepostet.

Es kann sicherlich nicht auf Windows durchgeführt werden. Unter Windows ist die Lese voraus Verhalten an das O auf, und selbst wenn es könnte Ihnen sagen, wie viel es voraus gelesen hätte, wäre es dir nicht gut tun, denn sobald man herausgefunden hat, die in Speicherseite, die verwendet für das Caching für eine andere Verwendung freigegeben worden sein könnte.

Das gleiche gilt für die Bestimmung, ob eine Seite ansässig ist oder nicht. Sobald Sie die Antwort herausgefunden haben könnte sich ändern, wenn ein anderer Thread sonst den Speicher für etwas braucht.

Wenn Sie wirklich dünnt Art der Sache auf Windows tun wollen, können Sie die Pufferung deaktivieren und verwalten die Puffer selbst. Dies ist der schnellste Weg IO, aber es ist auch die komplexeste -. Sie sehr vorsichtig sein, und oft auch die OS können es noch besser machen

Was API kann ich herausfinden, was in dem OS-Caches ist?

Es gibt sicherlich keinen Standard-Weg, dies für jedes Posix-System zu tun, und ich weiß von keiner Nicht-Standard-Weise spezifisch für Linux. Das einzige, was man kann (fast) sicher weiß, ist, dass das Dateisystem in einem Vielfachen der Seitengröße gelesen hat, in der Regel 4 kB. Also, wenn Ihr liest klein sind, können Sie wissen, mit hoher Wahrscheinlichkeit (wenn auch nicht sicher), dass die Daten in der umgebenden Seite im Speicher ist.

Sie könnten, nehme ich an, tun tricksy Dinge wie Timing, wie lange es ein Lesesystem, um eine vollständige nahm. Wenn es schnell ist, dh 100s von Mikrosekunden oder weniger, es war wahrscheinlich ein Cache-Treffer. Sobald es zu einer Millisekunde aufsteht oder so, es war wahrscheinlich eine Cache-Miss. Natürlich eigentlich Ihnen dies nicht sehr viel helfen, und es ist sehr, sehr zerbrechlich.

Bitte beachten Sie, dass, sobald das Dateisystem die Daten auf Benutzerpuffer kopiert hat, ist es kostenlos, um sofort die Puffer verwerfen die Daten von der Festplatte zu halten. Es ist wahrscheinlich nicht das sofort tun, aber man kann nicht sicher sagen.

Schließlich habe ich zweite @ Karmastan Vorschlag: erklären das breitere Ende Sie zu erreichen versuchen. Es ist wahrscheinlich, dass eine Möglichkeit, es zu tun, aber die, die Sie vorgeschlagen haben, ist es nicht.

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