メモリ管理アルゴリズム(Allocator)

簡易的なメモリ割り当て (Simple Malloc)

C言語の malloc のようなメモリ動的確保の仕組みをシミュレーションします。

 メモリブロックは通常、以下の2つの部分で構成されます。

  1.  ヘッダ (Header): ブロックのサイズや状態などの管理情報を記録する場所。ユーザーからは見えない。
  2. ボディ (Body): 実際にユーザーがデータを書き込める領域。

malloc関数は、ユーザーがデータを書き込むための「ボディの先頭アドレス」を返す必要があります。

フリーリスト (Free List) によるメモリ管理

メモリの「空き領域」を連結リスト(Linked List)でつないで管理する手法です。メモリ割り当て要求が来た時、リストを辿って適切なサイズの空きブロックを探します。

アルゴリズム: First Fit (最初に見つかったものを使う)

リストの先頭から順にチェックし、要求サイズ以上の空きブロックが見つかったら即座に使用します。実装が単純で高速ですが、断片化(フラグメンテーション)が起きやすい特徴があります。

空き領域探索アルゴリズム

今回実装した「First Fit」に加え、よく比較される「Best Fit」と「Worst Fit」について、それぞれの特徴と利用シチュエーションを解説します。

Best Fit (最良適合)

要求されたサイズを満たす空きブロックの中で、「最も小さい(余りが最小になる)ブロック」 を選ぶ戦略です。

  • 探索方法:
    • リスト全体(または木構造)を走査して、条件に合う最小のブロックを探します。
  • メリット:
    • 大きな空き領域を温存できる: ギリギリのサイズを使うため、巨大な連続領域を崩さずに残しておけます。将来、大きなメモリ要求が来た時に成功率が上がります。
  • デメリット:
    • 微小な断片化(断片化): 「要求サイズ」と「ブロックサイズ」の差がごく僅かになりがちです。結果として、「小さすぎて誰も使えない隙間」 が大量に発生します。
    • 探索コスト: リスト全体を見る必要があるため、First Fitに比べて処理が遅くなります(サイズ順にソート済みでない場合)。
  • 利用シチュエーション:
    • メモリ容量が非常に限られており、無駄(内部フラグメンテーション)を極限まで減らしたい組み込みシステムなど。
    • 割り当てサイズの種類が多岐にわたり、大きなブロックを安易に崩したくない場合。

Worst Fit (最悪適合)

要求されたサイズを満たす空きブロックの中で、「最も大きい(余りが最大になる)ブロック」 を選ぶ戦略です。

  • 探索方法:
    • リスト全体を走査して、最大のブロックを探します。
  • メリット:
    • 再利用しやすい残骸を残す: 余った領域(残りカス)も十分な大きさを持つため、別の割り当て要求で再利用できる可能性が高くなります。Best Fitのような「微小な隙間」ができにくいです。
  • デメリット:
    • 大きな領域の枯渇: 常に最大のブロックを切り崩していくため、「本当に大きなメモリが必要になった時」 に、十分な連続領域が残っていない(断片化してしまっている)事態に陥りやすいです。
  • 利用シチュエーション:
    • 中規模サイズの割り当てと解放が頻繁に繰り返されるようなシステム。
    • 「細かいゴミ」の発生を嫌う場合。
戦略探索ロジック主なメリット主なデメリット速度
First Fit最初に見つかったもの高速、シンプル前方に断片化が集中しやすい
Best Fit余りが最小のもの大きな空きを温存できる極小の使えない隙間ができる
Worst Fit余りが最大のもの余りも再利用しやすい大きな空きがすぐ無くなる

補足:その他の戦略

  • Next Fit: 前回の探索終了位置から続きを探す方法。First Fitの偏りを改善し、リスト全体を均等に使います。
  • Quick Fit: よく使うサイズ(例: 16B, 32B…)ごとに専用のリストを用意する方法。探索なしで即座に割り当てられます。

このように、メモリ管理戦略は「速度」と「メモリ利用効率(断片化の回避)」のトレードオフで決定されます。

バディシステム (Buddy System)

メモリ領域を常に「2のべき乗(2^k)」のサイズで管理するアルゴリズムです。

割り当て (Allocate):

  1. 要求サイズ以上の最小の2のべき乗ブロックを探します。
  2. 大きすぎる場合は、適切なサイズになるまで半分に分割(Split)し続けます。
  3. 分割された片割れ同士を「バディ (Buddy)」と呼びます。

解放 (Free):

  1. 解放されたブロックのバディも空いている場合、結合(Merge)して
  2. 1つ上のサイズのブロックに戻します。これを再帰的に繰り返します。

アリーナアロケーション (Arena / Bump Allocation)

 大きなメモリ領域(アリーナ)を事前に確保しておき、割り当て要求が来たらポインタ(offset)を単に進めるだけでメモリを渡す手法です。

 特徴:

  •  割り当て (Allocate): O(1) で超高速(足し算と境界チェックのみ)。
  • 解放 (Free): 個別のブロック解放は行わず、アリーナ全体を一括でリセットします。

用途: ゲームのフレームごとの一時オブジェクト、リクエストスコープのメモリ管理など。

共有コメント 共有されるコメント欄です。