プロセスメモリレイアウト - ヒープ、データ、mmap領域の違い

プロセスメモリレイアウト - ヒープ、データ、mmap領域の違い

私はオンラインでLinuxプロセスのメモリレイアウトについて矛盾するか不明な説明をたくさん見ました。通常よく使われる写真良い:

ここに画像の説明を入力してください。

別の共通点がある説明する言うことができる:

データセグメントには、事前定義された値があり、変更できるグローバルまたは静的変数のみが含まれます。ヒープには、通常、データセグメントの終わりから始まるヒープセクションと呼ばれるメモリ部分に格納されている動的に割り当てられたデータが含まれます。

そして返品:

通常、ヒープはCランタイムによって生成および管理される特定のメモリ領域ですmalloc(システムコールを使用して増減brksbrkます)。

mmapmallocヒープに依存しない(したがってヒープに依存しない)新しいメモリ領域を作成する方法。munmapその逆の場合は、これらの領域を解放します。

これらの説明の多くは、時代に遅れているようで、矛盾も多く発見されました。たとえば、上記の回答のような多くの記事では、ヒープがmyで使用されていると主張していますmallocが、実際にはsbrkorを使用するライブラリ呼び出しですmmapmalloc マニュアルページ説明する:

通常、malloc()メモリはヒープから割り当てられ、sbrk(2)割り当てられたメモリブロックが次より大きい場合、ヒープは必要に応じてサイズ変更されます。MMAP_THRESHOLDbytesを使用している場合、glibc malloc()実装は.bytesを使用してメモリを個人用の匿名マップとして割り当てますmmap(2)

それでは、malloc多くの場合によって実装されている場合、mmapヒープとmmap領域の違いは何ですか?

一見矛盾するもう一つのことは、mallocマンページ自体のような多くの記事がヒープサイズを主張brk/調整するということです。sbrkマニュアルページ実際にサイズが調整されると言いました。データセグメント:

brk()そしてsbrk()場所の変更プログラムの中断、これはプロセスデータセグメントの終わりを定義します(つまり、プログラム割り込みは初期化されていないデータセグメントの終わり以降の最初の位置です)。

したがって、私は今日、さまざまなセグメントのプロセスメモリレイアウトの明確で最新の全体的な説明を提供しようとしました。

  1. ヒープ領域とmmap領域の違いは何ですか? (私が試したいくつかのテストで得られたアドレスを見て、mmapそれをヒープ範囲と比較すると、割り当てられたページの一部が実際にヒープセグメント内に割り当てられている/proc/self/mapsように見えます。)mmap
  2. 〜これ残り終わりを意味するデータセグメントまたは終了

その他の関連質問:

関連情報