私はオンラインでLinuxプロセスのメモリレイアウトについて矛盾するか不明な説明をたくさん見ました。通常よく使われる写真良い:
別の共通点がある説明する言うことができる:
データセグメントには、事前定義された値があり、変更できるグローバルまたは静的変数のみが含まれます。ヒープには、通常、データセグメントの終わりから始まるヒープセクションと呼ばれるメモリ部分に格納されている動的に割り当てられたデータが含まれます。
そして返品:
通常、ヒープはCランタイムによって生成および管理される特定のメモリ領域です
malloc
(システムコールを使用して増減brk
しsbrk
ます)。
mmap
malloc
ヒープに依存しない(したがってヒープに依存しない)新しいメモリ領域を作成する方法。munmap
その逆の場合は、これらの領域を解放します。
これらの説明の多くは、時代に遅れているようで、矛盾も多く発見されました。たとえば、上記の回答のような多くの記事では、ヒープがmyで使用されていると主張していますmalloc
が、実際にはsbrk
orを使用するライブラリ呼び出しですmmap
。malloc
マニュアルページ説明する:
通常、
malloc()
メモリはヒープから割り当てられ、sbrk(2)
割り当てられたメモリブロックが次より大きい場合、ヒープは必要に応じてサイズ変更されます。MMAP_THRESHOLDbytesを使用している場合、glibcmalloc()
実装は.bytesを使用してメモリを個人用の匿名マップとして割り当てますmmap(2)
。
それでは、malloc
多くの場合によって実装されている場合、mmap
ヒープとmmap領域の違いは何ですか?
一見矛盾するもう一つのことは、malloc
マンページ自体のような多くの記事がヒープサイズを主張brk
/調整するということです。sbrk
マニュアルページ実際にサイズが調整されると言いました。データセグメント:
brk()
そしてsbrk()
場所の変更プログラムの中断、これはプロセスデータセグメントの終わりを定義します(つまり、プログラム割り込みは初期化されていないデータセグメントの終わり以降の最初の位置です)。
したがって、私は今日、さまざまなセグメントのプロセスメモリレイアウトの明確で最新の全体的な説明を提供しようとしました。
- ヒープ領域とmmap領域の違いは何ですか? (私が試したいくつかのテストで得られたアドレスを見て、
mmap
それをヒープ範囲と比較すると、割り当てられたページの一部が実際にヒープセグメント内に割り当てられている/proc/self/maps
ように見えます。)mmap
- 〜これ残り終わりを意味するデータセグメントまたは終了山?
その他の関連質問: