基本情報技術者 2019年 春期 午前(科目A) 問16
問題文
タスクのディスパッチの説明として、適切なものはどれか。
選択肢
ア:各タスクの実行順序を決定すること
イ:実行可能なタスクに対してプロセッサの使用権を割り当てること(正解)
ウ:タスクの実行に必要な情報であるコンテキストのこと
エ:一つのプロセッサで複数のタスクを同時に実行しているかのように見せかける機能のこと
🔒 解説は解答すると表示されます
タスクディスパッチ【午前解説】
正解の理由
タスクのディスパッチは、実行可能(ランナブル)なタスクの中から選ばれたものにプロセッサを割り当て、実行を開始させる処理を指します。選択肢の中では、プロセッサの使用権を割り当てることを述べた イ がこの定義に一致します。一般的なOSの処理を分けて説明すると「スケジューラは次に実行すべきタスクを決定し、ディスパッチャ(ディスパッチ)はその決定に基づきプロセッサを渡してコンテキスト切替を行う」ため、ディスパッチの主旨はプロセッサ割当(=実行開始)です。
解法ステップ
- 問題文のキーワード「ディスパッチ」を「プロセッサ割当/実行開始」に結びつける。
- 各選択肢の述語が「選択(スケジューリング)」「割当(ディスパッチ)」「コンテキスト(状態)」「並列の見せかけ(タイムシェア)」のどれに該当するか判定する。
- 「プロセッサの使用権を割り当てる」と明確に書かれている選択肢、すなわち イ を正答とする。
選択肢別の誤答解説
- ア: 各タスクの実行順序を決定すること
- これはスケジューリング(スケジューラ)の役割です。ディスパッチは決定された結果を実際に適用する側であり、選択そのものを意味するわけではありません。
- イ: 実行可能なタスクに対してプロセッサの使用権を割り当てること
- 正答です。ディスパッチは選択されたタスクにCPUを割り当て、必要ならコンテキスト切替を行って実行を開始させます。
- ウ: タスクの実行に必要な情報であるコンテキストのこと
- コンテキスト自体(レジスタやプログラムカウンタなどの状態)は「コンテキスト」であり、ディスパッチそのものではありません。ディスパッチはそのコンテキストを保存・復元してCPUを渡す処理を含み得ますが、「コンテキストそのもの」を指す選択肢は誤りです。
- エ: 一つのプロセッサで複数のタスクを同時に実行しているかのように見せかける機能のこと
- これはタイムシェアリングやマルチタスク(擬似並列)の説明であり、ディスパッチ個別の定義ではありません。ディスパッチはその実現に関わる処理の一部ですが、機能全体を指す文ではないため誤りです。
よくある誤解
- ディスパッチとスケジューリングを同一視してしまう
- スケジューラは「誰を実行するか」を決める役割、ディスパッチは「決まった誰かにCPUを渡す」役割と覚えると混同しにくいです。実装によっては同一モジュールで扱う場合もありますが、概念は区別されます。
- コンテキスト=ディスパッチと考える誤り
- コンテキストは状態情報そのもの。ディスパッチはそれを使って状態を保存・復元(コンテキスト切替)しつつCPUを割り当てる処理です。
- ディスパッチが常にコンテキスト切替を伴わないと誤解するケース
- 同じタスクが続けて実行される場合は切替が不要ですが、別タスクに渡すときは通常コンテキスト切替が行われます。ここで「ディスパッチにはコンテキスト切替が含まれる」という定義で説明するのが試験対策上わかりやすいです。
補足コラム
典型的な実行の流れ(概念):
- イベント発生/タイムスライス終了 → 2. スケジューラが次のタスクを選択 → 3. ディスパッチャが選択結果を受けプロセッサを割り当て、必要ならコンテキスト切替を実施して実行を開始
簡単な擬似コード例:
pid_t next = scheduler_select(); // スケジューラが選択
if (next != current) {
dispatch(next); // ディスパッチ:context_switch を伴う
// dispatch は current の保存・next の復元を行い CPU を渡す
}
ディスパッチ(コンテキスト切替)はオーバーヘッド(レジスタ保存/復元、TLBクリア等)を伴うため、頻繁な切替は性能に影響します。プリエンプティブ環境ではスケジューリングの頻度が高くなり得るため、この点も理解しておくとよいでしょう。
FAQ
Q1: ディスパッチとコンテキスト切替は必ずセットですか?
A1: 概念上、ディスパッチは「CPUを渡す処理」であり、別タスクへ渡す際はコンテキスト切替を行います。つまり多くの場合セットですが、同一タスク継続時は切替は不要です。
A1: 概念上、ディスパッチは「CPUを渡す処理」であり、別タスクへ渡す際はコンテキスト切替を行います。つまり多くの場合セットですが、同一タスク継続時は切替は不要です。
Q2: スケジューラとディスパッチは別のモジュールですか?
A2: 概念的には別々の役割ですが、実装上は同一コードで扱われることもあります。試験対策では「選択=スケジューラ、割当=ディスパッチ」と区別して覚えると良いです。
A2: 概念的には別々の役割ですが、実装上は同一コードで扱われることもあります。試験対策では「選択=スケジューラ、割当=ディスパッチ」と区別して覚えると良いです。
Q3: 「一つのプロセッサで複数タスクを同時に見せる」はディスパッチの説明になりますか?
A3: それはタイムシェアリングというシステム全体の振る舞いの説明で、ディスパッチはその実現手段(CPUの切替・割当)に関与しますが、機能全体を指す表現ではありません。
A3: それはタイムシェアリングというシステム全体の振る舞いの説明で、ディスパッチはその実現手段(CPUの切替・割当)に関与しますが、機能全体を指す表現ではありません。
関連キーワード: タスクスケジューラ、ディスパッチャ、コンテキストスイッチ、プリエンプション、ランナブル状態、タイムシェアリング、割当オーバーヘッド

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

