このページでは、記憶領域における「フラグメンテーション」を取り上げています。このほか、通信に関する「フラグメンテーション(IPフラグメンテーション)」があります。
記憶領域内の未使用部分が飛び飛びになってしまい、連続的な大きな領域として使用できない状態のことです。
メインメモリやストレージのように、さまざまな大きさの確保と解放が、頻繁に繰り返されたとき、その順序や大きさの傾向(またメモリ管理のアルゴリズム)によってはフラグメンテーションが発生することがあります。
メインメモリの領域をダイナミックメモリアロケーションによって確保する場合、要求された大きさ以上の連続的な未使用領域が必要であるため、フラグメンテーションは致命的な問題になり得ます。ストレージにデータを保存する場合は、離れたところにある未使用領域に分けて保存することも可能なので、致命的な問題にはならないかもしれませんが、アクセスの効率が低下することになります。
下の図は記憶領域全体を表しており、ABCはそれぞれ別個の確保要求によって割り当てられた領域、〇は未使用領域とします。記号(ABC〇)の個数は、取られている領域の大きさの違いとします。
AAAAABBBCCCC〇〇〇
ここで、Bの領域を解放すると、次のようになります。
AAAAA〇〇〇CCCC〇〇〇
Bが取っていた箇所が未使用領域になりますが、次に必要とされる領域が記号4つ分以上の大きさの連続的な領域だとすると、この場所では不足しますし、ほかの場所もありません。しかし記憶領域全体をトータルでみれば、未使用領域は記号6つ分あるので、4つ分の確保要求は成功することが好ましいといえます。このような状態がフラグメンテーションです。
このケースでは全体を整理して、次のようにできれば解消します。
AAAAACCCC〇〇〇〇〇〇
こういった整理のことを、デフラグメンテーションと呼びます(メインメモリの場合は、コンパクションと呼ぶことが多い)。しかし、これが可能であるかどうか(また容易であるかどうか)は場合によります。たとえば、C言語のように、メモリアドレスを直接保持するポインタの仕組みがあるプログラミング言語によるプログラムでは、メインメモリ上に確保したオブジェクトの位置を変えてしまう行為は難しく、実現が困難です(整理されると、メモリアドレスが変わってしまうので)。
フラグメンテーションには、ここまでに紹介したかたちのほかに、内部フラグメンテーション(内部断片化)と呼ばれるものがあります。区別が必要なら、ここまでに紹介したかたちは、外部フラグメンテーション(外部断片化)と呼びます。
内部フラグメンテーションは、確保する領域の大きさを固定長に統一した場合に発生します。たとえば、本当に必要な大きさが 100バイトだとしても、128バイトなどの事前に決めておいた固定長の大きさに切り上げて確保します。このとき、実際には使われない 28バイトの領域が確保状態になるわけですが、このような未使用部分が生まれることを、内部フラグメンテーションと呼びます。
このような固定長での確保には、外部フラグメンテーションを解消する効果があります。さきほどの例で、ABCの大きさはばらばらでしたが、すべて記号5個分の大きさで確保するように変えてみます。
AAAAABBBBBCCCCC
この状態でBを解放すると、次のようになります。
AAAAA〇〇〇〇〇CCCCC
次回の確保で要求される大きさもまた記号5個分の大きさなので、Bが使っていた領域を使うことができます。誰かが使っていた領域は、次の誰かが確実に使いまわせるため、外部フラグメンテーションの解消につながります。一方で、実は使われていない領域が多数発生しているため、全体としての利用効率が悪くなっている可能性があります。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |