メモリ割当戦略とは?プログラムからの『メモリちょうだい』に、どの空きを渡すか決めるやり方

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

メモリ割当戦略とは(全体像)

プログラムは動くときに「このくらいメモリをちょうだい」と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戦略の速さ)

📝 オリジナル問題 1 Fit戦略の速さ

メモリ割当のFit戦略に関する次の記述のうち、正しいものはどれか。

  1. 一番速いのはFirst-Fitで、最初に見つかった適合する空きにすぐ割り当てる方式である
  2. 一番速いのはBest-Fitで、すべての空きを調べて最良を選ぶから時間がかからないとされる
  3. First-Fitは空きをすべて調べ終えるまで割り当てを決められない方式だとされているものである
  4. Fit戦略はどれを選んでも速さはまったく変わらず、選ぶ意味はないものだとされているものだ
テクマスター
テクマスター 解答・解説

解答は 1 ですよ。

一番速いのはFirst-Fitですね。最初に見つかった適合する空きで決めるので、探す手間が少なくて済みます。Best-Fitは「最良」を探すために全部調べるので、名前に反してむしろ遅いのです。

選択肢2の「Best-Fitが最速」、選択肢3の「First-Fitは全部調べる」、選択肢4の「速さは変わらない」はどれも誤りですよ。

選択肢判定理由
1First-Fitは最初の適合で決めるので速い
2Best-Fitは全部探すので遅い
3First-Fitは最初の適合で決める
4戦略で速さや断片化が変わる

オリジナル問題2(断片化の2種類)

📝 オリジナル問題 2 内部断片化と外部断片化

断片化に関する次の記述のうち、正しいものはどれか。

  1. 内部断片化も外部断片化もまったく同じ現象で、呼び名が2つあるだけだとされているものだ
  2. 内部断片化と外部断片化は、どちらもメモリには一切むだが出ない状態のことだとされている
  3. 内部断片化は割り当てた領域の中の余り、外部断片化は空きが細切れで連続して取れないことだ
  4. 内部断片化は画面の表示の乱れのことで、メモリのむだとは無関係なものだとされているものだ
テクマスター
テクマスター 解答・解説

解答は 3 ですよ。

内部断片化は、割り当てた領域の「中」の余り(4KB渡して3.5KBしか使わない等)。外部断片化は、空きが細切れで連続して取れない状態ですね。性質の違う別の現象です。

選択肢1の「同じ現象」、選択肢2の「むだが出ない」、選択肢4の「表示の乱れ」はどれも誤りですよ。

選択肢判定理由
1内部と外部は別の現象
2むだが出る現象を指す
3内部は中の余り・外部は細切れ
4表示の乱れではない

オリジナル問題3(バディシステム)

📝 オリジナル問題 3 バディシステム

バディシステムに関する次の記述のうち、正しいものはどれか。

  1. バディシステムはメモリをまったく分割せず、つねに全体を1人だけに渡す方式だとされている
  2. バディシステムは空きを2のべき乗で分割・合併して管理し、Linuxカーネルで使われている
  3. バディシステムは仲のよいプログラム同士だけにメモリを配るしくみだとされているものである
  4. バディシステムは画面に2人の絵を表示する機能のことで、メモリ管理とは無関係だとされている
テクマスター
テクマスター 解答・解説

解答は 2 ですよ。

バディシステムは、空きを2のべき乗(4KB・8KB・16KB…)で分割・合併して管理するしくみですね。解放したときに隣どうしをくっつけて細切れを抑えます。Linuxカーネルの物理メモリ管理で使われています。

選択肢1の「分割しない」、選択肢3の「仲のよいプログラムに配る」、選択肢4の「2人の絵を表示」はどれも誤りですよ。

選択肢判定理由
12のべき乗で分割して管理する
22のべき乗で分割・合併・Linuxで採用
3仲のよさで配るのではない
4絵を表示する機能ではない

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る