動的メモリ割り当てにヒープはいつ使用されますか?

動的メモリ割り当てにヒープはいつ使用されますか?

メモリ割り当てに関するすべての記事は、メモリ割り当て方法を説明したり、ヒープとの関係を考慮せずに使用するmmap方法を説明しているようです。sbrk

私はヒープがメモリ割り当てでほとんど重要ではない役割を果たしていることがわかりました。実際、それが何をしているのかはよくわかりません:D、誰かが私を混同しないように頼みます。


これが私が理解する方法です。

1)メモリが割り当てられると、初期化されていないデータセグメントの終わりであるBSSが拡張される。これらの拡張(xたとえば、アドレスの移動x-n)は呼び出しの結果として発生しますsbrk。このモデルでは、nBSSセグメントの先頭のバイト数を減らすためにメモリが割り当てられます(各アドレスに対して1バイトの仮定)。sbrkこのモデルは現在廃止されました。一部の人々はヒープをそのようなすべての拡張の集合空間として定義します。他の人はそうではありません。後者の場合、ヒープは何をしますか?

2) 最新のメモリ割り当て方式ではヒープが存在します(何の理由なのかわかりません)。メモリを割り当てるために、データはページコレクションとしてメモリ領域にmalloc内部的に格納されます。mmapこれらのメモリ領域はヒープとは無関係です。


要約:

以前のシステムの場合:エンドBSSでオフセットを増やした後に得られたアドレス空間にメモリ割り当てが保存されると、ヒープは使用されますか?

最新のシステムの場合:mmapが主にメモリ割り当てに使用されると仮定すると、ヒープの目的は何ですか?

どちらの場合も、ヒープは実際にどのように使用されますか?

ベストアンサー1

mmapsbrkプロセスにアドレス空間を割り当てるためにカーネルが提供するシステムコール。これらの呼び出しは、仮想アドレスのマッピングを物理ページフレームに変更します。これらのマップのアドレス制限を超えたメモリアドレッシングは厳密に禁止され、分割エラーが発生します。これはカーネルがプロセスに提供する低レベルのインタフェースです。brkアドレスで終わるメモリ領域を通常ヒープと呼びます。

mallocカーネルはまたはについて何も知りませんfree。これはlibcのライブラリ関数です。 Libcはデータ構造を保持し、メモリ割り当ての観点からどのメモリ領域が空であるかを記録します。たとえば、Libcが動的メモリ割り当てを実装する方法にmalloc応じてマッピングを拡張します。sbrkmmapmalloc

おすすめ記事