レースコンディション(コンピューティングおよび電子システム)
レースコンディションは、イベントの相対的なタイミングによってシステムの動作が左右される不具合である。ハードウェアとソフトウェア、特に並行・マルチスレッド・分散システムで発生する。
概要
レースコンディションとは、イベントの相対的なタイミングまたは順序によって、システムの出力や動作が左右されるようになる、システムの設計または実装上の欠陥である。この用語はデジタル論理回路とソフトウェアシステムの両方に用いられ、特に並行して実行されるスレッド、割り込みハンドラ、分散コンポーネントを含むシステムに当てはまる。結果がタイミングに依存するため、レースコンディションはしばしば非決定的であり、同じ入力でも実行ごとに異なる結果を生じることがある。
原因と共通する特徴
レースコンディションは、複数の主体(ハードウェア信号、スレッド、プロセス、ノード)が、明確に定義された協調なしに共有状態や相互の動作に関与する場合に発生する。典型的な要因には、コンパイラまたはCPUによる命令の並べ替え、共有メモリへの非同期化アクセス、ロックの不適切な使用、分散システムにおけるイベント順序に関する仮定がある。CPUスケジューリング、ネットワーク遅延、割り込みのタイミングといったわずかな時間的変動によって、競合が顕在化するかどうかが変わるため、再現は困難である。
- 非決定性:実行ごとに動作が異なる。
- タイミング依存性:結果がイベント間の相対的なタイミングに依存する。
- 共有状態:同じリソースまたは変数に対する並行アクセス。
- 負荷時まで見えない:負荷が高い場合または特定のハードウェアでのみ現れることがある。
例と区別
ソフトウェアにおける典型例には、検査してから実行する不具合(たとえばファイルの存在確認後に開く処理)、セキュリティ攻撃で悪用される検査時から使用時までの競合(TOCTOU)、誤ったダブルチェックド・ロッキングのパターンがある。ハードウェアでは、信号伝搬遅延によって組合せ論理回路に一時的な誤出力が生じる場合、レースハザードが発生する。関連するがより限定的な用語であるデータ競合は、同一のメモリ位置への非同期の並行アクセスのうち、少なくとも一方が書き込みである状況を指す。
防止と検出
レースコンディションの緩和には、順序付けと共有リソースへのアクセスを明示的に制御することが必要である。一般的な手法には、ミューテックスなどのロックプリミティブ、アトミック操作、メモリバリアまたはフェンス、トランザクショナルメモリ、操作を冪等となるよう設計することが含まれる。分散システムでは、合意アルゴリズム、ベクタークロック、単調増加カウンタが、ノード間の順序管理に役立つ。動的レース検出器、静的解析器、形式検証などの検出ツールは多くの競合を発見できる。また開発者は、タイミング依存の不具合を明らかにするため、ストレステストやコードレビューも利用する。設計上の考慮事項については設計リソースを、ツールに関する指針についてはソフトウェアの競合検出を参照。
レースコンディションは、断続的で再現が難しい障害を引き起こし、データ破損やセキュリティ上の脆弱性につながる可能性がある。そのため、ハードウェア工学とソフトウェア工学の双方において、信頼性および安全性に関する重要な問題の一類型とみなされている。
関連項目
著者
AlegsaOnline.com レースコンディション(コンピューティングおよび電子システム) Leandro Alegsa
URL: https://ja.alegsaonline.com/art/80679