16

Linux の先読みシステムコールに相当する Windows はありますか?

編集:

可能であれば、同等のオフセット/カウント パラメーター (または下限/上限) を示す完全な関数シグネチャが必要です。

例: Linux 関数のシグネチャは次のとおりです。

ssize_t readahead(int fd, off64_t *offset, size_t count);

その使用例は

readahead(file, 100, 500);

ここで、「file」は、mmap などの関数によって以前に設定されたファイル記述子です。この呼び出しは、インデックス 100 で 500 バイトを読み取ります。

編集 2: readahead が何をするかわからない場合は、これを読んでください: http://linux.die.net/man/2/readahead

4

3 に答える 3

11

はい。ですFileSystemControl FSCTL_FILE_PREFETCH

Windows Vista 以降では、アプリケーションの起動時と起動時の両方でプリフェッチに使用されます。

また、ヒューリスティックを使用してアプリケーションを一般的に使用するほぼ時間帯にロードする SuperFetch テクノロジでも使用されます。

FSCTL_FILE_PREFETCHそれ自体は MSDN で文書化されていませんが、アプリの起動時に行われた呼び出しを調べることで、パラメーターの形式を簡単に把握できます。ディレクトリDeviceIoControlに .pf ファイルが既にあるアプリケーションをデバッガーで起動してc:\Windows\Prefetch中断するDeviceIoControlだけです (または、カーネル デバッガーを使用している場合、NTFS ドライバーが最初の FSCTL_FILE_PREFETCH を受信したときに中断します)。渡されたバッファを調べて、後で実際に使用される .pf ファイルおよび範囲と比較します。好奇心からこれを行ったことがありますが、詳細は記録しませんでした。

DeviceIoControlおよびに慣れていない場合はIRP_MJ_FILESYSTEM_CONTROL、次のリンクを参照してください。

于 2010-01-25T21:15:54.420 に答える
2

Windows 8 の時点で、実質的に同じものである と多かれ少なかれ直接的な同等物が存在しますmadvise(MADV_WILLNEED)(Windows には統合された VM/キャッシュ システムがあります)。

ファイルをメモリ マップしたと仮定すると、PrefetchVirtualMemoryを使用してファイルをプリフェッチできます。

これはあなたが望むよりも少し複雑ですが、 ほど厳しくはありませんDeviceIoControl。また、いくつかの独立した不連続な範囲を簡単にプリフェッチできることにも注意してください。

于 2013-07-25T13:59:40.617 に答える
0

あなたが言ったことを正しく理解しているかどうかはわかりません。この呼び出しは、インデックス 100 で 500 バイトを読み取っています。

C コードでは、次のようになります。

fseek(fp, 100, SEEK_CUR);
fread(&data, 500, 1, fp);

しかし、それをプリフェッチすると、waithandles を使用してある種のイベントをフックしたいと思うでしょう。イベントが発生すると、データはバッファのどこかに保存されます...

正直なところ、データをプリフェッチするようなものに遭遇したことはありません...しかし、レイの答えには驚きましたが、互換性を維持したい場合は、Vista以上の場合のみです...それは維持するものです心に留めて...しかし、以下のリンクが役立つかもしれません...

わかりました、これについて議論しているブログがありました、Delphi で書かれたライブラリ、ソース コードはここにあります、ここでコードをブラウズします、わかりました、それはあなたが望むものではないかもしれませんが、方向を示すのに役立つかもしれません...あなたが探しているものではありません...

これがお役に立てば幸いです。よろしくお願いします、トム。

于 2010-01-26T00:11:23.513 に答える