知識マップ: WindowsでSleep(1)よりイベント待機を優先すべき理由

記事「WindowsでSleep(1)よりイベント待機を優先すべき理由」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

Windowsの短いtimer waitはsystem clock resolutionの粒度に縛られるうえ、timeoutが来てもスレッドはready状態になるだけで実行開始はスケジューラ次第になるため、Sleep(1)でキューや停止要求を様子見するポーリング設計は思ったより不正確です。producerがSetEventで知らせ、consumerがWaitForSingleObjectやWaitForMultipleObjectsで待つイベント駆動に変えると、待ちの終わり方が時間切れではなくsignalになり、無駄な空振りが消えます。I/O完了はoverlapped I/OのイベントやIOCP、同一プロセス内の値変化はWaitOnAddress、時刻そのものが条件のときだけwaitable timerを使うというのが道具の選び分けで、timeBeginPeriodによる精度向上は根本的な解決にはなりません。

timerポーリングとイベント待機の知識マップ短いtimer waitがsystem clock resolutionとスケジューリング遅延の二重の不確実さを持つこと、イベント駆動の待機がキュー到着・I/O完了・停止要求・同一プロセス内の値変化のそれぞれにどう対応するか、waitable timerとWaitOnAddressの使い分けの関係を示す図前提とする原因になり得る原因になり得る用いるのは非推奨推奨される対応利用する推奨される対応推奨される対応用いるのは非推奨推奨される対応用いるのは非推奨推奨される対応推奨される対応原因になり得る推奨される対応用いるのは非推奨で確認できる原因になり得る利用する利用する用いるのは非推奨timerポーリング(様子見ループ)イベント駆動の待機設計system clock resolution(platform timer resolution)スケジューリング遅延キューへの仕事到着待ちWindowsのイベントオブジェクトWindowsの待機関数(Wait Functions)Overlapped I/OI/O完了待ちI/O完了ポート(IOCP)停止要求待ちWaitOnAddress API同一プロセス内の値変化待ちデータ競合(data race)待機可能タイマー(waitable timer)時刻そのものが条件の待ちtimeBeginPeriod(タイマー分解能要求)GetSystemTimeAdjustment割り込み処理に伴う遅延要因(ISR/DPC)

概念間の関係(全21件)

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

主要概念の定義

timerポーリング(様子見ループ)
一定時間ごとに起きて状態を確認する、Sleepや短いtimeout付きwaitを使った待機設計。
イベント駆動の待機設計
何かが起きた側がsignalし、待つ側はそのsignalを待つ待機設計。
Windowsのイベントオブジェクト
SetEventの呼び出しでsignaled状態になり、待機中のスレッドを起こせるWindowsの同期オブジェクト。
Windowsの待機関数(Wait Functions)
カーネルオブジェクトがsignalされるか、指定したtimeoutが経過するまで呼び出し元スレッドを待たせるWindowsのAPI群。
Overlapped I/O
FILE_FLAG_OVERLAPPEDを付けて開いたハンドルに対し、操作ごとのOVERLAPPED構造体を渡して行うWin32の非同期I/Oの具体的な実装形態。モードはハンドル単位でCreateFileの時点に決まる。
I/O完了ポート(IOCP)
多数の非同期I/Oの完了通知を1つのFIFOキューに集約しつつ、実行可能なスレッド数をコンカレンシー値以下に保つスケジューリング機構を兼ねる、Windowsカーネルの仕組み。
WaitOnAddress API
同一プロセス内で、あるメモリ番地の値が変わるまで待つための同期API。Windows 8/Windows Server 2012以降で使える。
待機可能タイマー(waitable timer)
指定時刻にsignaledになるカーネルオブジェクト。CREATE_WAITABLE_TIMER_HIGH_RESOLUTIONを付けると高精度版になり、Sleepより周期待ちの土台に向く。
timeBeginPeriod(タイマー分解能要求)
システムのタイマー分解能を引き上げるWin32関数。必要な間だけ呼び、終わったらtimeEndPeriodで戻す使い方が前提で、分解能を上げてもQPCの精度自体は上がらない。
system clock resolution(platform timer resolution)
OSが時刻を更新する間隔。timed waitのtimeout判定はこの粒度に引っ張られ、既定では15.6ミリ秒級になることが多い。
割り込み処理に伴う遅延要因(ISR/DPC)
割り込み時に最優先で走るISRと、その続きとして積まれる優先度の高いDPCによる、待機スレッドの実行開始を遅らせる要因。

機械可読データ

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