2016-10-14 8 views
0

バイトがファイルに書き込まれると、カーネルはそれらのバイトをディスクにただちに書き込むのではなく、ダーティページにページキャッシュ(ライトバックキャッシュ)にバイトを格納します。ページキャッシュ内のダーティページからファイルの読み込みが行われていますか?

ダーティページがディスクにフラッシュされる前にファイルの読み取りが発行された場合、キャッシュ内のダーティページからバイトが提供されるのか、ダーティページが最初にディスクにフラッシュされ、バイトを提供する(プロセスのページキャッシュに格納する)?

+0

これはプログラミングの問題ではなく、むしろLinuxの内部についてです。 Linuxサイトでもっとうまくいくかもしれません。 –

答えて

1

ファイルの読み取りは、ディスクに書き込まずにページキャッシュからデータをフェッチします。 からLinuxカーネル開発第3版ロバート愛によって:

必要な データがある場合 プロセスが読み取り()システムコール、それを最初にチェックを発行した場合、カーネルは、読み出し動作 - たとえばを開始するたびにページキャッシュに格納されます。そうであれば、カーネルは にディスクをアクセスせずに直接RAMからデータを読み取ることができます。これはキャッシュ ヒットと呼ばれます。キャッシュミスと呼ばれるデータがキャッシュにない場合、カーネル はブロックI/O操作をスケジューリングしてディスクからデータを読み取る必要があります。ディスクへ

書き戻しは、リードとは別に、定期的に起こり:Linuxが採用

第三の戦略は、ライトバックと呼ばれています。 ライトバックキャッシュでは、プロセスはページキャッシュ に直接書き込み操作を実行します。バッキングストアは即時または直接更新されません。 代わりに、ページキャッシュ内の書き込まれたページはダーティー としてマークされ、ダーティーリストに追加されます。定期的に、ダーティーリスト のページは、ライトバックと呼ばれるプロセスでディスクに書き戻され、ディスク上のコピーがメモリキャッシュと一致するようにディスクにコピーされます( )。

+0

おかげさまでもう1つの質問 - ディスクにまだ同期されていないダーティキャッシュから読み込みファイルが提供され、ダーティバイトがディスクに書き込まれる前にシステムの電源が切れた場合、ディスクにコミットされたことのない「ファイル」は本当ですか? – Stormshadow

+0

そうですね。より興味深いのは、そのデータがディスクにどのくらいの頻度で同期されているかという問題です。これは、ブロックI/Oスケジューラによってカバーされています。締め切り、予測、完全なフェアキューイング、noopです。通常は、書き込み(ディスクからキャッシュへの同期)を優先して書き込み(キャッシュからディスクへの同期)に優先します。 – bytefire

0

アプリケーション開発者の観点から、書き込み後に来を読んで情報を書き込みによって保存されますと仮定することは合理的です。

Linuxはそのような保証を提供し、実装の詳細を隠しています。したがって、キャッシュが使用されているかどうかに関わらず、書き込みの効果は同じです:さらに読み出すと、発行されたものが返されます

関連する問題