基本情報技術者 2017年 春期 午前(科目A) 問16
問題文
四つのジョブA〜Dを次の条件で実行し印刷する。全ての印刷が完了するのは、ジョブを起動してから何秒後か。
〔条件〕
(1)ジョブは一斉に起動され、多重度1で実行される。
(2)優先順位はAが最も高く、B、C、Dの順に低くなる。
(3)各ジョブの実行後、スプーリング機能が1台のプリンタを用いて逐次印刷を行う。
(4)各ジョブを単独で実行した場合の実行時間と印刷時間は、表のとおりである。
(5)その他のオーバヘッドは考慮しない。

選択肢
ア:100
イ:160
ウ:190(正解)
エ:280
🔒 解説は解答すると表示されます
ジョブ優先制スケジューリングと印刷遅延【午前解説】
正解の理由
問題条件ではジョブは同時起動、多重度1(CPUは1つのジョブのみ実行)かつ優先度順に処理されます。したがってCPUの実行順はA→B→C→Dで、各ジョブのCPU終了時刻は累積実行時間になります。
CPU完了時刻(起点0秒):
- A終了 = 50秒
- B終了 = 50 + 30 = 80秒
- C終了 = 80 + 20 = 100秒
- D終了 = 100 + 40 = 140秒
印刷はスプーリング機能が1台のプリンタで逐次行うため、プリンタはAの到着(50秒)から連続稼働します。プリンタ処理は到着順(CPU完了順)に行われ、プリンタの終了時刻は次のようになります。
プリンタ処理(開始は50秒):
- A印刷: 50秒→100秒(50秒間)
- B印刷: 100秒→140秒(40秒間)
- C印刷: 140秒→170秒(30秒間)
- D印刷: 170秒→190秒(20秒間)
したがって、すべての印刷が完了するのは190秒後で、正解は ウ です。
解法ステップ
- ジョブのCPU実行順を確認(優先度: A > B > C > D)。
- 各ジョブのCPU終了時刻を累積実行時間で求める。
- 各ジョブはCPU終了時に印刷要求をスプールし、プリンタは到着順に1台で逐次印刷する。
- プリンタの稼働開始は最初の到着時刻(Aの50秒)。以降プリンタは連続稼働し、全印刷完了時刻を計算する。
- 結果と選択肢を照合する(ここでは190秒 → ウ)。
選択肢別の誤答解説
- ア: 100
誤りの典型: Aの印刷完了(50+50=100)を「全印刷完了」と誤認。B,C,Dの印刷が残るため誤りです。 - イ: 160
何が起きやすいか: CPU終了(140秒)とプリンタ処理の一部を重複させずに、ある程度しか累積しないと誤算出したケース。正確なプリンタ累積時間を足すと190秒になります。 - ウ: 190(正解)
正しい理由: CPU最初終了時刻50秒+全印刷時間合計(50+40+30+20)=140秒で、秒となるため。 - エ: 280
誤りの典型: 印刷をCPU実行完了後にのみ開始すると仮定したケース(CPU合計140秒+印刷合計140秒=280秒)。しかし実際は印刷は各ジョブ終了とともに始まり、プリンタは最初の到着から連続稼働します。
よくある誤解
- 誤解1: 「印刷はCPU終了後まとめて行われる」と考えて、プリンタ開始をCPU全終了(140秒)以降とする誤り。実際は各ジョブのCPU終了時に順次スプールされ、先に終わったジョブから印刷が始まります。
- 誤解2: 「印刷はCPUと完全に独立に並行して常に行える」と誤解して短く見積もる計算。プリンタは1台で逐次処理するため、印刷時間は累積します。
- 誤解3: 優先度があるために印刷順も優先度順になると誤認するケース。印刷順は「ジョブのCPU終了順(到着順)」が基本です。
補足コラム
- 一般化すると、ジョブがCPUで順次完了していき、その完了順がプリンタ到着順と同じならプリンタは途切れなく稼働します。このとき全体の終了時刻は「最初のCPU完了時刻」+「すべてのジョブの印刷時間合計」となります。式で表すと、到着順がCPU実行順なら総合完了時刻は 今回は で です。
- もしジョブのCPU終了順が印刷順と異なれば、プリンタに空白時間(待ち)が生じる場合があり、総時間はより複雑に計算する必要があります。
- 簡単な確認用にシミュレーションをする場合は、到着(CPU完了)とプリンタの終了時刻を順に追うプログラムで検証できます。以下はイメージ(実行は任意):
jobs = [('A',50,50),('B',30,40),('C',20,30),('D',40,20)]
# CPU順は優先度 A,B,C,D
cpu_time = 0
arrival = []
for name, exe, pr in jobs:
cpu_time += exe
arrival.append((name, cpu_time, pr))
# プリンタ開始はarrival[0][1]
printer_time = arrival[0][1]
for name, t_arr, pr in arrival:
# printer_time = max(printer_time, t_arr) # cpu finish times are nondecreasing here
printer_time += pr
print(printer_time) # 190
FAQ
Q1: 印刷はジョブ実行中に始まらないのですか?
A1: 問題文は「各ジョブの実行後、スプーリング機能が…印刷を行う」とあるため、ここでは各ジョブがCPU実行を終えてから印刷要求を出すものと扱います。よって印刷開始はそのジョブのCPU完了時刻です。
A1: 問題文は「各ジョブの実行後、スプーリング機能が…印刷を行う」とあるため、ここでは各ジョブがCPU実行を終えてから印刷要求を出すものと扱います。よって印刷開始はそのジョブのCPU完了時刻です。
Q2: 優先度はプリンタ処理にも影響しますか?
A2: 本問ではプリンタはスプーリングされたジョブを逐次処理する1台で、処理順はスプール到着順(=CPU完了順)です。優先度はCPUスケジューリングに関係しますが、印刷順は到着順に従います。
A2: 本問ではプリンタはスプーリングされたジョブを逐次処理する1台で、処理順はスプール到着順(=CPU完了順)です。優先度はCPUスケジューリングに関係しますが、印刷順は到着順に従います。
Q3: もしスプールがCPU実行中の途中から開始できるなら結果は変わりますか?
A3: はい。もし印刷データをジョブ実行の途中から逐次スプールでき、プリンタが早期に開始できるなら全体時間は短縮されることがあります。問題文の前提をよく確認してください。
A3: はい。もし印刷データをジョブ実行の途中から逐次スプールでき、プリンタが早期に開始できるなら全体時間は短縮されることがあります。問題文の前提をよく確認してください。
関連キーワード: スプーリング, プリンタスケジューリング, 優先度スケジューリング, 多重度, CPUスケジューリング, ジョブスケジューリング, プリンタ待ち行列, 印刷時間計算

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

