隣接するメモリブロックとは何ですか?
-
27-09-2019 - |
質問
タイトルのように、隣接するメモリブロックとは何ですか?
解決
それが占めるアドレスにギャップがない人。おそらくこれを「ブロック」と考えるだけで、中央にギャップがある何かを「2つのブロック」と考えることができます。
この用語は、配列の定義に「隣接」であると表示されます。つまり、要素はエンドツーエンドでレイアウトされ、不連続性もパディングもありません(各要素の中にパディングがありますが、要素間ではなくパディングがあります)。したがって、5つの4バイト要素の配列がこのように見えます(バイトごとに1つのアンダースコア文字、|シンボルはメモリを表しません):
____ ____ ____ ____ ____
|____|____|____|____|____|
このようには見えません:
____ _ ____ _ ____ _ ____ _ ____
|____|_|____|_|____|_|____|_|____|
そして、それもこのようには見えません:
____ ____ ____ ____ ____
|____|____|____| ... somewhere completely different ... |____|____|
すべての場合において、「Cにあるアドレスが関係する限り」「見た目」は「」とは意味があります。仮想アドレス空間では何かが隣接する可能性がありますが、物理的なRAMでは隣接していません。さらに言えば、物理的なRAMアドレス空間では何かが隣接する可能性がありますが、実際には物理的なRAMには隣接していません。その半分はここにある1つのRAMチップにあり、残りの半分はあそこの別のRAMチップにあります。しかし、Cメモリモデルはそのいずれも「表示」できません。
他のヒント
これは、場所1から場所5に及ぶ5バイトの連続したメモリブロックです。
それは、それらの間にギャップバイト(白)のないメモリに一緒にいるバイト(色付きの水色)を表します。
これは、5バイトの関心のある非連続セットです。
場所4と6でギャップバイトを持つ3つのバイト(色付き黄色)の3つのグループに断片化されています。場所1から始まり、1から3に及ぶ3つのバイトの連続ブロックがあります。それぞれ場所5と7で。
位置0の未使用ブロックと、ロケーション7を超える後続ブロックは、通常、1〜7から7までの関心のバイト間で干渉するため、無視できます。
他のメモリによって中断されないメモリのブロック。または、より正確にするには、仮想アドレス空間の途切れないブロックが必要です。宇宙に対処する本物のRAMバッキングは、隣接する必要はありません。
これは、大きなメモリブロックを割り当てる場合に重要です。 OSは隣接するブロックとしてそれを提供する必要がありますが、メモリが非常に断片化されている場合、小さなピースのみが自由である場合、このメモリの割り当ては要求されたスペースよりも大きい場合でも満たすことはできません。
アドレススペースが大きいため、これは64ビットアプリではそれほど大きな問題ではありません。しかし、32のビットプロセスでは、ヒープが非常に断片化されていることが起こります(解放されたブロックの間にはまだ未舗装のブロックがあります)。
メモリの割り当てのコンテキストで答えると、メモリアロケーターを呼び出して24バイトのメモリを要求すると、少なくとも24バイトの未割り当てメモリの単一ブロックを見つけることができなければなりません。
1つのアドレスから始まる16バイトのメモリがある場合 x
アドレスから始まる別の8バイト y
そのような y > x + 16
また y < x - 8
(それがギャップを作成するでしょう)、アロケーターは、合計24バイトが無料であっても、24バイトのリクエストを満たすことができません。
参照してください 断片化.
メモリブロックは、単一の線形アドレス空間からの開始とエンドアドレスによって定義され、穴がない場合に正確に隣接しています。