知識マップ: 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が食い違うと「見せかけの非同期」が生まれます。

同期I/O・非同期I/O・OVERLAPPEDの知識マップ同期I/Oと非同期I/Oの分かれ目、FILE_FLAG_OVERLAPPEDがハンドル単位のモードを決めること、OVERLAPPED構造体が操作1つぶんの伝票であること、非同期発行でも同期完了する条件(キャッシュ・NTFS圧縮・EFS暗号化・拡張書き込み)、CancelIoExによるキャンセルの作法、.NETのFileOptions.Asynchronousとの対応を示す図実装を担うで構成できる利用する実装を担う両立しない前提とする原因になり得る前提とする原因になり得る原因になり得る原因になり得る両立しない原因になり得る前提とする前提とする利用する前提とするの後継前提とする原因になり得る前提とする推奨される対応推奨される対応用いるのは非推奨前提とする推奨される対応実装を担う前提とする防止する前提とする原因になり得る利用する原因になり得る利用する利用する両立しない同期I/O非同期I/OOverlapped I/OCreateFileOVERLAPPED構造体I/OマネージャーReadFile/WriteFile同期完了キャッシュマネージャーNTFS圧縮NTFS暗号化(EFS)ファイルファイルを伸ばす書き込みERROR_IO_PENDINGGetOverlappedResultReadFileEx/WriteFileExAPC(非同期プロシージャコール)Alertable waitCancelIoExCancelIoERROR_OPERATION_ABORTEDCancelSynchronousIoSetFileCompletionNotificationModesI/O完了ポート(IOCP)FileOptions.Asynchronous見せかけの非同期File.OpenHandle + RandomAccessIRP(I/O要求パケット)CancellationToken(.NET)

概念間の関係(全36件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

同期I/O
I/O要求の完了まで呼び出しが戻らないI/Oの形態。実体は「完了する前には戻らない」という保証であり、要求がペンディングになったときだけスレッドが待機状態になる。
非同期I/O
要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。
Overlapped I/O
FILE_FLAG_OVERLAPPEDを付けて開いたハンドルに対し、操作ごとのOVERLAPPED構造体を渡して行うWin32の非同期I/Oの具体的な実装形態。モードはハンドル単位でCreateFileの時点に決まる。
I/Oマネージャー
Windowsカーネルモードで、アプリケーションとデバイスドライバーの間のI/O要求を統括するコンポーネント。要求のほとんどをIRPに詰めてデバイススタックへ流す。
ReadFile/WriteFile
ファイルやデバイスの読み書きを行うWin32 API。非同期モードのハンドルに対してはOVERLAPPED構造体の指定が必須で、戻り値とGetLastErrorの組み合わせで結果が3通りに分かれる。
同期完了
非同期モードのハンドルへ発行したI/Oが、呼び出しの中でその場(TRUEを返して)完了すること。キャッシュヒット・NTFS圧縮/暗号化・拡張書き込みなどで起こる。
NTFS圧縮
データを圧縮ユニット単位で圧縮して格納するNTFSの透過的な圧縮機能。読み書きのたびに展開・再圧縮のコストが伴う。
NTFS暗号化(EFS)ファイル
EFS(Encrypting File System)で暗号化されたファイル。NTFS圧縮と同様、アクセスが同期処理に変換されるため非同期発行でも同期的に完了する。
ファイルを伸ばす書き込み
ファイルの長さを増やす書き込み操作。非同期発行でも同期的に完了する条件の1つ。
ERROR_IO_PENDING
非同期モードのハンドルへの発行が受理され、完了はまだであることを示すエラーコード(997)。エラーではなく「受理」を意味する。
GetOverlappedResult
非同期操作の結果(成否と転送バイト数)を、対応するOVERLAPPED構造体から取得するWin32 API。bWait=TRUEで完了まで待つこともできる。
ReadFileEx/WriteFileEx
完了時に呼ばれる完了ルーチン(コールバック)を受け取るReadFile/WriteFileの拡張版。完了ルーチンは発行したスレッドのAPCキューに積まれる。
APC(非同期プロシージャコール)
特定スレッドのコンテキストで非同期に実行される関数。各スレッドが自分のAPCキューを持ち、ユーザーモードAPCはスレッドがalertable状態のときにのみ実行される。
CancelIoEx
どのスレッドが発行したかに関係なく、指定ハンドルの未完了I/Oにキャンセルを要求できるWin32 API。取り消された操作はERROR_OPERATION_ABORTEDでの完了として返る。
ERROR_OPERATION_ABORTED
CancelIoEx等で取り消された操作が、完了として返ってくる際のエラーコード。この通知を受け取るまでOVERLAPPEDとバッファを解放してはならない。
CancelSynchronousIo
指定したスレッドが実行中の同期I/O操作にキャンセルを要求するWin32 API。同期I/Oで固まっている別スレッドを外から取り消すために使う。
CancelIo
呼び出したスレッド自身が発行したI/O操作しか取り消せない、CancelIoExの前身にあたるWin32 API。
SetFileCompletionNotificationModes
I/Oが即時に成功した場合にI/O完了ポートへ完了パケットを積まない動作(FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)を選べるWin32 API。OVERLAPPED.hEventのシグナルは抑止しない。
FileOptions.Asynchronous
.NETのFileStreamコンストラクターやFile.OpenHandleで、OSレベルの非同期I/O(FILE_FLAG_OVERLAPPED)を有効にする指定。ハンドルのモードを直接決める。
見せかけの非同期
同期モードのハンドルに対してReadAsync/WriteAsyncを呼んだ結果生じる状態。呼び出し元はブロックされないが、裏でスレッドプールのスレッドが同期読み書きを肩代わりして待つ。
File.OpenHandle + RandomAccess
.NET 6以降で、SafeFileHandleとオフセットを明示して読み書きするAPI。Win32の非同期ハンドル+OVERLAPPED.Offsetという素の形に近い書き方ができる。
CancellationToken(.NET)
.NETの協調的キャンセルの仕組み。非同期モードのハンドルへのファイルI/Oでは、内部的にCancelIoExの呼び出しに行き着く。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。