知識マップ: 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による精度向上は根本的な解決にはなりません。
flowchart LR
accTitle: timerポーリングとイベント待機の知識マップ
accDescr: 短いtimer waitがsystem clock resolutionとスケジューリング遅延の二重の不確実さを持つこと、イベント駆動の待機がキュー到着・I/O完了・停止要求・同一プロセス内の値変化のそれぞれにどう対応するか、waitable timerとWaitOnAddressの使い分けの関係を示す図
timer_polling["timerポーリング(様子見ループ)"]
event_driven_wait["イベント駆動の待機設計"]
system_clock_resolution["system clock resolution(platform timer resolution)"]
scheduler_latency["スケジューリング遅延"]
queue_arrival_wait["キューへの仕事到着待ち"]
windows_event_object["Windowsのイベントオブジェクト"]
wait_functions["Windowsの待機関数(Wait Functions)"]
overlapped_io["Overlapped I/O"]
io_completion_wait["I/O完了待ち"]
iocp["I/O完了ポート(IOCP)"]
stop_request_wait["停止要求待ち"]
waitonaddress["WaitOnAddress API"]
same_process_value_change_wait["同一プロセス内の値変化待ち"]
data_race["データ競合(data race)"]
waitable_timer["待機可能タイマー(waitable timer)"]
time_based_wait["時刻そのものが条件の待ち"]
timebeginperiod["timeBeginPeriod(タイマー分解能要求)"]
getsystemtimeadjustment["GetSystemTimeAdjustment"]
interrupt_processing_delay["割り込み処理に伴う遅延要因(ISR/DPC)"]
timer_polling -->|"前提とする"| system_clock_resolution
timer_polling -.->|"原因になり得る"| scheduler_latency
event_driven_wait -.->|"原因になり得る"| scheduler_latency
timer_polling -->|"用いるのは非推奨"| queue_arrival_wait
windows_event_object -->|"推奨される対応"| queue_arrival_wait
wait_functions -->|"利用する"| windows_event_object
overlapped_io -->|"推奨される対応"| io_completion_wait
iocp -->|"推奨される対応"| io_completion_wait
timer_polling -->|"用いるのは非推奨"| io_completion_wait
windows_event_object -->|"推奨される対応"| stop_request_wait
timer_polling -->|"用いるのは非推奨"| stop_request_wait
wait_functions -->|"推奨される対応"| stop_request_wait
waitonaddress -->|"推奨される対応"| same_process_value_change_wait
waitonaddress -.->|"原因になり得る"| data_race
waitable_timer -->|"推奨される対応"| time_based_wait
timebeginperiod -->|"用いるのは非推奨"| queue_arrival_wait
system_clock_resolution -->|"で確認できる"| getsystemtimeadjustment
interrupt_processing_delay -.->|"原因になり得る"| scheduler_latency
iocp -->|"利用する"| overlapped_io
wait_functions -->|"利用する"| waitable_timer
timer_polling -->|"用いるのは非推奨"| same_process_value_change_wait
概念間の関係(全21件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- timerポーリング(様子見ループ)はsystem clock resolution(platform timer resolution)を前提とします。
- timerポーリング(様子見ループ)はスケジューリング遅延の原因になることがあります。
- イベント駆動の待機設計はスケジューリング遅延の原因になることがあります。
- timerポーリング(様子見ループ)をキューへの仕事到着待ちに用いることは推奨されません。
- Windowsのイベントオブジェクトはキューへの仕事到着待ちに対する本記事の推奨です。
- Windowsの待機関数(Wait Functions)はWindowsのイベントオブジェクトを利用します。
- Overlapped I/OはI/O完了待ちに対する本記事の推奨です。
- I/O完了ポート(IOCP)はI/O完了待ちに対する本記事の推奨です。
- timerポーリング(様子見ループ)をI/O完了待ちに用いることは推奨されません。
- Windowsのイベントオブジェクトは停止要求待ちに対する本記事の推奨です。
- timerポーリング(様子見ループ)を停止要求待ちに用いることは推奨されません。
- Windowsの待機関数(Wait Functions)は停止要求待ちに対する本記事の推奨です。
- WaitOnAddress APIは同一プロセス内の値変化待ちに対する本記事の推奨です。
- WaitOnAddress APIはデータ競合(data race)の原因になることがあります。
- 待機可能タイマー(waitable timer)は時刻そのものが条件の待ちに対する本記事の推奨です。
- timeBeginPeriod(タイマー分解能要求)をキューへの仕事到着待ちに用いることは推奨されません。
- system clock resolution(platform timer resolution)はGetSystemTimeAdjustmentで確認できます。
- 割り込み処理に伴う遅延要因(ISR/DPC)はスケジューリング遅延の原因になることがあります。
- I/O完了ポート(IOCP)はOverlapped I/Oを利用します。
- Windowsの待機関数(Wait Functions)は待機可能タイマー(waitable timer)を利用します。
- timerポーリング(様子見ループ)を同一プロセス内の値変化待ちに用いることは推奨されません。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。