2011-10-30 11 views
4

ディスクファイル用のカーネルI/Oキャッシュに関する質問があります。 write()またはread()が呼び出されたときに知っているように、ディスクファイルのI/O操作のためのカーネルスペースにバッファキャッシュがあります。 私の質問は、このI/Oバッファリングはディスクファイルにのみ適用されるのでしょうか?また、ターミナル、FIFO、パイプ、ソケットにも適用されますか?Linuxカーネルのディスクファイル用I/Oバッファキャッシュ

ありがとう

答えて

6

「ページキャッシュ」と呼ばれます。これは、ファイルに裏打ちされたページとスワップに裏打ちされた「匿名ページ」で構成されています。これは、すべてLinux仮想メモリ(VM)サブシステムの一部です。

TTY、FIFO、パイプ、またはソケットには使用されません。それらのそれぞれは、自然の性質によってバッファリングを提供します。たとえば、パイプに書き込むデータは、再び読み戻される前のどこかに存在しなければなりません。しかし、そのバッファリングはVMサブシステムとは関係ありません。

[更新]このバッファリングは、(例えば)fwrite()によって提供されるユーザ空間のバッファリングの完全に独立していること

注意。 (私は以前あなたに似たような質問をしていましたが、その違いを理解しているかどうかは分かりません)

+0

ありがとう、Nemo。 私が理解しているように、ディスクファイルへの "通常"のread()/ write()は、このページキャッシュのためにブロックされません。 これは、パイプ、FIFO、ソケット、ttyへの読み書きをブロックするさまざまなバッファリングメカニズムが原因でブロックされる可能性がありますか? – kai

+0

ええ、私はそれらの違いを知っています~~ – kai

+0

'read'は、データが利用できない場合、常にブロックすることができます。内容がページキャッシュにないファイルを読み込むことが含まれます。 'vm.dirty_ratio'によって決定されるように、ダーティページが多すぎる場合、ファイルに書き込みます(_may_ブロック)。パイプへの書き込みは、パイプバッファがいっぱいでないとブロックされません。同様に、ソケットバッファへの書き込みは、ソケットバッファがいっぱいでない限りブロックされません。たぶんあなたは実際に何をしようとしているのかという質問をするべきでしょうか? – Nemo