プログラムが必要とするサイズちょうどに主記憶を割り当てる方式。
可変区画方式とは、プログラムが必要とするサイズだけ主記憶を動的に割り当てる方式のことです。固定区画方式と違い、区画のサイズはあらかじめ固定しません。
身近な例で考えると、長いベンチに後から来た人がちょうど座れる幅だけ詰めて座っていくイメージです。ロッカー(固定区画)のように決まった枠を使うのではなく、その人に必要な幅だけを使うので、座席に無駄な隙間ができにくくなります。
上のツールで▶ボタンを押すと、プログラムをサイズちょうどに割り当て、割当てと解放を繰り返すうちに空き領域が細切れ(外部断片化)になる流れを順に確認できます。
可変区画方式では、プログラムが来るたびに要求サイズちょうどの領域を空き領域から切り出して確保します。区画の中に余りが出ないので、固定区画方式で問題だった内部断片化(区画内の未使用領域)は起きにくいのが利点です。
空き領域が複数あるとき、どこから切り出すかには、いくつかの代表的な選び方があります。
・ファーストフィット:先頭から探して、最初に見つかった入る空きに割り当てる(速い)
・ベストフィット:入る空きの中で最も無駄が小さい(最も近いサイズの)空きに割り当てる
・ワーストフィット:最も大きい空きに割り当てる
どの選び方にも一長一短があります。速さを優先するか、無駄を減らすかで使い分けます。上のツールのSTEP2で、各プログラムが必要なサイズちょうどに割り当てられ、区画内に余りが出ない様子を確認できます。
外部断片化(external fragmentation)とは、割当てと解放を繰り返すうちに空き領域が小さく分断され、合計は足りても連続した空きが足りなくなる現象のことです。可変区画方式の欠点です。
たとえば空き領域が120KB + 100KB = 220KBあっても、間に使用中の領域が挟まっていれば、ひとつながりの空きは最大でも120KBです。180KBのプログラムは合計では足りているのに割り当てられません。これが外部断片化のやっかいなところです。
対策としてよく使われるのがコンパクション(メモリ整理)です。使用中の領域を主記憶の片側に寄せ集めることで、散らばっていた空きをひとつながりにまとめます。ただし領域を移動するため処理コストがかかります。上のツールのSTEP5とSTEP6で、割当て不可の状態と、コンパクションで解決する様子を確認できます。
結論:プログラムをサイズちょうどに割り当てて解放を繰り返すと、使用中の領域が「飛び石」状に散らばるからです。固定区画方式では区画が固定なので飛び石は起きません。しかし可変区画方式ではサイズがバラバラな領域が来ては消えを繰り返し、空き領域がだんだん細切れになっていきます。
身近な例で考えると、長いベンチで人が入れ替わり立ち替わり座ると、空席が「島」に分かれて、連続した長い空席が取れなくなるのに似ています。1席ずつの空席が各所に点在しても、グループが隣に座ろうとすると席が足りないのと同じ状態です。
固定区画方式と比べると、次のようなトレードオフ(長所と短所の関係)があります。
・可変区画の長所:プログラムのサイズにぴったり合わせるため、区画内の無駄(内部断片化)が起きにくい
・可変区画の短所:割当てと解放を繰り返すと外部断片化が起き、管理も複雑になる
・固定区画の長所:管理がシンプルで、外部断片化が起きない
・固定区画の短所:プログラムが区画より小さいと内部断片化でメモリが無駄になる