応用情報技術者 2023年 春期 午前2 問14
問題文
CPUと磁気ディスク装置で構成されるシステムで、表に示すジョブA, Bを実行する。この二つのジョブが実行を終了するまでのCPUの使用率と磁気ディスク装置の使用率との組合せのうち、適切なものはどれか。ここで、ジョブA, Bはシステムの動作開始時点ではいずれも実行可能状態にあり、A, Bの順で実行される。CPU及び磁気ディスク装置は、ともに一つの要求だけを発生順に処理する。ジョブA, Bとも,CPUの処理を終了した後、磁気ディスク装置の処理を実行する。


選択肢
ア:
イ:(正解)
ウ:
エ:
🔒 解説は解答すると表示されます
装置使用率の算出【午前2解説】
正解の理由
ジョブA, Bは起動時点で両方実行可能で、CPUはA→Bの順に処理されます。CPUは連続してAの3秒とBの12秒を実行するためCPUの稼働時間合計は 秒です。一方、磁気ディスクはAのCPU完了後にAの7秒、BのCPU完了後にBの10秒の順で処理され、処理区間は – 秒と – 秒となり合計 秒稼働します。最終完了時刻は最後の装置が終わる時刻である 秒です。したがって使用率はCPUが 、磁気ディスクが となり、選択肢の中では イ がこれを表します。
解法ステップ
- ジョブの処理順と各装置の動作ルールを確認する(CPUはA→B、各装置は先着順で1要求ずつ処理)。
- CPUの稼働区間を時系列で確定する:
- A の CPU: –(3秒)
- B の CPU: –(12秒)
よって CPU 合計稼働時間 秒。
- 各ジョブの CPU 終了時刻が磁気ディスク要求の到着時刻となるので、磁気ディスクの稼働区間を決定する:
- A のディスク要求到着 、ディスクは空きのため –(7秒)で処理
- B のディスク要求到着 、ディスクはその時点で空きのため –(10秒)で処理
よって磁気ディスク合計稼働時間 秒。
- システムの最終完了時刻(makespan)は最後に終わる処理の時刻で 秒。
- 使用率を計算する:
- CPU 使用率
- 磁気ディスク使用率
(簡易タイムライン)
- CPU: A[0–3], B[3–15]
- Disk: A[3–10], B[15–25]
最終完了時刻 = 25 秒
選択肢別の誤答解説
- ア(CPU 0.47 / Disk 0.53)
この値は稼働時間 秒、 秒を合計 秒で割っている場合に出ます()。誤りの原因は「CPU と磁気ディスクの処理が直列に実行され全時間が単純和になる」と仮定してしまうことです。実際は装置は並列に稼働し得るため、単純和で全体時間を取ってはいけません。 - ウ(CPU 0.79 / Disk 0.89)
これらは稼働時間合計を小さめの誤った最終時刻(例えば19秒)で割った場合に対応します。典型的な間違いは、Aのディスク処理とBのCPU処理の重なり(オーバーラップ)を過度に見積もって最終完了時刻を短くしてしまうことです。スケジュールを時刻で正確に書き出して確認すれば回避できます。 - エ(CPU 0.88 / Disk 1.00)
ここでは磁気ディスクの使用率が1.00になっていますが、これは最終完了時刻を磁気ディスクの総稼働時間(17秒)と誤って同一視した結果生じます。これは「ディスクが常時連続稼働しており最後に終了する装置の終了時刻がディスク稼働合計に等しい」と誤認する場合に起きますが、各要求の到着時刻(CPU完了時刻)を考慮すると、この仮定は成り立ちません。
よくある誤解
- 全体時間を単純和(CPU合計+ディスク合計)とする誤り:複数装置は同時並列で稼働できるので、最終完了時刻は単純和ではなく時系列の被り具合で決まります。
- 到着時刻(CPU完了時)を無視してディスク処理を配置する誤り:ディスク処理はCPUが終わってから到着するため、到着前に処理は開始できません。
- 使用率とスループットなどを混同する誤り:使用率は「総稼働時間÷観測期間(makespan)」であり、単位時間当たりの完了数(スループット)とは別概念です。
補足コラム
一般化すると、ジョブ列(各ジョブがCPU→I/Oの順)で単一CPUと単一I/O装置があり先着順で処理する場合の計算手順は次の通りです。
- CPUの終了時刻はジョブのCPU時間を順に足して求める(CPUは直列に処理される)。
- 各ジョブのI/O開始時刻は「そのジョブのCPU終了時刻」と「直前のI/Oが終了した時刻」の大きい方になる(キューがあるため)。
- 各装置の使用率は「その装置の総稼働時間」÷「全体の最終完了時刻(makespan)」で求める。
簡単な計算コード例(参考)
jobs = [{'cpu':3,'io':7},{'cpu':12,'io':10}] # A, B
cpu_time = 0
io_finish = 0
cpu_busy = 0
io_busy = 0
for j in jobs:
# CPU runs immediately when available
cpu_start = cpu_time
cpu_end = cpu_start + j['cpu']
cpu_busy += j['cpu']
cpu_time = cpu_end
# IO can start at max(cpu_end, previous io_finish)
io_start = max(cpu_end, io_finish)
io_end = io_start + j['io']
io_busy += j['io']
io_finish = io_end
makespan = max(cpu_time, io_finish)
cpu_util = cpu_busy / makespan
io_util = io_busy / makespan
print(makespan, cpu_util, io_util) # 25, 0.6, 0.68
FAQ
Q. なぜ最終完了時刻(makespan)を 秒とするのですか?
A. 各処理の時系列に従って最後に終了する処理がBのディスク処理であり、その終了時刻が 秒だからです。最終完了時刻は全システムが空になる時刻を指します。
A. 各処理の時系列に従って最後に終了する処理がBのディスク処理であり、その終了時刻が 秒だからです。最終完了時刻は全システムが空になる時刻を指します。
Q. 使用率が1.00になることはあり得ますか?
A. 観測期間(あるいはmakespan)が装置の総稼働時間と等しければ理論上はあり得ますが、多くのスケジュールでは他装置との時間的重なりや到着遅延により観測期間が長くなるため使用率は1未満となることがほとんどです。
A. 観測期間(あるいはmakespan)が装置の総稼働時間と等しければ理論上はあり得ますが、多くのスケジュールでは他装置との時間的重なりや到着遅延により観測期間が長くなるため使用率は1未満となることがほとんどです。
関連キーワード: CPU使用率、磁気ディスク使用率、ガントチャート、リソース利用率、スケジューリング

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

