2

プログラムは将来近くの情報を必要とする可能性があるため、オペレーティングシステムはプログラムが実際に要求するよりも多くディスクから読み取ります。私のアプリケーションでは、ディスクからアイテムをフェッチするときに、要素の周囲の情報の間隔を表示したいと思います。私が要求して表示する情報の量と速度の間にはトレードオフがあります。ただし、OSはすでに要求したものより多くを読み取るため、すでにメモリ内にあるこれらのバイトへのアクセスは無料です。OSキャッシュに何があるかを調べるためにどのAPIを使用できますか?

または、メモリマップトファイルを使用することもできます。その場合、問題はページがディスクにスワップされているかどうかを確認することになります。これは一般的なOSで実行できますか?

編集:関連論文http://www.azulsystems.com/events/mspc_2008/2008_MSPC.pdf

4

4 に答える 4

6

少なくともLinuxでは、実際に2番目の方法を使用できます。 mmap()ファイルを作成し、mincore()関数を使用して、どのページが常駐しているかを判別します。マニュアルページから:

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

mincore()呼び出し元プロセスの仮想メモリのページがコア(RAM)に常駐しているかどうかを示すベクトルを返すため、参照されてもディスクアクセス(ページフォールト)は発生しません。カーネルは、アドレスで始まり、バイト単位addrで続くページに関する常駐情報を返します。length

もちろん、ここには競合状態がありmincore()ます。ページが常駐していることがわかりますが、アクセスする直前にページがスワップアウトされる可能性があります。 C'estlavie

于 2010-04-29T01:38:38.443 に答える
2

あなたは間違った推定から始めています。少なくともLinuxでは、OSはプログラムのアクセスパターンを把握しようとします。ファイルを順番に読み取る場合、カーネルは順番にプリフェッチします。ファイルを頻繁にジャンプすると、カーネルは最初は混乱する可能性がありますが、その後、プリフェッチが停止します。

したがって、実際にファイルに順番にアクセスしている場合は、おそらくプリフェッチされているもの、つまり次のデータブロックがわかります。ランダムに探している場合は、おそらく近くにある他のものはプリフェッチされていません。

別の方法でこれにアプローチしてみてください。read()を呼び出して必要な情報を取得する前に、 fadvise()を呼び出して、ロードを開始する対象をOSに通知します。

また、たまたまファイルキャッシュにあるデータを操作するだけで正しく実行できる、使用しているアプリケーションの種類を知りたいと思います。もう少し情報を投稿していただければ、お客様のニーズに対応する良い方法を見つけることができると思います。

于 2010-04-28T19:49:23.087 に答える
1

それは確かにWindowsでは実行できません。Windowsでは、先読みの動作はOS次第であり、先読みした量を教えてくれたとしても、気づいたらすぐにメモリ内のページがキャッシングに使用されたものは、他の用途のために再利用された可能性があります。

ページが常駐しているかどうかを判断する場合にも同じことが言えます。他のスレッドが他の何かのためにメモリを必要とするとき、あなたが見つけたらすぐに答えが変わるかもしれません。

本当にWindowsでシンのようなことをしたい場合は、バッファリングをオフにして、自分でバッファを管理することができます。これは最速のIOパスですが、最も複雑でもあります。非常に注意する必要があり、多くの場合、OSはそれをより適切に実行できます。

于 2010-04-28T19:26:56.923 に答える
1

OSキャッシュに何があるかを調べるためにどのAPIを使用できますか?

確かに、どのposixシステムでもこれを行うための標準的な方法はありません。また、Linuxに固有の非標準的な方法も知りません。(ほぼ)確実に知ることができる唯一のことは、ファイルシステムがページサイズの倍数(通常は4kB)で読み取ったことです。したがって、読み取りが小さい場合は、周囲のページのデータがメモリ内にあることを高い確率で(確実ではありませんが)知ることができます。

おそらく、読み取りシステムが完了するまでにかかった時間のタイミングなど、トリッキーなことを行うことができます。高速、つまり数百マイクロ秒以下の場合は、キャッシュヒットである可能性があります。ミリ秒程度になると、おそらくキャッシュミスでした。もちろん、これは実際にはあまり役に立ちませんし、非常に壊れやすいものです。

ファイルシステムがデータをユーザーバッファにコピーすると、ディスクからデータを保持しているバッファをすぐに破棄できることに注意してください。おそらくすぐにはこれを実行しませんが、確実に判断することはできません。

最後に、@ Karmastanの2番目の提案:達成しようとしているより広い目的を説明します。それを行う方法はおそらくありますが、あなたが提案したのはそうではありません。

于 2010-04-28T19:53:03.997 に答える