メモリ割当戦略とは(全体像)
プログラムは動くときに「このくらいメモリをちょうだい」とOSに頼む。OSはあいている領域(空きスペース)の中から、どこを渡すかを選ぶ。この選び方のルールがメモリ割当戦略だ。
身近にたとえると、駐車場で空きスペースを探すのと同じ。「入口から最初の空きに停める」のか「ぴったりサイズの空きを探す」のかで、速さや使い勝手が変わる。
押さえるのは、選び方によって速さと「むだの出かた」が変わること。そして、むだ(断片化)には性質の違う2種類があること。
詳しく:Fit戦略と「内部・外部の断片化」だけ覚えれば戦える
ここが記事の心臓部。まず空きの選び方(Fit戦略)を見ましょう。
代表的な割当戦略(Fit戦略)
| 戦略 | 選び方 | 特徴 |
|---|---|---|
| First-Fit | 最初に見つかった適合する空きへ | 速い(探す手間が少ない) |
| Best-Fit | ぴったりに近い最小の空きへ | むだは少ないが探すのが遅い |
| Worst-Fit | 一番大きい空きから切り出す | 小さすぎる空きを残しにくい |
ここで一番のひっかけが「Best-Fitが一番速い」という誤解。Best-Fitは「最良の空き」を全部見て探すので、むしろ遅い。一番速いのはFirst-Fit(最初に見つけた時点で決めるから探す手間が少ない)。
次に、メモリのむだ=断片化。これは2種類あり、混同しやすい。
断片化の2種類
| 種類 | 意味 | 例 |
|---|---|---|
| 内部断片化 | 割り当てた領域の「中」の余り | 4KB渡したが3.5KBしか使わない |
| 外部断片化 | 空きが細切れで連続して取れない | 合計は空いているが、続いた空きが足りない |
内部断片化は「中の余り」、外部断片化は「すきまの細切れ」。性質が違う別の現象だ。外部断片化への対策には、使用中のものを詰めて連続した空きを作るコンパクションなどがある。
なお、Linuxのカーネルでは、空きを2倍4倍8倍…と階層で管理するバディシステムが使われ、解放したときに隣どうしをくっつけて細切れを抑える。
わかりやすく言い換えると
要するに、駐車場の空き探しでイメージするとラクです。
①First-Fit … 入口から最初に見つけた空きに停める(速い)
②Best-Fit … 場内をぜんぶ見て、ぴったりの空きを探す(時間がかかる)
③内部断片化 … 大型車スペースに軽自動車を停めた「中の余り」
つまり、「速さならFirst-Fit」「むだは内部(中の余り)と外部(細切れ)」、この2点が試験の急所です。
試験のツボ
🔴 一番出る:Fit戦略の速さ
①一番速いのはFirst-Fit(最初に見つけた空きに決める)
②Best-Fitは全部見て探すので遅い(名前は「最良」でも最速ではない)
🔴 次に出る:断片化の2種類
①内部断片化=割り当てた領域の中の余り
②外部断片化=空きが細切れで連続して取れない
🟡 押さえると安定:対策とバディシステム
①外部断片化の対策はコンパクション(使用中を詰めて連続空きを作る)
②Linuxカーネルはバディシステム(2のべき乗で分割・合併)
よくある間違い
①「Best-Fitが一番速い割当戦略である」→ ✗ 一番速いのはFirst-Fit。Best-Fitは全部見て最良を探すので遅い。
②「内部断片化と外部断片化は同じものである」→ ✗ 内部は割り当てた領域の中の余り、外部は空きが細切れになること。別の現象。
③「First-Fitはすべての空きを調べてから決める」→ ✗ First-Fitは最初に見つかった適合する空きで決める。だから速い。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(Fit戦略の速さ)
メモリ割当のFit戦略に関する次の記述のうち、正しいものはどれか。
- 一番速いのはFirst-Fitで、最初に見つかった適合する空きにすぐ割り当てる方式である
- 一番速いのはBest-Fitで、すべての空きを調べて最良を選ぶから時間がかからないとされる
- First-Fitは空きをすべて調べ終えるまで割り当てを決められない方式だとされているものである
- Fit戦略はどれを選んでも速さはまったく変わらず、選ぶ意味はないものだとされているものだ
解答は 1 ですよ。
一番速いのはFirst-Fitですね。最初に見つかった適合する空きで決めるので、探す手間が少なくて済みます。Best-Fitは「最良」を探すために全部調べるので、名前に反してむしろ遅いのです。
選択肢2の「Best-Fitが最速」、選択肢3の「First-Fitは全部調べる」、選択肢4の「速さは変わらない」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | First-Fitは最初の適合で決めるので速い |
| 2 | ✗ | Best-Fitは全部探すので遅い |
| 3 | ✗ | First-Fitは最初の適合で決める |
| 4 | ✗ | 戦略で速さや断片化が変わる |
オリジナル問題2(断片化の2種類)
断片化に関する次の記述のうち、正しいものはどれか。
- 内部断片化も外部断片化もまったく同じ現象で、呼び名が2つあるだけだとされているものだ
- 内部断片化と外部断片化は、どちらもメモリには一切むだが出ない状態のことだとされている
- 内部断片化は割り当てた領域の中の余り、外部断片化は空きが細切れで連続して取れないことだ
- 内部断片化は画面の表示の乱れのことで、メモリのむだとは無関係なものだとされているものだ
解答は 3 ですよ。
内部断片化は、割り当てた領域の「中」の余り(4KB渡して3.5KBしか使わない等)。外部断片化は、空きが細切れで連続して取れない状態ですね。性質の違う別の現象です。
選択肢1の「同じ現象」、選択肢2の「むだが出ない」、選択肢4の「表示の乱れ」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 内部と外部は別の現象 |
| 2 | ✗ | むだが出る現象を指す |
| 3 | ✓ | 内部は中の余り・外部は細切れ |
| 4 | ✗ | 表示の乱れではない |
オリジナル問題3(バディシステム)
バディシステムに関する次の記述のうち、正しいものはどれか。
- バディシステムはメモリをまったく分割せず、つねに全体を1人だけに渡す方式だとされている
- バディシステムは空きを2のべき乗で分割・合併して管理し、Linuxカーネルで使われている
- バディシステムは仲のよいプログラム同士だけにメモリを配るしくみだとされているものである
- バディシステムは画面に2人の絵を表示する機能のことで、メモリ管理とは無関係だとされている
解答は 2 ですよ。
バディシステムは、空きを2のべき乗(4KB・8KB・16KB…)で分割・合併して管理するしくみですね。解放したときに隣どうしをくっつけて細切れを抑えます。Linuxカーネルの物理メモリ管理で使われています。
選択肢1の「分割しない」、選択肢3の「仲のよいプログラムに配る」、選択肢4の「2人の絵を表示」はどれも誤りですよ。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 2のべき乗で分割して管理する |
| 2 | ✓ | 2のべき乗で分割・合併・Linuxで採用 |
| 3 | ✗ | 仲のよさで配るのではない |
| 4 | ✗ | 絵を表示する機能ではない |
まとめ
押さえどころ
- 🔴 Fit戦略の速さ = 一番速いのはFirst-Fit(最初の適合で決める)。Best-Fitは全部探すので遅い。
- 🔴 断片化の2種類 = 内部(割り当てた中の余り)と外部(空きが細切れ)。別の現象。
- 🟡 対策とバディシステム = 外部断片化はコンパクションで対処。Linuxカーネルはバディシステム(2のべき乗で分割・合併)。
次に学ぶ
- ページング詳細 ── メモリを固定サイズのページで管理し、外部断片化を起こしにくくするしくみ。
- ガーベッジコレクション ── 使い終わったメモリを自動で回収するしくみ。割当の裏側にある。
執筆: SikakuQuest編集部