IPA タスク管理・排他制御 — 頻出論点と過去問

頻出論点

1. この分野は何か

OSが複数のプログラムを並行して動かすために、CPUの実行時間をどの順番で割り当て、共有資源を奪い合わずに安全に使わせるかの仕組みを扱います。タスクが切り替わる条件や処理完了までにかかる時間の見積もり、複数の処理が互いの資源を待ち合って止まってしまう現象の原因と防ぎ方が問われます。

2. 実際の出題のされ方

スケジューリング方式や状態遷移の仕組みと、時系列を追うシミュレーション計算の両方が、応用情報技術者の午前と高度試験の午前Iで出題されています。仕組みを問う問題では、プリエンプションによって遷移する状態、ノンプリエンプティブ方式の切替え条件、特定のタスクがCPUの割当てを待ち続ける可能性が最も高い方式、スレッドセーフの定義、I2Cバスに接続された複数のセンサを排他制御するリアルタイムOSの機能などが問われています。また、資源の獲得順序からデッドロックの防止策や発生可能性があるプロセスの組合せを選ぶ問題も複数出ています。

時系列のシミュレーションでは、具体的な表や条件から数値を求める問題が繰り返し出題されています。到着時刻と処理時間の表から到着順方式や処理時間順方式でのターンアラウンドタイムを求める問題(ネットワークスペシャリストの午前IIでも出題)、タスクの多重度が1のときと2のときで全処理が終わるまでの時間の差を求める問題、優先度ベースの2つの周期タスクが周期内に完了できる組合せを選ぶ問題、複数台のプリンタへの割当てから特定プリンタの印刷時間を求める問題、先行ジョブの終了で後続ジョブが生起する有向グラフから一時ファイル用の磁気ディスク容量の最大値を求める問題が出ています。

エンベデッドシステムスペシャリストの午前IIでは、プロセス切替えにおけるディスパッチャの役割、ラウンドロビン方式やリソーススタベーションの定義に加え、優先度の異なる2つのタスクの処理フローチャートから、どの処理中にプリエンプションが起きるとバイナリセマフォの奪い合いでデッドロックが発生するかを特定する問題が出題されています。

3. 学習のポイント

タスクの3つの基本状態(実行状態・実行可能状態・待ち状態)と、CPUの実行権を切り替える仕組みが土台になります。入出力の完了など特定の事象を待つときは自発的に「待ち状態」へ遷移しますが、プリエンプション(より優先度の高いタスクの出現や一定時間の経過による強制的な中断)では、CPUさえ空けばすぐに再開できる「実行可能状態」へ遷移します。これに対し、ノンプリエンプティブ方式では、OSが実行中のタスクからCPUを取り上げることはなく、タスクが自分でCPUを手放したときにだけ切り替わります。また、次に動かすプロセスを決めるのがスケジューラ、決まったプロセスの状態をCPUに戻して実際に走らせるのがディスパッチャです。

スケジューリング方式は、それぞれの割り当てルールと、スタベーション(飢餓状態)が起きるかどうかを対比して整理します。スタベーションは、ある処理がいつまでもCPUや資源を割り当ててもらえない状態です。

  • 到着順方式: 来た順に1つずつ最後まで処理します。待っていればいつかは必ず順番が来ます。
  • 処理時間順方式: 短く終わるものを先に片付けて、平均の待ち時間を減らします。その代わり、短い処理が次々に来ると、長い処理の順番がいつまでも回ってこないことがあります(スタベーション)。
  • ラウンドロビン方式: 決まった短い時間(タイムクォンタム)ずつ順番にCPUを渡し、時間内に終わらなければ列の後ろに回します。
  • 優先度順方式とエージング: 優先度の高いものから実行し、待たされている時間に応じて優先度を少しずつ上げることで、低い優先度の処理が取り残されないようにします。

時系列の計算問題では、簡単なタイムチャートを書いて時刻ごとの状態を追うのが確実です。ターンアラウンドタイムは 終了時刻−到着時刻\text{終了時刻} - \text{到着時刻} で求めます。処理時間順方式では、前のジョブが終了した時刻に、その時点ですでに到着しているジョブの中から最も処理時間が短いものを選ぶ点に注意します。多重度や複数プリンタの割当てでは各実行枠が空く時刻を、ジョブ群の一時ファイル容量では各ステップの開始時(ファイル作成直後)と終了時(参照終了による削除)の残存量を順番に書き出します。優先度が高い周期タスクと低い周期タスクがともに周期内に終わるかは、両方が同時に起動したとして時間を追い、高い方が起動するたびに低い方を中断させながら、低い方の実行時間の合計が自分の周期の中で確保できるかを確かめます。

排他制御とデッドロックについては、共有資源への同時アクセスを防ぐ仕組みとしてセマフォ(バイナリセマフォなど)が使われること、そして複数のスレッドから同時に呼ばれても結果が壊れないように作られている性質をスレッドセーフと呼ぶことを押さえます。複数のタスクが複数の資源を排他的に使うとき、互いに相手が持つ資源の解放を待ち合って止まるのがデッドロックです。すべてのタスクで資源を獲得する順序を同じに統一すれば、循環待ちが生じずデッドロックを防げます。逆に、獲得の順序がタスクごとに違うと、1つ目を取ってから2つ目を取るまでの間に横取り(プリエンプション)が起きたときに循環待ちになります。

4. 間違えやすいところ

状態遷移とプロセス切替えでは、似た用語や近いタイミングの動作を取り違えやすくなります。プリエンプションで中断されたタスクの遷移先を「待ち状態」とする誤答肢がありますが、事象待ちではないため実行可能状態に移ります。ディスパッチャを選ぶ問題でも、「次に起動すべきプロセスを,優先順位に従ってプロセス群の中から選択する」というスケジューラの役割や、タイムクォンタムの経過をOSに通知するタイマの役割が誤答肢として並んでいます。また、セマフォを選ぶ問題ではタスク間でデータを送受信するデータ構造である「キュー」が、スレッドセーフの説明では「アプリケーションを複数のスレッドではなく,単一のスレッドで動作させる」(シングルスレッド)や「スレッドの競合が発生したときに,アプリケーションを安全に停止させる」(フェールセーフの考え方)が誤答肢として出ています。

デッドロックの防止策では、「一方のタスクの優先度を高くする」や「両方のタスクの優先度を同じにする」という誤答肢があります。優先度を変えても、低優先度のタスクが資源を1つ確保した直後にプリエンプションが起きればデッドロックは防げません。フローチャートからデッドロックの発生箇所を探す問題では、まだ1つもセマフォを取っていないときの処理や、2つとも獲得し終えた後の処理が誤答肢になっています。まだ取っていなければ高優先度タスクが先に両方を使って終えられますし、両方獲得した後であれば、高優先度タスクが割り込んでも最初のセマフォ取得で待ち状態になり、低優先度タスクに実行権が戻って解放まで進めるためデッドロックにはなりません。

計算問題では、何を答えるかの読み違いが誤答肢に直結しています。ターンアラウンドタイムを求める問題では、終了時刻から到着時刻を引き忘れた終了時刻をそのまま答えた値が選択肢に含まれています。多重度1と2の終了時間の差を求める問題でも、差分ではなく多重度2のときの終了時間そのものや、多重度2なら単純に時間が半分になるとみなした値が誤答肢になっています。求めているのが「終了時刻」なのか「ターンアラウンドタイム」なのか「時間の差」なのかを最後に必ず確認してください。

タスク管理・排他制御の理解度チェック

タスク管理・排他制御の過去問一覧

タスク管理・排他制御の用語

OS・ソフトウェアのほかの論点

仮想記憶・主記憶管理26問 OSS18問