OSのタスク管理と排他制御
タスクを複数動かすOSでは、限られたCPUを各タスクへ割り当てる管理と、共有資源を複数のタスクが同時に使わないようにする排他制御が中心となる。タスクは実行状態や待ち状態などの間を遷移し、優先度に基づくプリエンプションによってCPUの割当てが切り替えられる。さらに、排他制御の設計を誤ると生じるデッドロックを防ぐ工夫も欠かせない。
タスクの状態遷移とプリエンプション
タスクは、実行状態、実行可能状態、待ち状態、休止状態、終了状態などの間を遷移しながら処理を進める。プリエンプションとは、実行中のタスクがより優先度の高いタスクにCPUを明け渡すため、途中で中断されることである。中断されたタスクは、実行を続けられる条件が整っていれば実行可能状態に戻り、次のCPU割当てを待つ。プリエンプションは中断であってタスクの終了ではないため、終了状態や待ち状態とは区別しなければならない。
優先度ベースのスケジューリングと応答時間
固定優先度のプリエンプティブ方式では、優先度の高いタスクが周期ごとに到着し、優先度の低いタスクの実行を妨げる。低優先度のタスクが周期内に処理を完了できるかどうかは、最悪応答時間を求めて周期と比較することで判断する。最悪応答時間は、自身の実行時間に、高優先度タスクの割込みによって増える実行時間を加えた式を、値が変化しなくなるまで反復計算して求める。この収束値が周期以内に収まれば、そのタスクは周期内に完了できると判断できる。
この種の問題では、候補となる実行時間と周期の組合せごとに同じ計算を繰り返し、どの組合せで周期内に収まるかを比べることが基本になる。計算の途中で値が周期を超えた時点で、その組合せは条件を満たさないと判断できる。
排他制御とセマフォ
複数のタスクが同じ周辺機器や変数を同時に操作すると、データが壊れたり、通信が混乱したりする。これを防ぐ代表的な手段が、セマフォを用いた相互排他である。資源を使う前にセマフォを取得し、使い終えたら解放することで、使用中の資源には一つのタスクしか入れない状態を作れる。例えば、I²Cバスのように一度に一つのタスクだけが使える機器を、複数のセンサ読取りタスクで共有する場合を考える。各タスクはバスを使う前にロックを取得し、読取り後に解放すると、同時アクセスを防げる。
この節の続き
- デッドロックの発生と防止
- 再帰呼出しと記憶管理
- 試験で問われやすい区別
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む