応用情報技術者 2022年 春期 午前2 問16
問題文
ジョブ群と実行の条件が次のとおりであるとき、一時ファイルを作成する磁気ディスクに必要な容量は最低何Mバイトか。

選択肢
ア:100
イ:150
ウ:200(正解)
エ:250
🔒 解説は解答すると表示されます
一時ファイル同時最大量【午前2解説】
正解の理由
ジョブ開始時に各ジョブが50Mの一時ファイルを作成し、参照される先行ジョブの一時ファイルは参照ジョブの終了時に削除されます。実行多重度が2のもとで、イベント処理を「終了→削除→生起(enqueue)→開始」の順で扱うと、ある時刻に同時に保持される一時ファイルは最大で4個となり、必要容量は です。したがって選択肢ウ(200Mバイト)が正しいです。
解法ステップ
- イベント処理順を明確にする
- 同一時刻に複数の処理が発生する場合の順序を「終了 → 削除(その終了によって消される親ファイル) → 生起(ジョブを実行待ち行列へ追加) → 開始(空きスロットに従って実行開始)」とする。
- グラフとルールを確認する
- 「◯X→Y,Z」の場合、Xの作る一時ファイルを参照するのは「最初に生起された」後続ジョブのみ。
- 「◯X,Y→Z」は両方の終了でZが生起され、Zは両方の先行ジョブのファイルを参照する(各先行ジョブにとってZは唯一の後続なら参照される)。
- 時刻ごとに「実行中ジョブ」「存在する一時ファイル」を追う(各ジョブの処理時間を1単位とする簡潔なモデルで示す)
- 時刻0(開始): A 開始 → ファイル: A (1個)
- 時刻1: A 終了 → 生起:B, C(順に追加)→ B, C 開始(多重度2で同時開始)
ファイル: A(Bが参照)、B、C → 3個(150M) - 時刻2: B, C 終了 → 削除:A(Bが参照していたためB終了で削除) → 生起:D, E(DはBの第一後続、EはBとCの両方の終了で生起)→ D, E 開始
DはBのファイルを参照、EはCのファイルを参照(B→Dが第一後続なのでEはBのファイルを参照しない)
ファイル: B、C、D、E → 4個(200M) ← 最大 - 時刻3: D, E 終了 → 削除:B(Dが参照していたためD終了で削除)、C(Eが参照していたためE終了で削除) → 生起:F → F 開始
FはDとE両方のファイルを参照(両方が先行)
ファイル: D、E、F → 3個(150M) - 以降 F終了で D, E の参照ファイルが削除される
- 最大同時ファイル個数は4個、したがって容量は 。
選択肢別の誤答解説
- ア: 100
- 100Mは同時に2個(50M×2)しかないと仮定した場合の値です。しかし多重度が2でも、待ち順や生起順により一時的に3〜4個が同時に存在しうるため過小評価です。
- イ: 150
- 150M(3個)は時刻1や時刻3の状態では見られますが、時刻2でDとEが同時に開始してBとCのファイルが残っている瞬間に4個となり、この値は最大ではありません。
- ウ: 200
- 正答。時刻2に B,C のファイルに加え D,E が生成され、計4個(200M)となるため妥当です。
- エ: 250
- 250M は5個を想定した容量。与えられたグラフと生起順・多重度の制約下では同時に5個存在する状況を作れないため過大評価です。
よくある誤解
- 「ジョブが終了したらすぐにその一時ファイルは削除される」
- 誤り。先行ジョブのファイルは、参照する後続ジョブの終了時に削除されます(後続ジョブが存在しなければ削除タイミングの定義が問題ごとに異なるが、本問では参照の規則に従う)。
- 「複数の後続がある場合、すべての後続がファイルを参照する」
- 誤り。ルールでは『最初に生起される後続だけが参照する』と明示されています。これが生起順・キュー順の把握を重要にします。
補足コラム
この種の問題は「イベント順序(終了→削除→生起→開始)」を明確にすること、そして「誰が誰のファイルを参照するか」をグラフと生起順規則から正確に読み取ることが鍵です。実務的にはジョブ依存の一時領域を見積もる際に、依存解消のタイミング(参照終了での削除)を正確にモデル化することが容量設計ミスを防ぎます。
簡単なシミュレータ(参考)
# 各ジョブ: {'name':..., 'succ':[...], 'pred_count':...}
# 簡易イベントシミュレーションで同時ファイル数を計算
from collections import deque, defaultdict
jobs = {
'A': ['B','C'],
'B': ['D','E'],
'C': ['E'],
'D': ['F'],
'E': ['F'],
'F': []
}
# 参照規則:X->Y,Z の場合、Xが生成するファイルを参照するのはXの最初に生起される後続のみ
# 実行時間を1単位として離散シミュレーション
# 多重度 = 2
MULTI = 2
# 準備
preds = defaultdict(int)
for u,vs in jobs.items():
for v in vs:
preds[v]+=1
# 起点: A を生起
time = 0
queue = deque(['A'])
running = {}
files = set() # ファイルをジョブ名で管理
max_files = 0
while queue or running:
# start up to MULTI-running
while queue and len(running) < MULTI:
j = queue.popleft()
running[j] = 1 # remaining time
files.add(j)
max_files = max(max_files, len(files))
# advance time by 1 unit: all running complete
time += 1
ended = list(running.keys())
running.clear()
# 終了 -> 削除(終了によって削除される親ファイルは後続参照関係に基づく)
# 削除は後続ジョブが「参照」していた場合、その後続の終了で行われるため、
# 終了自体で親のファイルを削除しない(ここでは削除は後続終了時に行う実装方針)
# 生起: 終了したジョブが持つ後続を処理
for j in ended:
for idx, v in enumerate(jobs[j]):
# 生起条件: 単一前提はすぐ生起、複数前提はすべての前提が終了している必要あり
# ここでは pred_count を使って管理(簡略)
preds[v] -= 1
if preds[v] == 0:
queue.append(v)
# 開始後、参照関係により削除が発生するのはその参照ジョブの終了時に行うため、
# 本スクリプトでは参照ファイルの削除はF終了等で行われる必要があるが、簡易化のため
# 参照による削除はシミュレーションのイベント記録で管理する実装が必要。
# (詳細実装は省略)
# 結果表示(理論上の最大)
print("理論上の最大ファイル数 (個):", 4)
print("必要容量:", 4*50, "M")
(教育上の参考コード。正確な参照・削除の管理は上の説明に基づいてイベントごとに明示的に扱う必要があります)
FAQ
- Q: 「生起順の決め方が不明確な場合はどうするか?」
A: 問文で「上から記述された順に優先して生起される」とある場合は、その記述順を優先して生起順を決めます。異なる先行ジョブが同時に終了して複数の子が生起可能なときは、与えられた一覧の順序や問題文の指定に従ってキュー順を決めます。 - Q: 「最終ジョブFのファイルはいつ削除されるのか?」
A: 本問では「後続が存在する場合は後続の終了で削除」と規定されているため、後続がない最終ジョブのファイル削除タイミングは問題文に明示されていない限り不確定ですが、最大同時量の評価には影響しません(問題の最大点はジョブ群の実行中に発生する瞬間的最大静的量で決まるため)。 - Q: 「処理多重度が増えたらどう変わるか?」
A: 多重度が増えれば一度に開始できるジョブ数が増え、結果として同時に保持されるファイル数が増える可能性があります。解析は同様にイベント順で追えばよいです。
関連キーワード: ジョブ依存グラフ、一時ファイル管理、参照・削除タイミング、実行多重度、イベント駆動シミュレーション

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

