タイトルのように、連続したメモリブロックとは何ですか?
占有するアドレスにギャップがないもの。おそらくこれを「ブロック」と考え、中央にギャップがあるものを「2つのブロック」と考えることができます。
この用語は、配列の定義で「隣接」していると見なされます。これは、要素が端から端までレイアウトされ、不連続性や要素間のパディングがないことを意味します(各要素の内部ではなく、要素間にパディングがある場合があります)。したがって、5つの4バイト要素の配列は次のようになります(1バイトあたり1つのアンダースコア文字、|記号はメモリを表しません)。
____ ____ ____ ____ ____
|____|____|____|____|____|
次のようには見えません。
____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|
また、次のようにも見えません。
____ ____ ____ ____ ____
|____|____|____| ... somewhere completely different ... |____|____|
すべての場合において、「のように見える」とは、「Cに表示されるアドレスに関する限り」を意味します。仮想アドレス空間では何かが隣接している可能性がありますが、物理RAMでは隣接していません。さらに言えば、物理的なRAMアドレス空間では隣接しているが、実際には物理的なRAMで隣接していない可能性があります。その半分は1つのRAMチップ上のここで、残りの半分は別のRAMチップですが、Cメモリモデルはそれを「見る」ことができません。
これは、位置1から位置5に及ぶ5バイトの連続したメモリブロックです。
これは、メモリ内で一緒になっていて、それらの間にギャップバイト(白)がないバイト(水色)を表します。
これは、対象となる5バイトの非連続セットです。
これは、位置4と6にギャップバイトを持つ3つのバイトグループ(黄色)にフラグメント化されています。位置1から開始して、位置1から3にまたがる3バイトの連続したブロックがあります。それぞれ1バイトのブロックがさらに2つあります。それぞれ位置5と7にあります。
ロケーション0の未使用ブロックと、ロケーション7を超える後続のブロックは、ロケーション1から7までの対象バイトの間に挿入されるため、通常は無視できます。
他のメモリによって中断されないメモリのブロック。または、より正確に言うと、仮想アドレス空間の中断のないブロックが必要です。実際のRAMそのアドレス空間の裏付けは連続している必要はありません。
これは、大きなメモリブロックを割り当てる場合に重要です。 OSはそれを連続したブロックとして提供する必要がありますが、メモリが断片化されて小さい部分しか解放されない場合、合計空きメモリが要求されたスペースより大きくても、このメモリ割り当ては満たされません。
64ビットアプリではアドレススペースが大きいため、これはそれほど大きな問題ではありません。しかし、32ビットプロセスでは、ヒープが断片化されて(解放されたブロック間で未解放のブロックがまだある)、大きな割り当てが失敗する場合があります。
メモリブロックは、単一の線形アドレス空間からの開始アドレスと終了アドレスによって定義され、ホールがない場合に正確に隣接しています。
メモリ割り当てのコンテキストで答えると、メモリアロケータを呼び出して24バイトのメモリを要求すると、少なくとも24バイトの未割り当てメモリの単一ブロックを見つけることができる必要があります。
あるアドレスx
で始まる16バイトのメモリと、y
で始まる別の8バイトのメモリがある場合、y > x + 16
またはy < x - 8
(ギャップを作成します)、合計24バイトの空き領域があっても、アロケータは24バイトの要求を満たすことができません。
Fragmentation も参照してください。
メモリは、多数のバイトブロックで構成されています。各ブロックには独自のアドレスがあります。プロセスがメモリを要求すると、メモリは次の2つの方法で割り当てられます。
連続したメモリ割り当てでは、連続したメモリブロックと呼ばれる連続した(次々に)ブロックが割り当てられます。
不連続なメモリ割り当てでは、異なる場所に存在する個別のブロックが割り当てられます。