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

.NETスレッドプール
type: Concept
definition: .NETランタイムが提供する、ワーカースレッドとI/O完了スレッドの2階建てのスレッドプール。非同期I/Oのハンドルは内部で自前のI/O完了ポートに結び付けられる。
alternative label: managed thread pool
uses: I/O完了ポート(IOCP)
uses: ワーカースレッド(.NET)
uses: I/O完了スレッド(.NET)
verified by: ThreadPool.GetAvailableThreads

CompletionKey
type: Concept
definition: ハンドルをI/O完了ポートへ関連付ける際に指定する、ユーザー定義の値。完了パケットに含まれて返り、「どのハンドルからの完了か」をワーカーへ伝える。接続オブジェクトのポインターを入れるのが定石。

CreateIoCompletionPort
type: Concept
definition: I/O完了ポートの新規作成と、既存ポートへのハンドルの関連付けの両方を行うWin32 API。NumberOfConcurrentThreadsでコンカレンシー値を指定する。
uses: CompletionKey

GetQueuedCompletionStatus
type: Concept
definition: I/O完了ポートのキューから完了パケットを1つ取り出すWin32 API。戻り値がFALSEでもOVERLAPPEDポインターが非NULLなら、失敗したI/Oの完了パケットを取り出せたことを意味する。
alternative label: GQCS
uses: CompletionKey
requires: OVERLAPPED構造体

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

GetQueuedCompletionStatusEx
type: Concept
definition: 複数の完了パケットを一度にまとめて取り出せるGetQueuedCompletionStatusの拡張版。高頻度I/Oで呼び出し回数を減らせる。
broader: GetQueuedCompletionStatus
requires: I/O完了ポート(IOCP)

PostQueuedCompletionStatus
type: Concept
definition: 非同期I/Oを開始せずに、アプリケーション独自の完了パケットをI/O完了ポートのキューへ積めるWin32 API。ワーカーへの仕事依頼やシャットダウン指示に使う。
requires: I/O完了ポート(IOCP)

コンカレンシー値
type: Concept
definition: I/O完了ポートに関連付いた「実行可能なスレッド数」の上限。CreateIoCompletionPortのNumberOfConcurrentThreadsで指定し、0ならシステムのプロセッサ数が使われる。全体としての最良の最大値はCPU数とされる。
alternative label: NumberOfConcurrentThreads
configured by: CreateIoCompletionPort

Windowsスレッドプールの I/O API
type: Concept
definition: 内部でIOCPを使いながらスレッドの生成・管理を肩代わりする、新規のサーバーアプリケーション向けに推奨されるAPI群。
alternative label: CreateThreadpoolIo
alternative label: StartThreadpoolIo
uses: I/O完了ポート(IOCP)
recommended for: Overlapped 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)

ワーカースレッド(.NET)
type: Concept
definition: .NETスレッドプールが提供する、Task.Runや継続の実行を担うスレッド群。I/O完了スレッドとは別に管理される。
alternative label: Worker Thread
broader: .NETスレッドプール

I/O完了スレッド(.NET)
type: Concept
definition: .NETスレッドプールが提供する、非同期I/Oの完了を受け取って継続をスケジュールするスレッド群。ワーカースレッドとは別に管理される。
alternative label: I/O Completion Thread
alternative label: completionPortThreads
broader: .NETスレッドプール
uses: GetQueuedCompletionStatus
requires: 非同期I/O

ThreadPoolBoundHandle.BindHandle
type: Concept
definition: OSのハンドルをシステムスレッドプール(のI/O完了ポート)に結び付ける.NETの低レベルAPI。束縛したハンドルへの非同期I/OはNativeOverlappedと組み合わせて行う。
alternative label: ThreadPoolBoundHandle
requires: I/O完了ポート(IOCP)
uses: NativeOverlapped

NativeOverlapped
type: Concept
definition: Win32のOVERLAPPED構造体を.NET側で表現した構造体。ThreadPoolBoundHandleに束縛したハンドルへの低レベルの非同期I/Oで使う。
broader: OVERLAPPED構造体
implements: OVERLAPPED構造体

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

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

SynchronizationContext
type: Concept
definition: awaitした時点の実行コンテキストを表す.NETのクラス。捕捉されると、非同期処理完了後の継続がそのコンテキストへ投げ返される(例: WPF/WinFormsのUIスレッド)。

同期待ちの混入(sync-over-async)
type: Concept
definition: 非同期処理の継続やワーカーの中で、同期I/OやTask.Result/Wait()のような同期的な待ちを行ってしまうアンチパターン。スレッドプール飢餓の主因になる。
alternative label: sync-over-async
may cause: スレッドプール飢餓(starvation)
not recommended for: .NETスレッドプール

スレッドプール飢餓(starvation)
type: Concept
definition: 同期待ちの混入などでスレッドプールのスレッドが塞がり続け、負荷がかかった瞬間に「継続を実行したいのに実行するスレッドがない」状態に陥ること。
alternative label: Thread Pool Starvation
verified by: ThreadPool.GetAvailableThreads

Task.Run
type: Concept
definition: CPUを使う処理を.NETスレッドプールのワーカースレッドへ明示的にオフロードするためのAPI。I/OバウンドのTaskに使う必要はない。
requires: ワーカースレッド(.NET)

LIFOスレッド解放
type: Concept
definition: I/O完了ポートで待機しているスレッドを、直前まで働いていたスレッドから優先して起こす設計。FIFOで積まれるキューと対照的で、コンテキストスイッチとキャッシュミスを減らす。
alternative label: LIFO release

ThreadPool.GetAvailableThreads
type: Concept
definition: ワーカースレッドとI/O完了スレッドの利用可能数を別々に取得できる.NETのAPI。スレッドプールの詰まりを調査する際の入口になる。
alternative label: GetAvailableThreads

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

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

subject: I/O完了ポート(IOCP)
predicate: uses
object: CompletionKey
description: ハンドルをポートへ関連付けるときに指定するCompletionKeyが、完了パケットに含まれて「どのハンドルからの完了か」をワーカーへ伝える
evidence: nf-ioapiset-createiocompletionport
verified at: 2026-08-01
certainty: established

subject: I/O完了ポート(IOCP)
predicate: uses
object: CreateIoCompletionPort
description: CreateIoCompletionPortはポートの新規作成と、既存ポートへのハンドルの関連付けの両方を行う
evidence: nf-ioapiset-createiocompletionport
verified at: 2026-08-01
certainty: established

subject: I/O完了ポート(IOCP)
predicate: uses
object: GetQueuedCompletionStatus
description: ワーカースレッドはGetQueuedCompletionStatusを呼んでポートのキューから完了パケットを1つ取り出す
evidence: i-o-completion-ports
evidence: nf-ioapiset-getqueuedcompletionstatus
verified at: 2026-08-01
certainty: established

subject: GetQueuedCompletionStatus
predicate: uses
object: CompletionKey
description: 取り出した結果として、転送バイト数・CompletionKey・OVERLAPPEDポインターが得られる
evidence: nf-ioapiset-getqueuedcompletionstatus
verified at: 2026-08-01
certainty: established

subject: GetQueuedCompletionStatus
predicate: requires
object: OVERLAPPED構造体
description: 戻り値がFALSEでもOVERLAPPEDポインターが非NULLなら、失敗したI/Oの完了パケットを取り出せたことを意味し、後始末が必要になる
evidence: nf-ioapiset-getqueuedcompletionstatus
verified at: 2026-08-01
certainty: established

subject: GetQueuedCompletionStatusEx
predicate: requires
object: I/O完了ポート(IOCP)
description: 複数の完了パケットを一度に取り出すGetQueuedCompletionStatusExは、I/O完了ポートを対象にした拡張版で、高頻度I/Oでの呼び出し回数を減らせる
evidence: nf-ioapiset-getqueuedcompletionstatusex
verified at: 2026-08-01
certainty: established

subject: PostQueuedCompletionStatus
predicate: requires
object: I/O完了ポート(IOCP)
description: PostQueuedCompletionStatusは、非同期I/Oを発行することなく自前の完了パケットをI/O完了ポートのキューに積める
evidence: nf-ioapiset-postqueuedcompletionstatus
verified at: 2026-08-01
certainty: established

subject: PostQueuedCompletionStatus
predicate: uses
object: CompletionKey
description: 自前のパケットにも任意のCompletionKeyを乗せられるので、ワーカーへの仕事依頼やシャットダウン指示を同じキュー・同じループで流せる
evidence: nf-ioapiset-postqueuedcompletionstatus
verified at: 2026-08-01
certainty: context-dependent

subject: コンカレンシー値
predicate: configuredBy
object: CreateIoCompletionPort
description: コンカレンシー値はCreateIoCompletionPortのNumberOfConcurrentThreadsで指定し、0を渡すとシステムのプロセッサ数が使われる
evidence: nf-ioapiset-createiocompletionport
verified at: 2026-08-01
certainty: established

subject: I/O完了ポート(IOCP)
predicate: uses
object: コンカレンシー値
description: コンカレンシー値は「実行可能なスレッド数」の上限として働き、完了通知のキューとスレッド数制御を一体化する仕組みの核になる
evidence: i-o-completion-ports
verified at: 2026-08-01
certainty: established

subject: Windowsスレッドプールの I/O API
predicate: uses
object: I/O完了ポート(IOCP)
description: CreateThreadpoolIo/StartThreadpoolIoは、内部でIOCPを使いながらスレッドの生成・管理を肩代わりする
evidence: i-o-completion-ports
verified at: 2026-08-01
certainty: established

subject: Windowsスレッドプールの I/O API
predicate: recommendedFor
object: Overlapped I/O
description: 新規のサーバーアプリケーションが非同期I/Oを扱うなら、生のIOCPよりまずWindowsスレッドプールAPIを検討すべきというのがドキュメントの立場
evidence: i-o-completion-ports
verified at: 2026-08-01
certainty: established

subject: .NETスレッドプール
predicate: uses
object: I/O完了ポート(IOCP)
description: .NETスレッドプールは自前のI/O完了ポートを持ち、非同期I/Oのハンドルをそこに関連付ける
evidence: system.threading.threadpoolboundhandle.bindhandle
verified at: 2026-08-01
certainty: established

subject: .NETスレッドプール
predicate: uses
object: ワーカースレッド(.NET)
description: .NETスレッドプールは、Task.Runや継続を実行するワーカースレッドを提供する
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: .NETスレッドプール
predicate: uses
object: I/O完了スレッド(.NET)
description: .NETスレッドプールは、非同期I/Oの完了を受け取るためのI/O完了スレッドをワーカースレッドとは別に提供する
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: ThreadPoolBoundHandle.BindHandle
predicate: requires
object: I/O完了ポート(IOCP)
description: ThreadPoolBoundHandle.BindHandleは、OSのハンドルをシステムスレッドプール(のI/O完了ポート)に結び付ける
evidence: system.threading.threadpoolboundhandle.bindhandle
verified at: 2026-08-01
certainty: established

subject: ThreadPoolBoundHandle.BindHandle
predicate: uses
object: NativeOverlapped
description: 束縛したハンドルへの低レベルの非同期I/Oは、NativeOverlappedと組み合わせて行う
evidence: system.threading.threadpoolboundhandle.bindhandle
verified at: 2026-08-01
certainty: established

subject: NativeOverlapped
predicate: implements
object: OVERLAPPED構造体
description: .NETのNativeOverlappedは、Win32のOVERLAPPED構造体を.NET側で表現したもの
evidence: system.threading.threadpoolboundhandle.bindhandle
verified at: 2026-08-01
certainty: established

subject: FileOptions.Asynchronous
predicate: requires
object: ThreadPoolBoundHandle.BindHandle
description: FileStreamやSocketが非同期モードのハンドルを開くと、内部でThreadPoolBoundHandle相当の結び付けが行われる
evidence: system.threading.threadpoolboundhandle.bindhandle
verified at: 2026-08-01
certainty: context-dependent

subject: I/O完了スレッド(.NET)
predicate: uses
object: GetQueuedCompletionStatus
description: I/O完了スレッドは、GetQueuedCompletionStatusループに相当する仕組みでポートから完了パケットを取り出す
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: 非同期I/O
predicate: uses
object: SynchronizationContext
description: UIスレッドでawaitした非同期I/Oでは、継続の実行先としてその時点のSynchronizationContextが捕捉される
evidence: async-in-depth
verified at: 2026-08-01
certainty: context-dependent

subject: 同期待ちの混入(sync-over-async)
predicate: mayCause
object: スレッドプール飢餓(starvation)
description: 継続やワーカーの中で同期I/OやTask.Result/Wait()のような同期待ちをすると、そのスレッドが塞がったままになり、負荷がかかった瞬間にスレッドプールの飢餓を招く
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: 同期待ちの混入(sync-over-async)
predicate: notRecommendedFor
object: .NETスレッドプール
description: asyncの道はasyncのまま最後まで通すのが原則で、I/O完了スレッドや継続の中に同期待ちを混ぜるべきではない
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: Task.Run
predicate: requires
object: ワーカースレッド(.NET)
description: Task.Runで包んだCPUバウンドの処理は、ワーカースレッドを1本占有して実行される
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: I/O完了ポート(IOCP)
predicate: uses
object: LIFOスレッド解放
description: 完了パケットはFIFOで積まれるが、待っているスレッドはLIFOで起こされるため、直前まで働いていた「温まった」スレッドが次のパケットも拾い、コンテキストスイッチがほぼ起きない
evidence: i-o-completion-ports
verified at: 2026-08-01
certainty: established

subject: .NETスレッドプール
predicate: verifiedBy
object: ThreadPool.GetAvailableThreads
description: ThreadPool.GetAvailableThreadsで、ワーカースレッドとI/O完了スレッドの利用可能数を別々に観測できる
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: スレッドプール飢餓(starvation)
predicate: verifiedBy
object: ThreadPool.GetAvailableThreads
description: 詰まりの調査の入口として、まずワーカー/I/O完了スレッドの空きをThreadPool.GetAvailableThreadsで見る
evidence: the-managed-thread-pool
verified at: 2026-08-01
certainty: established

subject: GetQueuedCompletionStatus
predicate: mayCause
object: ERROR_OPERATION_ABORTED
description: 取り消された操作の完了パケットも通常どおりキューに積まれ、GetQueuedCompletionStatusはそれをERROR_OPERATION_ABORTEDを伴う失敗パケットとして返す
evidence: nf-ioapiset-getqueuedcompletionstatus
verified at: 2026-08-01
certainty: context-dependent

subject: I/O完了スレッド(.NET)
predicate: requires
object: 非同期I/O
description: I/O完了スレッドは非同期I/Oの完了を受けて、結果を確定させ登録されていた継続をスケジュールする
evidence: async-in-depth
verified at: 2026-08-01
certainty: established

subject: 見せかけの非同期
predicate: uses
object: ワーカースレッド(.NET)
description: 見せかけの非同期では、呼び出し元はブロックされない代わりに、ワーカースレッドの1本が同期読み書きを肩代わりして待つ
evidence: file-io-improvements-in-dotnet-6
verified at: 2026-08-01
certainty: established

subject: CreateIoCompletionPort
predicate: uses
object: CompletionKey
description: ハンドルの関連付け時に指定するCompletionKeyはユーザー定義の値で、完了パケットに含まれて返る(接続オブジェクトへのポインターを入れるのが定石)
evidence: nf-ioapiset-createiocompletionport
verified at: 2026-08-01
certainty: established

subject: I/O完了ポート(IOCP)
predicate: requires
object: Overlapped I/O
description: カーネルのI/O完了を受け取る使い方の場合、I/O完了ポートに関連付けられるのはオーバーラップI/Oを話せるファイル・ソケット・名前付きパイプなどのハンドルに限られる。ハンドルを1つも関連付けず、PostQueuedCompletionStatusで自前の完了パケットだけを流すワークキューとして使うなら、オーバーラップI/Oは介さない。
evidence: i-o-completion-ports
verified at: 2026-08-01
certainty: context-dependent