2009-05-29 16 views
1

CファイルI/Oでは、フラグを使用して、open()であるファイルのキャッシュエフェクトを最小限に抑えることができます。私はこれがPOSIXの機能ではなく、バージョン2.4.10以降のLinuxカーネルに存在し、Linusは一般的なインタフェースに反対していることを理解しています。 NetBSDの下では、広告されたように動作するようです。例コール:Cのオープン(... O_DIRECT)の移植性?

 
int fd = open(filename, O_DIRECT); 

私はいくつかの低レベルのディスクのベンチマークユーティリティを書き込もうとすると、O_DIRECTは、OSのファイルシステム/ブロック・キャッシュの効果なしディスクとドライブのパフォーマンスを測定する潜在的に良い方法になりそうだ使用しています。理想的には、Linux、Windows(CygwinはOK)、Mac OS X、およびBSDシステムでベンチマークを実行できるようにしたいと考えています。 O_DIRECTは、ベンチマークのための移植性と信頼性の観点から、OSディスクキャッシュをバイパスする最良の方法ですか?代わりがありますか?

+0

open()の呼び出しには、O_DIRECT以外のフラグを含める必要があります。あなたがしたことは、暗黙のうちに、O_RDONLY、別名0を使用しています。 –

+1

今後のGoogleの検索では、この他のStackOverflowに関する質問が返ってくる:http://stackoverflow.com/questions/2299402/how-does-one-do -raw-io-on-mac-os-x-ie-linux-o-direct-flag –

答えて

1

O_DIRECTはMac OS X上にも存在しません(私は/ usr/includeにgrepしていますが、そこにはありませんでした)。 Linuxの場合、hdparmはあなたのツールで何をしますか?

+0

ありがとうございました。 hdparmは便利です( "hdparm --direct -t"と "hdparm --direct -T"はそれぞれドライブのシーケンシャルとバースト転送速度を与えます)。しかし、ランダムなI/Oパターンもテストしたいと思います。 – cheduardo

1

私はそれがWindowsでサポートされているとは思わない - 少なくとも私はMSDNで言及を見つけることができません。これはCygwinが基礎となるWindows OSを使用する必要があるため、おそらくCygwinでもサポートできることを意味します。

3

ウィンドウの場合、フラグFILE_FLAG_NO_BUFFERINGおよびFILE_FLAG_WRITE_THROUGHを持つCreateFile関数を参照する必要があります。 (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx)。 しかし、あなたは読み込みと書き込みにWindows関数を使う必要があります:SetFilePointer、WriteFile、ReadFile ...