@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/windows-iocp-dotnet-threadpool/#article>
    schema:about <https://comcomponent.com/knowledge/iocp/>, <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    schema:mentions <https://comcomponent.com/knowledge/completion-key/>, <https://comcomponent.com/knowledge/createiocompletionport/>, <https://comcomponent.com/knowledge/getqueuedcompletionstatus/>, <https://comcomponent.com/knowledge/overlapped-structure/>, <https://comcomponent.com/knowledge/getqueuedcompletionstatusex/>, <https://comcomponent.com/knowledge/postqueuedcompletionstatus/>, <https://comcomponent.com/knowledge/concurrency-value/>, <https://comcomponent.com/knowledge/threadpool-io-api/>, <https://comcomponent.com/knowledge/overlapped-io/>, <https://comcomponent.com/knowledge/worker-thread-dotnet/>, <https://comcomponent.com/knowledge/io-completion-thread-dotnet/>, <https://comcomponent.com/knowledge/threadpoolboundhandle/>, <https://comcomponent.com/knowledge/nativeoverlapped/>, <https://comcomponent.com/knowledge/fileoptions-asynchronous/>, <https://comcomponent.com/knowledge/asynchronous-io/>, <https://comcomponent.com/knowledge/synchronizationcontext/>, <https://comcomponent.com/knowledge/configureawait-false/>, <https://comcomponent.com/knowledge/sync-over-async/>, <https://comcomponent.com/knowledge/threadpool-starvation/>, <https://comcomponent.com/knowledge/taskrun-dotnet/>, <https://comcomponent.com/knowledge/lifo-thread-scheduling/>, <https://comcomponent.com/knowledge/getavailablethreads-dotnet/>, <https://comcomponent.com/knowledge/error-operation-aborted/>, <https://comcomponent.com/knowledge/file-handle/>, <https://comcomponent.com/knowledge/fake-async/> .

<https://comcomponent.com/knowledge/iocp/> a skos:Concept ;
    skos:prefLabel "I/O完了ポート(IOCP)"@ja ;
    skos:definition "多数の非同期I/Oの完了通知を1つのFIFOキューに集約しつつ、実行可能なスレッド数をコンカレンシー値以下に保つスケジューリング機構を兼ねる、Windowsカーネルの仕組み。"@ja ;
    skos:altLabel "I/O Completion Port" ;
    skos:altLabel "IOCP" ;
    ks:uses <https://comcomponent.com/knowledge/completion-key/> ;
    ks:uses <https://comcomponent.com/knowledge/createiocompletionport/> ;
    ks:uses <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    ks:uses <https://comcomponent.com/knowledge/concurrency-value/> ;
    ks:uses <https://comcomponent.com/knowledge/lifo-thread-scheduling/> ;
    ks:requires <https://comcomponent.com/knowledge/file-handle/> .

<https://comcomponent.com/knowledge/dotnet-threadpool/> a skos:Concept ;
    skos:prefLabel ".NETスレッドプール"@ja ;
    skos:definition ".NETランタイムが提供する、ワーカースレッドとI/O完了スレッドの2階建てのスレッドプール。非同期I/Oのハンドルは内部で自前のI/O完了ポートに結び付けられる。"@ja ;
    skos:altLabel "managed thread pool" ;
    ks:uses <https://comcomponent.com/knowledge/iocp/> ;
    ks:uses <https://comcomponent.com/knowledge/worker-thread-dotnet/> ;
    ks:uses <https://comcomponent.com/knowledge/io-completion-thread-dotnet/> ;
    ks:verifiedBy <https://comcomponent.com/knowledge/getavailablethreads-dotnet/> .

<https://comcomponent.com/knowledge/completion-key/> a skos:Concept ;
    skos:prefLabel "CompletionKey"@ja ;
    skos:definition "ハンドルをI/O完了ポートへ関連付ける際に指定する、ユーザー定義の値。完了パケットに含まれて返り、「どのハンドルからの完了か」をワーカーへ伝える。接続オブジェクトのポインターを入れるのが定石。"@ja .

<https://comcomponent.com/knowledge/createiocompletionport/> a skos:Concept ;
    skos:prefLabel "CreateIoCompletionPort"@ja ;
    skos:definition "I/O完了ポートの新規作成と、既存ポートへのハンドルの関連付けの両方を行うWin32 API。NumberOfConcurrentThreadsでコンカレンシー値を指定する。"@ja ;
    ks:uses <https://comcomponent.com/knowledge/completion-key/> .

<https://comcomponent.com/knowledge/getqueuedcompletionstatus/> a skos:Concept ;
    skos:prefLabel "GetQueuedCompletionStatus"@ja ;
    skos:definition "I/O完了ポートのキューから完了パケットを1つ取り出すWin32 API。戻り値がFALSEでもOVERLAPPEDポインターが非NULLなら、失敗したI/Oの完了パケットを取り出せたことを意味する。"@ja ;
    skos:altLabel "GQCS" ;
    ks:uses <https://comcomponent.com/knowledge/completion-key/> ;
    ks:requires <https://comcomponent.com/knowledge/overlapped-structure/> .

<https://comcomponent.com/knowledge/overlapped-structure/> a skos:Concept ;
    skos:prefLabel "OVERLAPPED構造体"@ja ;
    skos:definition "発行中の非同期I/O操作1つを識別し、その状態(読み書き位置・完了イベント・転送バイト数)を運ぶデータ構造。同時に発行する操作の数だけ必要で、使い回すとデータ破損につながる。"@ja ;
    skos:altLabel "OVERLAPPED" .

<https://comcomponent.com/knowledge/getqueuedcompletionstatusex/> a skos:Concept ;
    skos:prefLabel "GetQueuedCompletionStatusEx"@ja ;
    skos:definition "複数の完了パケットを一度にまとめて取り出せるGetQueuedCompletionStatusの拡張版。高頻度I/Oで呼び出し回数を減らせる。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    ks:requires <https://comcomponent.com/knowledge/iocp/> .

<https://comcomponent.com/knowledge/postqueuedcompletionstatus/> a skos:Concept ;
    skos:prefLabel "PostQueuedCompletionStatus"@ja ;
    skos:definition "非同期I/Oを開始せずに、アプリケーション独自の完了パケットをI/O完了ポートのキューへ積めるWin32 API。ワーカーへの仕事依頼やシャットダウン指示に使う。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/iocp/> .

<https://comcomponent.com/knowledge/concurrency-value/> a skos:Concept ;
    skos:prefLabel "コンカレンシー値"@ja ;
    skos:definition "I/O完了ポートに関連付いた「実行可能なスレッド数」の上限。CreateIoCompletionPortのNumberOfConcurrentThreadsで指定し、0ならシステムのプロセッサ数が使われる。全体としての最良の最大値はCPU数とされる。"@ja ;
    skos:altLabel "NumberOfConcurrentThreads" ;
    ks:configuredBy <https://comcomponent.com/knowledge/createiocompletionport/> .

<https://comcomponent.com/knowledge/threadpool-io-api/> a skos:Concept ;
    skos:prefLabel "Windowsスレッドプールの I/O API"@ja ;
    skos:definition "内部でIOCPを使いながらスレッドの生成・管理を肩代わりする、新規のサーバーアプリケーション向けに推奨されるAPI群。"@ja ;
    skos:altLabel "CreateThreadpoolIo" ;
    skos:altLabel "StartThreadpoolIo" ;
    ks:uses <https://comcomponent.com/knowledge/iocp/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/overlapped-io/> .

<https://comcomponent.com/knowledge/overlapped-io/> a skos:Concept ;
    skos:prefLabel "Overlapped I/O"@ja ;
    skos:definition "FILE_FLAG_OVERLAPPEDを付けて開いたハンドルに対し、操作ごとのOVERLAPPED構造体を渡して行うWin32の非同期I/Oの具体的な実装形態。モードはハンドル単位でCreateFileの時点に決まる。"@ja ;
    skos:altLabel "オーバーラップドI/O"@ja ;
    skos:altLabel "非同期I/O(Win32)"@ja .

<https://comcomponent.com/knowledge/worker-thread-dotnet/> a skos:Concept ;
    skos:prefLabel "ワーカースレッド(.NET)"@ja ;
    skos:definition ".NETスレッドプールが提供する、Task.Runや継続の実行を担うスレッド群。I/O完了スレッドとは別に管理される。"@ja ;
    skos:altLabel "Worker Thread" ;
    skos:broader <https://comcomponent.com/knowledge/dotnet-threadpool/> .

<https://comcomponent.com/knowledge/io-completion-thread-dotnet/> a skos:Concept ;
    skos:prefLabel "I/O完了スレッド(.NET)"@ja ;
    skos:definition ".NETスレッドプールが提供する、非同期I/Oの完了を受け取って継続をスケジュールするスレッド群。ワーカースレッドとは別に管理される。"@ja ;
    skos:altLabel "I/O Completion Thread" ;
    skos:altLabel "completionPortThreads" ;
    skos:broader <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    ks:uses <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    ks:requires <https://comcomponent.com/knowledge/asynchronous-io/> .

<https://comcomponent.com/knowledge/threadpoolboundhandle/> a skos:Concept ;
    skos:prefLabel "ThreadPoolBoundHandle.BindHandle"@ja ;
    skos:definition "OSのハンドルをシステムスレッドプール(のI/O完了ポート)に結び付ける.NETの低レベルAPI。束縛したハンドルへの非同期I/OはNativeOverlappedと組み合わせて行う。"@ja ;
    skos:altLabel "ThreadPoolBoundHandle" ;
    ks:requires <https://comcomponent.com/knowledge/iocp/> ;
    ks:uses <https://comcomponent.com/knowledge/nativeoverlapped/> .

<https://comcomponent.com/knowledge/nativeoverlapped/> a skos:Concept ;
    skos:prefLabel "NativeOverlapped"@ja ;
    skos:definition "Win32のOVERLAPPED構造体を.NET側で表現した構造体。ThreadPoolBoundHandleに束縛したハンドルへの低レベルの非同期I/Oで使う。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/overlapped-structure/> ;
    ks:implements <https://comcomponent.com/knowledge/overlapped-structure/> .

<https://comcomponent.com/knowledge/fileoptions-asynchronous/> a skos:Concept ;
    skos:prefLabel "FileOptions.Asynchronous"@ja ;
    skos:definition ".NETのFileStreamコンストラクターやFile.OpenHandleで、OSレベルの非同期I/O(FILE_FLAG_OVERLAPPED)を有効にする指定。ハンドルのモードを直接決める。"@ja ;
    skos:altLabel "useAsync" .

<https://comcomponent.com/knowledge/asynchronous-io/> a skos:Concept ;
    skos:prefLabel "非同期I/O"@ja ;
    skos:definition "要求を発行した呼び出しがI/Oの完了を待たずにすぐ戻り、完了を別途の通知(イベント・APC・I/O完了ポートなど)で受け取るI/Oの形態。"@ja ;
    skos:altLabel "Asynchronous I/O" ;
    skos:altLabel "オーバーラップI/O"@ja .

<https://comcomponent.com/knowledge/synchronizationcontext/> a skos:Concept ;
    skos:prefLabel "SynchronizationContext"@ja ;
    skos:definition "awaitした時点の実行コンテキストを表す.NETのクラス。捕捉されると、非同期処理完了後の継続がそのコンテキストへ投げ返される(例: WPF/WinFormsのUIスレッド)。"@ja .

<https://comcomponent.com/knowledge/configureawait-false/> a skos:Concept ;
    skos:prefLabel "ConfigureAwait(false)"@ja ;
    skos:definition "awaitの継続を、捕捉したSynchronizationContextやTaskSchedulerへ投げ返さないことを指示する.NETの記法。「必ずスレッドプールへ移る」保証ではない。"@ja ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/synchronizationcontext/> .

<https://comcomponent.com/knowledge/sync-over-async/> a skos:Concept ;
    skos:prefLabel "同期待ちの混入(sync-over-async)"@ja ;
    skos:definition "非同期処理の継続やワーカーの中で、同期I/OやTask.Result/Wait()のような同期的な待ちを行ってしまうアンチパターン。スレッドプール飢餓の主因になる。"@ja ;
    skos:altLabel "sync-over-async" ;
    ks:mayCause <https://comcomponent.com/knowledge/threadpool-starvation/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/dotnet-threadpool/> .

<https://comcomponent.com/knowledge/threadpool-starvation/> a skos:Concept ;
    skos:prefLabel "スレッドプール飢餓(starvation)"@ja ;
    skos:definition "同期待ちの混入などでスレッドプールのスレッドが塞がり続け、負荷がかかった瞬間に「継続を実行したいのに実行するスレッドがない」状態に陥ること。"@ja ;
    skos:altLabel "Thread Pool Starvation" ;
    ks:verifiedBy <https://comcomponent.com/knowledge/getavailablethreads-dotnet/> .

<https://comcomponent.com/knowledge/taskrun-dotnet/> a skos:Concept ;
    skos:prefLabel "Task.Run"@ja ;
    skos:definition "CPUを使う処理を.NETスレッドプールのワーカースレッドへ明示的にオフロードするためのAPI。I/OバウンドのTaskに使う必要はない。"@ja ;
    ks:requires <https://comcomponent.com/knowledge/worker-thread-dotnet/> .

<https://comcomponent.com/knowledge/lifo-thread-scheduling/> a skos:Concept ;
    skos:prefLabel "LIFOスレッド解放"@ja ;
    skos:definition "I/O完了ポートで待機しているスレッドを、直前まで働いていたスレッドから優先して起こす設計。FIFOで積まれるキューと対照的で、コンテキストスイッチとキャッシュミスを減らす。"@ja ;
    skos:altLabel "LIFO release" .

<https://comcomponent.com/knowledge/getavailablethreads-dotnet/> a skos:Concept ;
    skos:prefLabel "ThreadPool.GetAvailableThreads"@ja ;
    skos:definition "ワーカースレッドとI/O完了スレッドの利用可能数を別々に取得できる.NETのAPI。スレッドプールの詰まりを調査する際の入口になる。"@ja ;
    skos:altLabel "GetAvailableThreads" .

<https://comcomponent.com/knowledge/error-operation-aborted/> a skos:Concept ;
    skos:prefLabel "ERROR_OPERATION_ABORTED"@ja ;
    skos:definition "CancelIoEx等で取り消された操作が、完了として返ってくる際のエラーコード。この通知を受け取るまでOVERLAPPEDとバッファを解放してはならない。"@ja .

<https://comcomponent.com/knowledge/fake-async/> a skos:Concept ;
    skos:prefLabel "見せかけの非同期"@ja ;
    skos:definition "同期モードのハンドルに対してReadAsync/WriteAsyncを呼んだ結果生じる状態。呼び出し元はブロックされないが、裏でスレッドプールのスレッドが同期読み書きを肩代わりして待つ。"@ja ;
    skos:altLabel "Fake Async" ;
    ks:uses <https://comcomponent.com/knowledge/worker-thread-dotnet/> .

<https://comcomponent.com/knowledge/file-handle/> a skos:Concept ;
    skos:prefLabel "ファイルハンドル"@ja ;
    skos:definition "プロセスのハンドルテーブルを経由した、ファイルオブジェクトへの参照。CreateFileが返し、ユーザーモードのプロセスがI/O操作の対象を指定するのに使う値。"@ja ;
    skos:altLabel "HANDLE" ;
    skos:altLabel "SafeFileHandle" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iocp/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/completion-key/> ;
    schema:description "ハンドルをポートへ関連付けるときに指定するCompletionKeyが、完了パケットに含まれて「どのハンドルからの完了か」をワーカーへ伝える"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iocp/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/createiocompletionport/> ;
    schema:description "CreateIoCompletionPortはポートの新規作成と、既存ポートへのハンドルの関連付けの両方を行う"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iocp/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    schema:description "ワーカースレッドはGetQueuedCompletionStatusを呼んでポートのキューから完了パケットを1つ取り出す"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports>, <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/completion-key/> ;
    schema:description "取り出した結果として、転送バイト数・CompletionKey・OVERLAPPEDポインターが得られる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/overlapped-structure/> ;
    schema:description "戻り値がFALSEでもOVERLAPPEDポインターが非NULLなら、失敗したI/Oの完了パケットを取り出せたことを意味し、後始末が必要になる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/getqueuedcompletionstatusex/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/iocp/> ;
    schema:description "複数の完了パケットを一度に取り出すGetQueuedCompletionStatusExは、I/O完了ポートを対象にした拡張版で、高頻度I/Oでの呼び出し回数を減らせる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatusex> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/postqueuedcompletionstatus/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/iocp/> ;
    schema:description "PostQueuedCompletionStatusは、非同期I/Oを発行することなく自前の完了パケットをI/O完了ポートのキューに積める"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/postqueuedcompletionstatus/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/completion-key/> ;
    schema:description "自前のパケットにも任意のCompletionKeyを乗せられるので、ワーカーへの仕事依頼やシャットダウン指示を同じキュー・同じループで流せる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-postqueuedcompletionstatus> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/concurrency-value/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/createiocompletionport/> ;
    schema:description "コンカレンシー値はCreateIoCompletionPortのNumberOfConcurrentThreadsで指定し、0を渡すとシステムのプロセッサ数が使われる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iocp/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/concurrency-value/> ;
    schema:description "コンカレンシー値は「実行可能なスレッド数」の上限として働き、完了通知のキューとスレッド数制御を一体化する仕組みの核になる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/threadpool-io-api/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/iocp/> ;
    schema:description "CreateThreadpoolIo/StartThreadpoolIoは、内部でIOCPを使いながらスレッドの生成・管理を肩代わりする"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/threadpool-io-api/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/overlapped-io/> ;
    schema:description "新規のサーバーアプリケーションが非同期I/Oを扱うなら、生のIOCPよりまずWindowsスレッドプールAPIを検討すべきというのがドキュメントの立場"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/iocp/> ;
    schema:description ".NETスレッドプールは自前のI/O完了ポートを持ち、非同期I/Oのハンドルをそこに関連付ける"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.threading.threadpoolboundhandle.bindhandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/worker-thread-dotnet/> ;
    schema:description ".NETスレッドプールは、Task.Runや継続を実行するワーカースレッドを提供する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/io-completion-thread-dotnet/> ;
    schema:description ".NETスレッドプールは、非同期I/Oの完了を受け取るためのI/O完了スレッドをワーカースレッドとは別に提供する"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/threadpoolboundhandle/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/iocp/> ;
    schema:description "ThreadPoolBoundHandle.BindHandleは、OSのハンドルをシステムスレッドプール(のI/O完了ポート)に結び付ける"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.threading.threadpoolboundhandle.bindhandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/threadpoolboundhandle/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/nativeoverlapped/> ;
    schema:description "束縛したハンドルへの低レベルの非同期I/Oは、NativeOverlappedと組み合わせて行う"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.threading.threadpoolboundhandle.bindhandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/nativeoverlapped/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/overlapped-structure/> ;
    schema:description ".NETのNativeOverlappedは、Win32のOVERLAPPED構造体を.NET側で表現したもの"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.threading.threadpoolboundhandle.bindhandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/fileoptions-asynchronous/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/threadpoolboundhandle/> ;
    schema:description "FileStreamやSocketが非同期モードのハンドルを開くと、内部でThreadPoolBoundHandle相当の結び付けが行われる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.threading.threadpoolboundhandle.bindhandle> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/io-completion-thread-dotnet/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    schema:description "I/O完了スレッドは、GetQueuedCompletionStatusループに相当する仕組みでポートから完了パケットを取り出す"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/asynchronous-io/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/synchronizationcontext/> ;
    schema:description "UIスレッドでawaitした非同期I/Oでは、継続の実行先としてその時点のSynchronizationContextが捕捉される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/async-in-depth> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/configureawait-false/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/synchronizationcontext/> ;
    schema:description "ConfigureAwait(false)を付けたawaitは、捕捉したSynchronizationContextへ継続を投げ返さない。SynchronizationContext自体が消えるわけでも、必ずスレッドプールへ移る保証があるわけでもなく、そのawaitの再開に使われなくなるということ"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/async-in-depth> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sync-over-async/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/threadpool-starvation/> ;
    schema:description "継続やワーカーの中で同期I/OやTask.Result/Wait()のような同期待ちをすると、そのスレッドが塞がったままになり、負荷がかかった瞬間にスレッドプールの飢餓を招く"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sync-over-async/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    schema:description "asyncの道はasyncのまま最後まで通すのが原則で、I/O完了スレッドや継続の中に同期待ちを混ぜるべきではない"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/taskrun-dotnet/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/worker-thread-dotnet/> ;
    schema:description "Task.Runで包んだCPUバウンドの処理は、ワーカースレッドを1本占有して実行される"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iocp/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/lifo-thread-scheduling/> ;
    schema:description "完了パケットはFIFOで積まれるが、待っているスレッドはLIFOで起こされるため、直前まで働いていた「温まった」スレッドが次のパケットも拾い、コンテキストスイッチがほぼ起きない"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-threadpool/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/getavailablethreads-dotnet/> ;
    schema:description "ThreadPool.GetAvailableThreadsで、ワーカースレッドとI/O完了スレッドの利用可能数を別々に観測できる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/threadpool-starvation/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/getavailablethreads-dotnet/> ;
    schema:description "詰まりの調査の入口として、まずワーカー/I/O完了スレッドの空きをThreadPool.GetAvailableThreadsで見る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/threading/the-managed-thread-pool> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/getqueuedcompletionstatus/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/error-operation-aborted/> ;
    schema:description "取り消された操作の完了パケットも通常どおりキューに積まれ、GetQueuedCompletionStatusはそれをERROR_OPERATION_ABORTEDを伴う失敗パケットとして返す"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-getqueuedcompletionstatus> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/io-completion-thread-dotnet/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/asynchronous-io/> ;
    schema:description "I/O完了スレッドは非同期I/Oの完了を受けて、結果を確定させ登録されていた継続をスケジュールする"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/async-in-depth> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/fake-async/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/worker-thread-dotnet/> ;
    schema:description "見せかけの非同期では、呼び出し元はブロックされない代わりに、ワーカースレッドの1本が同期読み書きを肩代わりして待つ"@ja ;
    ks:evidence <https://devblogs.microsoft.com/dotnet/file-io-improvements-in-dotnet-6/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/createiocompletionport/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/completion-key/> ;
    schema:description "ハンドルの関連付け時に指定するCompletionKeyはユーザー定義の値で、完了パケットに含まれて返る(接続オブジェクトへのポインターを入れるのが定石)"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/api/ioapiset/nf-ioapiset-createiocompletionport> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/iocp/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/file-handle/> ;
    schema:description "I/O完了ポートに関連付けられるのは、オーバーラップI/Oを話せるファイル・ソケット・名前付きパイプなどのハンドルである"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/i-o-completion-ports> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
