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