OSのタスク管理と排他制御
OSのタスク管理は、タスクの状態遷移と実行順序を制御する仕組みであり、排他制御は共有資源への同時アクセスを防ぐ仕組みである。デッドロックは、複数のタスクが互いに相手の保持する資源を待ち続け、どのタスクも先に進めなくなる状態を指す。リアルタイムOSでは、優先度に基づくプリエンプションにより、各タスクが期限内に処理を完了できるかが重要な判断事項になる。
タスクの状態遷移とプリエンプション
タスクは、実行状態、実行可能状態、待ち状態、休止状態、終了状態などの間を遷移しながら処理を進める。プリエンプションは、優先度の高いタスクが実行可能になったときに実行中のタスクからCPUを取り上げる仕組みである。CPUを取り上げられたタスクは、実行を続ける条件が整っていれば実行可能状態に戻り、次のCPU割当てを待つことになる。プリエンプションはCPUの割当てを切り替える操作であり、タスクの終了や待ち状態への移行とは区別して理解する必要がある。
再帰的な処理では、呼出しごとにレジスタや変数の内容を保存しておく必要がある。後から呼び出された処理が先に終了するため、保存先には最後に入れたものを最初に取り出すLIFOの方式が適している。FIFOのように先に入れたものを先に取り出す方式は、呼出しの逆順に戻る必要があるこの用途には適さない。
排他制御と資源獲得の順序
共有資源を排他的に使う場面では、セマフォを用いて資源の獲得と解放を管理する。相互排他に使う場合は、一つのタスクだけが資源を取得できるよう制御するミューテックスとして働く。例えば、一つのI²Cバスに接続された二つのセンサを複数のタスクが読む場合、各タスクはバスを使う前にロックを取得し、読み取り後に解放する。片方が使用中はもう片方が待つため、バスへの同時アクセスを防げる。
デッドロックは、複数のタスクが複数の資源を排他的に使い、資源を保持したまま相手の資源を待つ循環待ちが生じることで起きる。取得順序が食い違うプロセスを同時に動かすと、互いに待ち合う状態が生じ得る。
この循環待ちを防ぐ有効な方法は、両方のタスクが資源を獲得する順序を同じにすることである。獲得順序を統一すれば、先に取得した資源を保持したまま後の資源を待つ状態は一方向にしか生じず、循環待ちが成立しない。
この節の続き
- リアルタイム性の判断基準
- 実際の場面と設計上の注意
- 試験で問われやすい区別
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む