知識マップ: Windows I/Oの深層(第2回) ── 同期I/Oと非同期I/O:OVERLAPPEDの本当の意味
記事「Windows I/Oの深層(第2回) ── 同期I/Oと非同期I/O:OVERLAPPEDの本当の意味」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
同期I/Oと非同期I/Oは別の配管ではなく、I/Oマネージャーが完了を待つか待たずに戻るかの違いです。非同期モードはCreateFileの時点でハンドル単位に決まり、発行中の操作ごとに用意するOVERLAPPED構造体が位置と完了状態を運びます。ただしキャッシュヒットやNTFS圧縮・EFS暗号化・拡張書き込みでは非同期発行でも同期的に完了し、CancelIoExによる取り消しも完了通知を見届けるまでは依頼に過ぎません。.NETのFileOptions.Asynchronousはこのモードの直通スイッチで、モードとAPIが食い違うと「見せかけの非同期」が生まれます。
flowchart LR
accTitle: 同期I/O・非同期I/O・OVERLAPPEDの知識マップ
accDescr: 同期I/Oと非同期I/Oの分かれ目、FILE_FLAG_OVERLAPPEDがハンドル単位のモードを決めること、OVERLAPPED構造体が操作1つぶんの伝票であること、非同期発行でも同期完了する条件(キャッシュ・NTFS圧縮・EFS暗号化・拡張書き込み)、CancelIoExによるキャンセルの作法、.NETのFileOptions.Asynchronousとの対応を示す図
synchronous_io["同期I/O"]
asynchronous_io["非同期I/O"]
overlapped_io["Overlapped I/O"]
createfile["CreateFile"]
overlapped_structure["OVERLAPPED構造体"]
io_manager["I/Oマネージャー"]
readfile["ReadFile/WriteFile"]
sync_completion["同期完了"]
cache_manager["キャッシュマネージャー"]
ntfs_compression["NTFS圧縮"]
efs_encryption["NTFS暗号化(EFS)ファイル"]
extending_write["ファイルを伸ばす書き込み"]
error_io_pending["ERROR_IO_PENDING"]
getoverlappedresult["GetOverlappedResult"]
readfileex["ReadFileEx/WriteFileEx"]
apc["APC(非同期プロシージャコール)"]
alertable_wait["Alertable wait"]
cancelioex["CancelIoEx"]
cancelio["CancelIo"]
error_operation_aborted["ERROR_OPERATION_ABORTED"]
cancelsynchronousio["CancelSynchronousIo"]
setfilecompletionnotificationmodes["SetFileCompletionNotificationModes"]
iocp["I/O完了ポート(IOCP)"]
fileoptions_asynchronous["FileOptions.Asynchronous"]
fake_async["見せかけの非同期"]
randomaccess_dotnet["File.OpenHandle + RandomAccess"]
irp["IRP(I/O要求パケット)"]
cancellationtoken_dotnet["CancellationToken(.NET)"]
overlapped_io -->|"実装を担う"| asynchronous_io
overlapped_io -->|"で構成できる"| createfile
overlapped_io -->|"利用する"| overlapped_structure
io_manager -->|"実装を担う"| synchronous_io
asynchronous_io -->|"両立しない"| synchronous_io
readfile -.->|"前提とする"| overlapped_structure
readfile -.->|"原因になり得る"| sync_completion
sync_completion -.->|"前提とする"| cache_manager
ntfs_compression -->|"原因になり得る"| sync_completion
efs_encryption -->|"原因になり得る"| sync_completion
extending_write -->|"原因になり得る"| sync_completion
sync_completion -->|"両立しない"| error_io_pending
readfile -.->|"原因になり得る"| error_io_pending
error_io_pending -->|"前提とする"| overlapped_io
getoverlappedresult -->|"前提とする"| overlapped_structure
readfileex -->|"利用する"| apc
apc -->|"前提とする"| alertable_wait
cancelioex -->|"の後継"| cancelio
cancelioex -->|"前提とする"| overlapped_structure
cancelioex -.->|"原因になり得る"| error_operation_aborted
error_operation_aborted -->|"前提とする"| overlapped_structure
cancelsynchronousio -->|"推奨される対応"| synchronous_io
cancelioex -->|"推奨される対応"| overlapped_io
cancelio -->|"用いるのは非推奨"| overlapped_io
setfilecompletionnotificationmodes -->|"前提とする"| iocp
setfilecompletionnotificationmodes -.->|"推奨される対応"| sync_completion
fileoptions_asynchronous -->|"実装を担う"| overlapped_io
fake_async -->|"前提とする"| synchronous_io
fileoptions_asynchronous -->|"防止する"| fake_async
randomaccess_dotnet -.->|"前提とする"| fileoptions_asynchronous
cancelsynchronousio -->|"原因になり得る"| error_operation_aborted
overlapped_io -.->|"利用する"| iocp
asynchronous_io -.->|"原因になり得る"| sync_completion
cancelioex -->|"利用する"| irp
cancellationtoken_dotnet -.->|"利用する"| cancelioex
cancellationtoken_dotnet -.->|"両立しない"| fake_async
概念間の関係(全36件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- Overlapped I/Oは非同期I/Oの実装を担います。
- Overlapped I/OはCreateFileで構成できます。
- Overlapped I/OはOVERLAPPED構造体を利用します。
- I/Oマネージャーは同期I/Oの実装を担います。
- 非同期I/Oは同期I/Oと両立しません。
- ReadFile/WriteFileはOVERLAPPED構造体を前提とします。
- ReadFile/WriteFileは同期完了の原因になることがあります。
- 同期完了はキャッシュマネージャーを前提とします。
- NTFS圧縮は同期完了の原因になることがあります。
- NTFS暗号化(EFS)ファイルは同期完了の原因になることがあります。
- ファイルを伸ばす書き込みは同期完了の原因になることがあります。
- 同期完了はERROR_IO_PENDINGと両立しません。
- ReadFile/WriteFileはERROR_IO_PENDINGの原因になることがあります。
- ERROR_IO_PENDINGはOverlapped I/Oを前提とします。
- GetOverlappedResultはOVERLAPPED構造体を前提とします。
- ReadFileEx/WriteFileExはAPC(非同期プロシージャコール)を利用します。
- APC(非同期プロシージャコール)はAlertable waitを前提とします。
- CancelIoExはCancelIoの後継に当たります。
- CancelIoExはOVERLAPPED構造体を前提とします。
- CancelIoExはERROR_OPERATION_ABORTEDの原因になることがあります。
- ERROR_OPERATION_ABORTEDはOVERLAPPED構造体を前提とします。
- CancelSynchronousIoは同期I/Oに対する本記事の推奨です。
- CancelIoExはOverlapped I/Oに対する本記事の推奨です。
- CancelIoをOverlapped I/Oに用いることは推奨されません。
- SetFileCompletionNotificationModesはI/O完了ポート(IOCP)を前提とします。
- SetFileCompletionNotificationModesは同期完了に対する本記事の推奨です。
- FileOptions.AsynchronousはOverlapped I/Oの実装を担います。
- 見せかけの非同期は同期I/Oを前提とします。
- FileOptions.Asynchronousは見せかけの非同期を防ぎます。
- File.OpenHandle + RandomAccessはFileOptions.Asynchronousを前提とします。
- CancelSynchronousIoはERROR_OPERATION_ABORTEDの原因になることがあります。
- Overlapped I/OはI/O完了ポート(IOCP)を利用します。
- 非同期I/Oは同期完了の原因になることがあります。
- CancelIoExはIRP(I/O要求パケット)を利用します。
- CancellationToken(.NET)はCancelIoExを利用します。
- CancellationToken(.NET)は見せかけの非同期と両立しません。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。