基本情報技術者 2015年 秋期 午前(科目A) 問18
問題文
図のメモリマップで、セグメント2が解放されたとき、セグメントを移動(動的再配置)し、分散する空き領域を集めて一つの連続領域にしたい。1回のメモリアクセスは4バイト単位で行い、読み取り、書き込みがそれぞれ30ナノ秒とすると、動的再配置をするのに必要なメモリアクセス時間は合計何ミリ秒か。ここで、1kバイトは1,000バイトとし、動的再配置に要する時間以外のオーバーヘッドは考慮しないものとする。

選択肢
ア:1.5
イ:6.0
ウ:7.5
エ:12.0(正解)
動的再配置で分散する空き領域を集める問題【午前2 解説】
要点まとめ
- 結論:セグメント3(800kバイト)を右端の800kバイトの空き領域へ移動するだけで、必要なメモリアクセス時間は12.0ミリ秒となります。
- 根拠:1回のメモリアクセスは4バイト単位で読み書き各30ns、つまり1チャンクあたりns必要で、バイトを移すと合計でmsになります。
- 差がつくポイント:移動対象を誤ってセグメント1や100kだけと考えると誤答になるため、配置図を読み取り「どのセグメントをどこへ移すか」を正確に判断することが重要です。
正解の理由
正解: エ
図の配置(左からセグメント1:500k、セグメント2:100k(開放済)、セグメント3:800k、空き:800k)を見ると、分散する空きを一つにする最小の移動は「セグメント3(800k)」を右端の空き領域(800k)に移す操作です。これによりセグメント3の元あった領域(800k)とセグメント2の空き(100k)が隣接して、合計900kの連続した空き領域ができます。
移動するデータ量は800,000バイトで、1回のアクセスは4バイト単位、読み取り30ns+書き込み30nsで1チャンク(4バイト)当たり60ns必要です。よって合計時間は以下の式で求められます。
図の配置(左からセグメント1:500k、セグメント2:100k(開放済)、セグメント3:800k、空き:800k)を見ると、分散する空きを一つにする最小の移動は「セグメント3(800k)」を右端の空き領域(800k)に移す操作です。これによりセグメント3の元あった領域(800k)とセグメント2の空き(100k)が隣接して、合計900kの連続した空き領域ができます。
移動するデータ量は800,000バイトで、1回のアクセスは4バイト単位、読み取り30ns+書き込み30nsで1チャンク(4バイト)当たり60ns必要です。よって合計時間は以下の式で求められます。
よくある誤解
- 「開放された100kだけを移動すればよい」と考える誤り:空きの集約は移動先・移動元の隣接関係を考えないと不十分です。
- 「セグメント1(500k)を移動すればよい」とする誤認:問題図を正しく把握すると、500kを動かす必要はなく、もっと大きな800kの移動が最小操作です。
- 1kの定義を1024バイトとする混同:設問で1k=1,000バイトと明記されている点を見落とすと計算がずれます。
解法ステップ
- 図を読み、各領域の順序と大きさを確認する(500k, 100k(空), 800k, 800k(空))。
- 「空きを一つにする」ためにどのセグメントを移動すればよいかを検討する。隣接性からセグメント3を右の空きに移動するのが最小操作であると判断。
- 移動するバイト数を求める:800kバイト = 800,000バイト。
- 1アクセス当たりの処理時間を求める:4バイト単位で読み書き各30ns → 1チャンク当たり60ns。
- 合計時間を計算:。
選択肢別の誤答解説
- ア: 1.5
- 1.5msは100kバイトだけを移動した場合の時間に相当します。計算はで、対象を100kと誤認した場合の誤答です。
- イ: 6.0
- 6.0msは400kバイトを移動した場合に相当します。中途半端に一部だけ移すとこうした値になり得ますが、空きの集約目標を満たしません。
- ウ: 7.5
- 7.5msは500kバイト(セグメント1)を移動する想定の値で、になります。セグメント1の移動は不要です。
- エ: 12.0(正解)
- セグメント3の800k移動に対応する正しい計算結果です。
補足コラム
- なぜ「読み取り+書き込み」を両方考慮するか:一般的なメモリコピーはソースから読み取り、デスティネーションへ書き込みを行うため、双方のアクセス時間を合算する必要があります。
- アクセス単位の重要性:4バイト単位でしかアクセスできない場合は、移動サイズが4の倍数であることを確認すると端数処理の誤りを避けられます。
- 実運用ではポインタの再設定や仮想アドレスでの再配置など、データを物理的に移動せずに断片化を解決する手法もありますが、本設問は純粋にメモリコピーの時間を問うものです。
FAQ
Q. なぜセグメント3だけを移動するのが最小操作なのですか?
A. 右端に同じサイズ(800k)の空きがあるため、セグメント3をその空きへ移動するだけで、元の位置と左の100k空きが隣接して連続空きが得られるからです。追加の移動は不要です。
A. 右端に同じサイズ(800k)の空きがあるため、セグメント3をその空きへ移動するだけで、元の位置と左の100k空きが隣接して連続空きが得られるからです。追加の移動は不要です。
Q. 読み取りと書き込みの時間は常に同じ扱いで良いですか?
A. 本設問では読み書きがそれぞれ30nsと同等に与えられているため合算しています。実機では非対称な場合もありますが、指示に従って計算します。
A. 本設問では読み書きがそれぞれ30nsと同等に与えられているため合算しています。実機では非対称な場合もありますが、指示に従って計算します。
Q. 1k=1,000バイトの指定を変えたら答えは変わりますか?
A. はい。例えば1k=1024バイトにするとバイト数が増え、結果のミリ秒も僅かに変わります。問題文の指示に従ってください。
A. はい。例えば1k=1024バイトにするとバイト数が増え、結果のミリ秒も僅かに変わります。問題文の指示に従ってください。
関連キーワード: メモリ再配置、メモリコンパクション、外部断片化、メモリアクセス時間、コピーコスト、動的再配置

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

