知識マップ: Windows I/Oの深層(第4回) ── キャッシュマネージャー:あなたのWriteFileはいつディスクに届くのか
記事「Windows I/Oの深層(第4回) ── キャッシュマネージャー:あなたのWriteFileはいつディスクに届くのか」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
WriteFileの成功はディスクへの永続化を意味せず、Windowsのファイルキャッシュはまずシステムキャッシュビューへコピーし、ディスクへの反映はlazy writerが毎秒後追いします。電源断やOSクラッシュではまだ書かれていないダーティページが失われるため、確実に書きたいデータにはFlushFileBuffers・FILE_FLAG_WRITE_THROUGH・FILE_FLAG_NO_BUFFERINGを使い分ける必要があります。
flowchart LR
accTitle: キャッシュマネージャーとライトビハインドの知識マップ
accDescr: キャッシュマネージャー、ライトバックキャッシュ、256KBのシステムキャッシュビュー、先読み、lazy writerによる遅延書き込み、電源断でのダーティページ喪失、FlushFileBuffers・FILE_FLAG_WRITE_THROUGH・FILE_FLAG_NO_BUFFERINGによる確実な書き込み、整列要件、メモリマップトファイルとの一貫性、ファストI/Oの関係を示す図
cache_manager["キャッシュマネージャー"]
write_behind_caching["ライトバックキャッシュ(遅延書き込み方式)"]
memory_mapped_file["ファイルマッピング(メモリマップトファイル)"]
system_cache_view["システムキャッシュビュー(256KBスロット)"]
file_object["ファイルオブジェクト"]
lazy_writer["lazy writer(遅延書き込みスレッド)"]
unflushed_write_loss["未反映データの喪失"]
temp_file_attribute["FILE_ATTRIBUTE_TEMPORARY"]
dirty_page["ダーティページ"]
power_loss["電源断・OSクラッシュ"]
read_ahead["先読み(read-ahead)"]
sequential_scan_hint["FILE_FLAG_SEQUENTIAL_SCAN"]
random_access_hint["FILE_FLAG_RANDOM_ACCESS"]
flushfilebuffers["FlushFileBuffers"]
write_through["FILE_FLAG_WRITE_THROUGH"]
no_buffering["FILE_FLAG_NO_BUFFERING"]
sector_alignment_requirement["セクター整列要件"]
invalid_parameter_error["ERROR_INVALID_PARAMETER(87)"]
frequent_durable_write["頻繁な書き込みでの確実な永続化"]
flushviewoffile["FlushViewOfFile"]
fast_io["ファストI/O"]
procmon["Process Monitor(procmon.exe)"]
irp["IRP(I/O要求パケット)"]
synchronous_io["同期I/O"]
cache_manager -->|"実装を担う"| write_behind_caching
write_behind_caching -->|"利用する"| memory_mapped_file
cache_manager -->|"利用する"| system_cache_view
system_cache_view -->|"利用する"| memory_mapped_file
cache_manager -->|"利用する"| file_object
cache_manager -->|"利用する"| lazy_writer
lazy_writer -->|"自動化する"| write_behind_caching
lazy_writer -->|"軽減する"| unflushed_write_loss
temp_file_attribute -.->|"両立しない"| lazy_writer
write_behind_caching -->|"原因になり得る"| dirty_page
dirty_page -->|"に保存される"| system_cache_view
power_loss -.->|"原因になり得る"| unflushed_write_loss
cache_manager -.->|"防止する"| unflushed_write_loss
cache_manager -->|"利用する"| read_ahead
read_ahead -.->|"で構成できる"| sequential_scan_hint
read_ahead -.->|"で構成できる"| random_access_hint
flushfilebuffers -->|"防止する"| unflushed_write_loss
write_through -->|"防止する"| unflushed_write_loss
no_buffering -.->|"軽減する"| unflushed_write_loss
no_buffering -->|"前提とする"| sector_alignment_requirement
sector_alignment_requirement -->|"防止する"| invalid_parameter_error
no_buffering -->|"原因になり得る"| invalid_parameter_error
flushfilebuffers -->|"用いるのは非推奨"| frequent_durable_write
no_buffering -->|"推奨される対応"| frequent_durable_write
write_through -->|"推奨される対応"| frequent_durable_write
no_buffering -->|"両立しない"| system_cache_view
flushviewoffile -->|"前提とする"| memory_mapped_file
flushviewoffile -->|"より先に行うべき"| flushfilebuffers
fast_io -->|"で確認できる"| procmon
fast_io -->|"前提とする"| system_cache_view
fast_io -->|"両立しない"| irp
fast_io -->|"前提とする"| synchronous_io
概念間の関係(全32件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- キャッシュマネージャーはライトバックキャッシュ(遅延書き込み方式)の実装を担います。
- ライトバックキャッシュ(遅延書き込み方式)はファイルマッピング(メモリマップトファイル)を利用します。
- キャッシュマネージャーはシステムキャッシュビュー(256KBスロット)を利用します。
- システムキャッシュビュー(256KBスロット)はファイルマッピング(メモリマップトファイル)を利用します。
- キャッシュマネージャーはファイルオブジェクトを利用します。
- キャッシュマネージャーはlazy writer(遅延書き込みスレッド)を利用します。
- lazy writer(遅延書き込みスレッド)はライトバックキャッシュ(遅延書き込み方式)を自動化します。
- lazy writer(遅延書き込みスレッド)は未反映データの喪失を軽減します。
- FILE_ATTRIBUTE_TEMPORARYはlazy writer(遅延書き込みスレッド)と両立しません。
- ライトバックキャッシュ(遅延書き込み方式)はダーティページの原因になることがあります。
- ダーティページはシステムキャッシュビュー(256KBスロット)に保存されます。
- 電源断・OSクラッシュは未反映データの喪失の原因になることがあります。
- キャッシュマネージャーは未反映データの喪失を防ぎます。
- キャッシュマネージャーは先読み(read-ahead)を利用します。
- 先読み(read-ahead)はFILE_FLAG_SEQUENTIAL_SCANで構成できます。
- 先読み(read-ahead)はFILE_FLAG_RANDOM_ACCESSで構成できます。
- FlushFileBuffersは未反映データの喪失を防ぎます。
- FILE_FLAG_WRITE_THROUGHは未反映データの喪失を防ぎます。
- FILE_FLAG_NO_BUFFERINGは未反映データの喪失を軽減します。
- FILE_FLAG_NO_BUFFERINGはセクター整列要件を前提とします。
- セクター整列要件はERROR_INVALID_PARAMETER(87)を防ぎます。
- FILE_FLAG_NO_BUFFERINGはERROR_INVALID_PARAMETER(87)の原因になることがあります。
- FlushFileBuffersを頻繁な書き込みでの確実な永続化に用いることは推奨されません。
- FILE_FLAG_NO_BUFFERINGは頻繁な書き込みでの確実な永続化に対する本記事の推奨です。
- FILE_FLAG_WRITE_THROUGHは頻繁な書き込みでの確実な永続化に対する本記事の推奨です。
- FILE_FLAG_NO_BUFFERINGはシステムキャッシュビュー(256KBスロット)と両立しません。
- FlushViewOfFileはファイルマッピング(メモリマップトファイル)を前提とします。
- FlushViewOfFileはFlushFileBuffersより先に行うべきです。
- ファストI/OはProcess Monitor(procmon.exe)で確認できます。
- ファストI/Oはシステムキャッシュビュー(256KBスロット)を前提とします。
- ファストI/OはIRP(I/O要求パケット)と両立しません。
- ファストI/Oは同期I/Oを前提とします。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。