Linux Kernel(2.6)の実装に関するメモ書き

WriteBack処理


Rev.6を表示中。最新版はこちら

1. 概要

プロセスがファイルへの書き込みを行うと、カーネルは通常はページキャッシュ(ディスクキャッシュ)に書き込むだけで一旦処理を完了する(ディスクヘの書き込みは行わない)。このデータが書き込まれたページキャッシュは、ディスク上のデータと内容が不一致になっていることを示すためDirty状態になる。Dirty状態のページキャッシュはカーネルスレッドpdflushによって、遅延してディスクに書き込まれる。この処理をWriteBack処理と呼ぶ。

2. WriteBack処理の動作

2.1 WriteBack処理の起動

WriteBack処理はカーネルスレッドpdflushによって実行される。カーネルスレッドpdflushを起動するには、wakeup_pdflush()、balance_dirty_pages_ratelimited()が使われる(図1)。

wakeup_pdflush()はtry_to_free_pages()でメモリを解放しようとする際に、Dirtyページを書き出して解放可能なメモリを増やそうとして呼ばれる。

balance_dirty_pages_ratelimitd()はファイルの書き込み処理の中で、generic_file_buffered_write()の中から呼び出される(「generic_file_write()」参照)。ただし、この関数は呼び出される度に毎回pdflushを起動するのではなく、ratelimit_pages回に1回だけpdlushを起動するようになっている。

pdflushの起動はpdflush_operation()でpdflushにジョブ(background_writeout())を投入することで、行われる。ジョブが投入されると、pdflushが指定された関数(background_writeout())の実行を開始する。



図1 pdlushの起動

2.2 WriteBack処理

2.1に示すようにpdflushが起動されると、background_writeout()が実行される。WriteBack処理は本関数から始まる。WriteBack処理の流れを図2に示す。

図2 WriteBack処理の流れ


do_writepages()の流れを図3に示す。do_writepages()はファイルシステムのwritepagesハンドラかgeneric_writepages()を呼び出す。多くの場合は、mpage_writepages()が呼び出され、Dirty状態のページキャッシュのディスクへの書き込みI/Oを開始する。

図3 do_writepages()

3. struct writeback_control

writeback_control構造体は、WriteBack処理を制御するのに使われる。writeback_controlはbackground_writeout()でWriteBackを開始する際に作成され、呼び出し関数に渡されていき、writeback_control内のデータにしたがってWriteBack処理を行っていく。

表1 writeback_controlの主要メンバ
メンバ
説明
nr_to_write
WriteBackするページ数。書き込みI/Oを発行すると減算されていく。
nonblocking
RequestQueue内でのブロックを許すか否かのフラグ。
1だと、RequestQueue内でブロックしないように、ブロックデバイスが輻輳状態だったら、I/Oを発行せずにリターンする。


関連ページ


最終更新 2007/10/05 16:49:51 - kztomita
(2007/10/05 16:21:32 作成)
添付ファイル
invoke_pdflush.png - kztomita
writeback.png - kztomita
do_writepages.png - kztomita


リンク
最近更新したページ
検索