2009-05-29 18 views
1

In C-Datei-E/A kann das Flag O_DIRECT verwendet werden, um Cache-Effekte für eine Datei zu minimieren, die open() ed ist. Ich verstehe, dass dies keine POSIX-Funktion ist, seit Version 2.4.10 im Linux-Kernel vorhanden ist und dass Linus der Schnittstelle im Allgemeinen widerspricht. Unter NetBSD scheint es wie angekündigt zu funktionieren. Beispielaufruf:Portabilität von offenen (... O_DIRECT) in C?

 
int fd = open(filename, O_DIRECT); 

Ich versuche, einig Low-Level-Disk Benchmark-Dienstprogramme zu schreiben, und mit O_DIRECT eine potenziell gute Möglichkeit zur Messung der Scheibe und Antriebsleistung ohne die Auswirkungen der OS-Dateisystem/Block-Cache aussieht . Idealerweise möchte ich den Benchmark unter Linux, Windows (Cygwin ist OK), Mac OS X und BSD-Systemen ausführen können. Ist O_DIRECT der beste Weg, um die Betriebssystem-Festplatten-Caches zu umgehen, in Bezug auf Portabilität und Zuverlässigkeit für das Benchmarking? Gibt es Alternativen?

+0

Sie sollten ein anderes Flag als nur O_DIRECT in den Aufruf von open(); Was Sie implizit getan haben, ist O_RDONLY, aka 0. –

+1

Für zukünftige Google-Suchen wird diese Frage von dieser anderen StackOverflow-Frage beantwortet: http://stackoverflow.com/questions/2299402/how-does-one-do -raw-io-on-mac-os-x-ie-equivalent-zu-linux-o-direct-flag –

Antwort

1

O_DIRECT existiert nicht einmal auf Mac OS X (Ich habe es gerade in/usr/include gefunden und es war nicht da). Wie für Linux, was wird Ihr Tool tun, dass hdparm nicht?

+0

Danke. hdparm ist nützlich ("hdparm --direct -t" und "hdparm --direct -T" geben die sequentiellen und Burst-Übertragungsraten des Laufwerks an), aber ich möchte auch zufällige I/O-Muster testen. – cheduardo

1

Ich glaube nicht, dass es von Windows unterstützt wird - zumindest kann ich keine Erwähnung in der MSDN finden. Dies bedeutet, dass es vermutlich auch von Cygwin nicht unterstützt werden kann, da Cygwin das zugrunde liegende Windows-Betriebssystem verwenden muss.