2010-11-20 8 views
2

可能性の重複:
How is heap and stack memories managed, implemented, allocated?通常、ヒープはどのように実装されていますか?

こんにちは、 私の質問は、ヒープではなく、データ構造が、動的メモリ割り当てのために使用されるメモリのエリアについてです。

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

答えて

2

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

+0

これで保護はどのように機能しますか?メモリを動的に割り当てると、プロセスだけがプロセスにアクセスできます。他のプロセスがそこで読み書き操作を実行しようとすると、エラーが発生します。ページは特定のプロセスに属するとマークされていますか? –

+0

@grigory、no。ページはページテーブル(x86ではPまたはVビット)に有効または無効としてマークされます。PTEにはR/Wビットもあります。 「アクティブな」ページテーブルのセットは、プロセスコンテクストスイッチ上で新たにアクティブなプロセスのものに「切り替える」。すべてのプロセスには独自のページディレクトリ(==ページテーブルセット+ページ属性セット)があります。 –

+3

@Grigory:プロセスのページは他のプロセスには存在しません。 OSは、仮想ページを実ページにマッピングします。あなたは本当に仮想メモリをチェックアウトする必要があります。 – Puppy

0

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

新しい運用システムでは仮想メモリが使用されるため、mallocは必要に応じて新しい無料のVMページをシステムから要求します。

スタンドアロンアプリケーション(ベアハードウェア、マイクロコントローラなどで実行される)は、すべて割り当てられたメモリを持ちます。ライブラリはダイナミックエリアのシンボルを定義するため、ライブラリはすべてのメモリを認識します。 E.最低と最高の空きメモリ領域の場所のためのfreemembotfreememtopのようなものです。

+0

文字列解析関数である 'strpbrk'ではなく' sbrk'を意味すると思います。 :-) –

+0

@R ..:はい、そうです、それは 'sbrk()'です。回答が修正されました。 :) – Vovanium

0

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

  • BRK()/データ・セグメントを縮小拡大:

    Unix風のOSは/解放メモリを要求するための二つの主なインターフェイスを持っています。

  • mmap()/ munmap()は、追加のメモリマッピングを要求/解放します。

Windows APIは実際にはHeapAlloc()/ HeapFree()のような機能を持つmalloc()/ free()です。

+0

Glibcの 'malloc'は' dlmalloc'からかなり離れています。 –

関連する問題