3

重複の可能性:
ヒープとスタックのメモリはどのように管理、実装、割り当てられていますか?

こんにちは、私の質問はヒープに関するもので、データ構造ではなく、動的メモリ割り当てに使用されるメモリ領域に関するものです。

C (またはおそらく C++) でプログラムを作成していて、そのコードの深さのどこかで malloc() の呼び出しが行われたとします (または、C++ の場合は演算子 new が呼び出されます)。割り当てられたメモリの場所はどこですか?コンパイラ (リンカ?) は、ヒープとして使用されるデータ セグメントを追加しますか? そのセグメントのサイズはどのように決定されますか? 「ヒープセグメント」全体よりも大きなメモリのチャンクを割り当てようとするとどうなりますか? ヒープは拡張されますか? はいの場合、どのように?

4

3 に答える 3

3

OS はページを割り当て、それを malloc/free に返します。次に、それらのページをメモリから要求されたサイズのブロックに分割します。OS は、まだ要求されていないユーザーのアドレス空間内の任意のページを割り当てることができます。ヒープ セグメントはありません。割り当てられたメモリは、OS が決定する任意の場所にあります。

于 2010-11-20T10:00:32.903 に答える
0

古いUNIXの実装sbrk()では、最後のデータセクションの境界を移動するためのメカニズム--systemリクエストが使用されていました。メモリが割り当てられると、tuntimeライブラリはシステムを呼び出してデータ境界を上に移動し、新しく来るメモリを使用します。

新しい運用システムは仮想メモリを使用するため、mallocは必要に応じてシステムに新しい空きVMページを要求します。

スタンドアロンアプリケーション(ベアハードウェア、マイクロコントローラーなどで実行)には、すべてメモリが割り当てられています。リンカスクリプトは動的領域のシンボルを定義するため、ライブラリはすべてのメモリを認識します。例:とのようなものfreemembotfreememtop、最小および最大の空きメモリ領域の場所を示します。

于 2010-11-20T12:16:22.333 に答える
0

dlmalloc(glibc、uClibc、および他の多くの場所で使用されるmalloc()実装)の内部動作の説明がここにあります

UnixライクなOSには、メモリを要求/解放するための2つの主要なインターフェイスがあります。

  • brk()は、データセグメントを拡大/縮小します。
  • mmap()/ munmap()は、追加のメモリマッピングを要求/解放します。

Windows APIは、実際にはmalloc()/ free()のようであり、HeapAlloc()/ HeapFree()のような関数を備えています。

于 2010-11-20T12:19:36.697 に答える