同期I/O・非同期I/O・OVERLAPPEDの知識マップ(知識グラフ)
type: Dataset

同期I/O
type: Concept
definition: I/O要求の完了まで呼び出しが戻らないI/Oの形態。実体は「完了する前には戻らない」という保証であり、要求がペンディングになったときだけスレッドが待機状態になる。
alternative label: Synchronous I/O

非同期I/O
type: Concept
definition: 要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。
alternative label: Asynchronous I/O
alternative label: オーバーラップI/O
incompatible with: 同期I/O

Overlapped I/O
type: Concept
definition: FILE_FLAG_OVERLAPPEDを付けて開いたハンドルに対し、操作ごとのOVERLAPPED構造体を渡して行うWin32の非同期I/Oの具体的な実装形態。モードはハンドル単位でCreateFileの時点に決まる。
alternative label: オーバーラップドI/O
alternative label: 非同期I/O(Win32)
implements: 非同期I/O
configured by: CreateFile
uses: OVERLAPPED構造体

CreateFile
type: Concept
definition: ファイルだけでなく物理ディスク・ボリューム・COMポート・パイプなどのデバイスも、名前解決を通じて共通に開けるWin32 API。開いた対象ごとにファイルオブジェクトが作られる。
alternative label: CreateFileW
alternative label: CreateFileA

OVERLAPPED構造体
type: Concept
definition: 発行中の非同期I/O操作1つを識別し、その状態(読み書き位置・完了イベント・転送バイト数)を運ぶデータ構造。同時に発行する操作の数だけ必要で、使い回すとデータ破損につながる。
alternative label: OVERLAPPED

I/Oマネージャー
type: Concept
definition: Windowsカーネルモードで、アプリケーションとデバイスドライバーの間のI/O要求を統括するコンポーネント。要求のほとんどをIRPに詰めてデバイススタックへ流す。
alternative label: I/O Manager
alternative label: IOマネージャー
implements: 同期I/O

ReadFile/WriteFile
type: Concept
definition: ファイルやデバイスの読み書きを行うWin32 API。非同期モードのハンドルに対してはOVERLAPPED構造体の指定が必須で、戻り値とGetLastErrorの組み合わせで結果が3通りに分かれる。
alternative label: ReadFile
alternative label: WriteFile

同期完了
type: Concept
definition: 非同期モードのハンドルへ発行したI/Oが、呼び出しの中でその場(TRUEを返して)完了すること。キャッシュヒット・NTFS圧縮/暗号化・拡張書き込みなどで起こる。
alternative label: Synchronous Completion
incompatible with: ERROR_IO_PENDING

キャッシュマネージャー
type: Concept
definition: ファイルデータをメモリ上のシステムキャッシュに保持し、読み書きの多くをディスクI/Oなしで処理させるWindowsカーネルのコンポーネント。ファストI/Oの近道もこのキャッシュを直接利用する。
alternative label: Cache Manager

NTFS圧縮
type: Concept
definition: データを圧縮ユニット単位で圧縮して格納するNTFSの透過的な圧縮機能。読み書きのたびに展開・再圧縮のコストが伴う。
alternative label: ファイル圧縮(NTFS)
may cause: 同期完了

NTFS暗号化(EFS)ファイル
type: Concept
definition: EFS(Encrypting File System)で暗号化されたファイル。NTFS圧縮と同様、アクセスが同期処理に変換されるため非同期発行でも同期的に完了する。
alternative label: EFS
alternative label: Encrypting File System
may cause: 同期完了

ファイルを伸ばす書き込み
type: Concept
definition: ファイルの長さを増やす書き込み操作。非同期発行でも同期的に完了する条件の1つ。
alternative label: Extending Write
may cause: 同期完了

ERROR_IO_PENDING
type: Concept
definition: 非同期モードのハンドルへの発行が受理され、完了はまだであることを示すエラーコード(997)。エラーではなく「受理」を意味する。
alternative label: IO_PENDING
requires: Overlapped I/O

GetOverlappedResult
type: Concept
definition: 非同期操作の結果(成否と転送バイト数)を、対応するOVERLAPPED構造体から取得するWin32 API。bWait=TRUEで完了まで待つこともできる。
requires: OVERLAPPED構造体

ReadFileEx/WriteFileEx
type: Concept
definition: 完了時に呼ばれる完了ルーチン(コールバック)を受け取るReadFile/WriteFileの拡張版。完了ルーチンは発行したスレッドのAPCキューに積まれる。
alternative label: ReadFileEx
alternative label: WriteFileEx
broader: ReadFile/WriteFile
uses: APC(非同期プロシージャコール)

APC(非同期プロシージャコール)
type: Concept
definition: 特定スレッドのコンテキストで非同期に実行される関数。各スレッドが自分のAPCキューを持ち、ユーザーモードAPCはスレッドがalertable状態のときにのみ実行される。
alternative label: Asynchronous Procedure Call
alternative label: APC
requires: Alertable wait

Alertable wait
type: Concept
definition: SleepEx・WaitForSingleObjectExなど、待機中にAPCキューのエントリを実行できる待機状態。APCが配達されるにはスレッドがこの状態に入っている必要がある。
alternative label: alertable待機

CancelIoEx
type: Concept
definition: どのスレッドが発行したかに関係なく、指定ハンドルの未完了I/Oにキャンセルを要求できるWin32 API。取り消された操作はERROR_OPERATION_ABORTEDでの完了として返る。
succeeds: CancelIo
requires: OVERLAPPED構造体
recommended for: Overlapped I/O
uses: IRP(I/O要求パケット)

CancelIo
type: Concept
definition: 呼び出したスレッド自身が発行したI/O操作しか取り消せない、CancelIoExの前身にあたるWin32 API。
not recommended for: Overlapped I/O

ERROR_OPERATION_ABORTED
type: Concept
definition: CancelIoEx等で取り消された操作が、完了として返ってくる際のエラーコード。この通知を受け取るまでOVERLAPPEDとバッファを解放してはならない。
requires: OVERLAPPED構造体

CancelSynchronousIo
type: Concept
definition: 指定したスレッドが実行中の同期I/O操作にキャンセルを要求するWin32 API。同期I/Oで固まっている別スレッドを外から取り消すために使う。
recommended for: 同期I/O
may cause: ERROR_OPERATION_ABORTED

SetFileCompletionNotificationModes
type: Concept
definition: I/Oが即時に成功した場合にI/O完了ポートへ完了パケットを積まない動作(FILE_SKIP_COMPLETION_PORT_ON_SUCCESS)を選べるWin32 API。OVERLAPPED.hEventのシグナルは抑止しない。
alternative label: FILE_SKIP_COMPLETION_PORT_ON_SUCCESS
requires: I/O完了ポート(IOCP)

I/O完了ポート(IOCP)
type: Concept
definition: 多数の非同期I/Oの完了通知を1つのFIFOキューに集約しつつ、実行可能なスレッド数をコンカレンシー値以下に保つスケジューリング機構を兼ねる、Windowsカーネルの仕組み。
alternative label: I/O Completion Port
alternative label: IOCP

FileOptions.Asynchronous
type: Concept
definition: .NETのFileStreamコンストラクターやFile.OpenHandleで、OSレベルの非同期I/O(FILE_FLAG_OVERLAPPED)を有効にする指定。ハンドルのモードを直接決める。
alternative label: useAsync
implements: Overlapped I/O
prevents: 見せかけの非同期

見せかけの非同期
type: Concept
definition: 同期モードのハンドルに対してReadAsync/WriteAsyncを呼んだ結果生じる状態。呼び出し元はブロックされないが、裏でスレッドプールのスレッドが同期読み書きを肩代わりして待つ。
alternative label: Fake Async
requires: 同期I/O

File.OpenHandle + RandomAccess
type: Concept
definition: .NET 6以降で、SafeFileHandleとオフセットを明示して読み書きするAPI。Win32の非同期ハンドル+OVERLAPPED.Offsetという素の形に近い書き方ができる。
alternative label: RandomAccess

IRP(I/O要求パケット)
type: Concept
definition: デバイスドライバーに送られる要求のほとんどが詰め込まれるパケット。要求全体のヘッダーと、経由するドライバーの数だけ並ぶI/Oスタックロケーションを持つ。
alternative label: I/O Request Packet
alternative label: IRP

CancellationToken(.NET)
type: Concept
definition: .NETの協調的キャンセルの仕組み。非同期モードのハンドルへのファイルI/Oでは、内部的にCancelIoExの呼び出しに行き着く。
alternative label: CancellationToken

subject: Overlapped I/O
predicate: implements
object: 非同期I/O
description: Overlapped I/Oは、FILE_FLAG_OVERLAPPEDとOVERLAPPED構造体という具体的なAPIの形で非同期I/Oを実装したもの
evidence: synchronous-and-asynchronous-i-o
verified at: 2026-08-01
certainty: established

subject: Overlapped I/O
predicate: configuredBy
object: CreateFile
description: 非同期モードはCreateFileにFILE_FLAG_OVERLAPPEDを渡すことでハンドル単位に決まり、呼び出しごとには切り替えられない
evidence: synchronous-and-asynchronous-i-o
evidence: nf-fileapi-readfile
verified at: 2026-08-01
certainty: established

subject: Overlapped I/O
predicate: uses
object: OVERLAPPED構造体
description: 発行中の操作1つを識別し、その状態(位置・完了・転送バイト数)を運ぶためにOVERLAPPED構造体を使う
evidence: ns-minwinbase-overlapped
verified at: 2026-08-01
certainty: established

subject: I/Oマネージャー
predicate: implements
object: 同期I/O
description: 要求がペンディングになった場合、I/Oマネージャーが完了を待ち合わせてからアプリへ制御を返すことで同期I/Oを実現する
evidence: synchronous-and-asynchronous-i-o
evidence: windows-kernel-mode-i-o-manager
verified at: 2026-08-01
certainty: established

subject: 非同期I/O
predicate: incompatibleWith
object: 同期I/O
description: 同じハンドルは同期モードか非同期モードのどちらか一方であり、呼び出しごとに切り替えることはできない
evidence: synchronous-and-asynchronous-i-o
verified at: 2026-08-01
certainty: established

subject: ReadFile/WriteFile
predicate: requires
object: OVERLAPPED構造体
description: 非同期モードのハンドルにReadFile/WriteFileを発行する場合、OVERLAPPED構造体の指定が必須になる
evidence: nf-fileapi-readfile
verified at: 2026-08-01
certainty: context-dependent

subject: ReadFile/WriteFile
predicate: mayCause
object: 同期完了
description: 非同期ハンドルへの発行でも、要求がすぐ満たせる場合はTRUEを返してその場で完了することがある
evidence: asynchronous-disk-io-synchronous
verified at: 2026-08-01
certainty: context-dependent

subject: 同期完了
predicate: requires
object: キャッシュマネージャー
description: 同期完了の代表例は、要求されたデータがキャッシュマネージャーの管理するキャッシュに全部載っている場合である
evidence: asynchronous-disk-io-synchronous
verified at: 2026-08-01
certainty: context-dependent

subject: NTFS圧縮
predicate: mayCause
object: 同期完了
description: NTFS圧縮されたファイルへのアクセスは、ファイルシステムドライバーが同期処理に変換するため、非同期発行でも同期的に完了する
evidence: asynchronous-disk-io-synchronous
verified at: 2026-08-01
certainty: established

subject: NTFS暗号化(EFS)ファイル
predicate: mayCause
object: 同期完了
description: NTFS暗号化(EFS)されたファイルへのアクセスも、同期処理に変換されるため非同期発行でも同期的に完了する
evidence: asynchronous-disk-io-synchronous
verified at: 2026-08-01
certainty: established

subject: ファイルを伸ばす書き込み
predicate: mayCause
object: 同期完了
description: ファイルの長さを伸ばす書き込みは同期処理になるため、非同期発行でも同期的に完了する
evidence: asynchronous-disk-io-synchronous
verified at: 2026-08-01
certainty: established

subject: 同期完了
predicate: incompatibleWith
object: ERROR_IO_PENDING
description: 1回の発行結果として、TRUE(同期完了)とFALSE+ERROR_IO_PENDING(進行中)は同時には起こらない
evidence: nf-fileapi-readfile
verified at: 2026-08-01
certainty: established

subject: ReadFile/WriteFile
predicate: mayCause
object: ERROR_IO_PENDING
description: 要求が受理されたが完了はまだの場合、FALSEとERROR_IO_PENDINGが返り、完了は通知側で受け取る
evidence: nf-fileapi-readfile
verified at: 2026-08-01
certainty: context-dependent

subject: ERROR_IO_PENDING
predicate: requires
object: Overlapped I/O
description: ERROR_IO_PENDINGは非同期モード(Overlapped I/O)のハンドルへの発行に特有の戻り値である
evidence: nf-fileapi-readfile
verified at: 2026-08-01
certainty: established

subject: GetOverlappedResult
predicate: requires
object: OVERLAPPED構造体
description: GetOverlappedResultは、対応するOVERLAPPED構造体から操作の成否と転送バイト数を取り出す
evidence: nf-ioapiset-getoverlappedresult
verified at: 2026-08-01
certainty: established

subject: ReadFileEx/WriteFileEx
predicate: uses
object: APC(非同期プロシージャコール)
description: ReadFileEx/WriteFileExは、完了時に呼ばれる完了ルーチンを発行したスレッドのAPCキューに積む方式で通知する
evidence: nf-fileapi-readfileex
evidence: asynchronous-procedure-calls
verified at: 2026-08-01
certainty: established

subject: APC(非同期プロシージャコール)
predicate: requires
object: Alertable wait
description: APCが実際に実行されるのは、対象スレッドがSleepExなどのalertable waitに入ったときに限られる
evidence: alertable-i-o
evidence: asynchronous-procedure-calls
verified at: 2026-08-01
certainty: established

subject: CancelIoEx
predicate: succeeds
object: CancelIo
description: CancelIoExはCancelIoの後継で、発行したスレッド以外からも未完了I/Oを取り消せるようになった(Vistaで追加)
evidence: nf-ioapiset-cancelioex
evidence: nf-ioapiset-cancelio
verified at: 2026-08-01
certainty: established

subject: CancelIoEx
predicate: requires
object: OVERLAPPED構造体
description: 特定の1操作だけを取り消したい場合、対応するOVERLAPPEDへのポインターを渡す(NULLならそのハンドルの全操作が対象)
evidence: nf-ioapiset-cancelioex
verified at: 2026-08-01
certainty: established

subject: CancelIoEx
predicate: mayCause
object: ERROR_OPERATION_ABORTED
description: 取り消しに成功した操作はERROR_OPERATION_ABORTEDとしての完了通知になる。完了間際だった操作は正常完了することもある
evidence: nf-ioapiset-cancelioex
evidence: canceling-pending-i-o-operations
verified at: 2026-08-01
certainty: context-dependent

subject: ERROR_OPERATION_ABORTED
predicate: requires
object: OVERLAPPED構造体
description: ERROR_OPERATION_ABORTEDの完了通知を受け取るまでは、OVERLAPPEDとバッファをカーネルが使用中であり解放してはならない
evidence: canceling-pending-i-o-operations
verified at: 2026-08-01
certainty: established

subject: CancelSynchronousIo
predicate: recommendedFor
object: 同期I/O
description: 同期I/Oで固まっている別スレッドを外から取り消したいときは、CancelIoEx系ではなくCancelSynchronousIoを使う
evidence: nf-ioapiset-cancelsynchronousio
evidence: canceling-pending-i-o-operations
verified at: 2026-08-01
certainty: established

subject: CancelIoEx
predicate: recommendedFor
object: Overlapped I/O
description: 非同期I/Oの取り消しには、どのスレッドが発行したかに関係なく使えるCancelIoExを使う
evidence: nf-ioapiset-cancelioex
verified at: 2026-08-01
certainty: established

subject: CancelIo
predicate: notRecommendedFor
object: Overlapped I/O
description: CancelIoは呼び出したスレッド自身が発行した操作しか取り消せない制約があり、CancelIoExが使える環境であえて選ぶ理由はない
evidence: nf-ioapiset-cancelio
verified at: 2026-08-01
certainty: established

subject: SetFileCompletionNotificationModes
predicate: requires
object: I/O完了ポート(IOCP)
description: FILE_SKIP_COMPLETION_PORT_ON_SUCCESSが抑止できるのはI/O完了ポートへの完了パケットだけで、OVERLAPPED.hEventのシグナルは抑止されない
evidence: nf-winbase-setfilecompletionnotificationmodes
verified at: 2026-08-01
certainty: established

subject: SetFileCompletionNotificationModes
predicate: recommendedFor
object: 同期完了
description: 同期完了時に結果はその場で分かっているので、高頻度I/Oでは完了ポートへのパケットを省いてキュー経由の無駄を減らす最適化として使う
evidence: nf-winbase-setfilecompletionnotificationmodes
verified at: 2026-08-01
certainty: context-dependent

subject: FileOptions.Asynchronous
predicate: implements
object: Overlapped I/O
description: .NETのFileOptions.Asynchronous(useAsync)はFILE_FLAG_OVERLAPPEDへの直通スイッチで、指定するとハンドルが非同期モードで開かれる
evidence: asynchronous-file-i-o
verified at: 2026-08-01
certainty: established

subject: 見せかけの非同期
predicate: requires
object: 同期I/O
description: 見せかけの非同期は、ハンドルが同期モードのままReadAsync/WriteAsyncを呼んだときに生じる。スレッドプールのスレッドが同期読み書きを肩代わりして待つ
evidence: file-io-improvements-in-dotnet-6
verified at: 2026-08-01
certainty: established

subject: FileOptions.Asynchronous
predicate: prevents
object: 見せかけの非同期
description: FileOptions.Asynchronousでハンドルを非同期モードで開けば、ReadAsync呼び出しが本物の非同期I/Oになり、見せかけの非同期を避けられる
evidence: file-io-improvements-in-dotnet-6
evidence: asynchronous-file-i-o
verified at: 2026-08-01
certainty: established

subject: File.OpenHandle + RandomAccess
predicate: requires
object: FileOptions.Asynchronous
description: .NET 6以降のFile.OpenHandle+RandomAccessを非同期に使うには、FileOptions.Asynchronousでハンドルを開く
evidence: file-io-improvements-in-dotnet-6
verified at: 2026-08-01
certainty: context-dependent

subject: CancelSynchronousIo
predicate: mayCause
object: ERROR_OPERATION_ABORTED
description: CancelSynchronousIoで取り消された同期操作は、ERROR_OPERATION_ABORTEDでの失敗として返る
evidence: nf-ioapiset-cancelsynchronousio
verified at: 2026-08-01
certainty: established

subject: Overlapped I/O
predicate: uses
object: I/O完了ポート(IOCP)
description: 多数の同時I/Oを少数のスレッドで受ける完了通知の経路として、ハンドルをI/O完了ポートに関連付けることができる
evidence: i-o-completion-ports
verified at: 2026-08-01
certainty: context-dependent

subject: 非同期I/O
predicate: mayCause
object: 同期完了
description: 非同期に発行しても、キャッシュヒットやNTFS圧縮・暗号化・拡張書き込みなどの条件が揃えばその場で完了することがあり、応答性は保証されない
evidence: asynchronous-disk-io-synchronous
verified at: 2026-08-01
certainty: context-dependent

subject: CancelIoEx
predicate: uses
object: IRP(I/O要求パケット)
description: CancelIoExは該当する未完了IRPにキャンセルをマークし、ドライバーのキャンセルルーチンを呼び出させる
evidence: nf-ioapiset-cancelioex
verified at: 2026-08-01
certainty: established

subject: CancellationToken(.NET)
predicate: uses
object: CancelIoEx
description: 非同期モードのハンドルであれば、.NETのCancellationTokenによるファイルI/Oのキャンセルは内部的にCancelIoExに行き着く
evidence: nf-ioapiset-cancelioex
evidence: asynchronous-file-i-o
verified at: 2026-08-01
certainty: context-dependent

subject: CancellationToken(.NET)
predicate: incompatibleWith
object: 見せかけの非同期
description: 同期モードのハンドルによる見せかけの非同期では、取り消し対象となるオーバーラップ操作が存在しないため、CancellationTokenによる中断は確実には効かない
evidence: file-io-improvements-in-dotnet-6
verified at: 2026-08-01
certainty: context-dependent