私はlibraryを使ってマルチスレッドCプログラムを書いていますpthread
。プログラムはmalloc()
スレッドとメインスレッドから呼び出されます。返されたメモリアドレスを確認すると、malloc()
メインスレッドに返されるアドレスは、malloc()
プログラムのヒープ部分アドレスである一般的なアドレス(例:0x80874a0)です。ただし、malloc()
(生成された)他のスレッドによって返されたアドレスはpthread_create()
少し変わります。アドレスはアドレス空間で高いです(0x7ffa87000a60はスタックセクションのアドレスと少し似ています)。スレッドスタック変数の1つのアドレスを分析した後、返されたアドレスがmalloc()
スレッドスタックの近くにあるように見えます。
私が知っている限り混乱して山プログラムの一部はプログラムのすべてのスレッドで共有されるため、すべての呼び出しはmalloc()
互いに近いアドレスを返す必要があります。アドレスから始まるアドレスを返す必要があります。しかし、それは確かに真実ではありません。
ベストアンサー1
定義によると、mallocから得ることは「ヒープ」です。だから、これらはすべてヒープです。
GNU libcのドキュメントでは、これは「スタジアム」()で実行されることをmalloc
説明しています。man malloc
マルチスレッドアプリケーションでメモリ割り当てをスケーラブルに処理するために、glibc は mutex 競合が検出されると追加のメモリ割り当て領域を作成します。各スタジアムは、システムによって内部的に割り当て(
brk(2)
ORを使用mmap(2)
)し、独自のミューテックスを使用して管理される大規模メモリ領域です。
私が知っている限り、プログラムのヒープ部分はプログラムのすべてのスレッドで共有されるので混乱しています。
「ヒップ」は一般的に私のお気に入りの用語ではありません。さまざまな概念を組み合わせます。
- (山データ構造です。カーネルのメモリ管理データ構造および/または
malloc
ヒープによって生成されたメモリ管理データ構造がヒープであるかどうかは不明です(通常はそうではありません)。したがって、これはすでに混乱の原因です。 ) - 山メモリ保護と仮想アドレスを持つオペレーティングシステムからチャンクを取得し、内部的に使用中としてマークするプロセススペースの特定の領域
malloc
(別々のテーブル、ヒープ、...またはプロセスが開始される前のヘッダ)自体。したがって、あいまいな用語です。brk
物理メモリを実際に占有しなくても、必要に応じてプロセス仮想メモリを拡張できます。したがって、さらに10 GBのスペースを取得し、2つの異なる開始アドレス(5 GB間隔)を持つ2つの異なるメモリ領域を割り当てます。これは1つのヒープで、2つの領域ですか?それぞれ独自のヒープを持つ2つの地域がありますか?文学界はこれに同意しない。仮想メモリ空間の終わりを拡張して2つのメモリサポートを停止するbrk
ことにした場合、mmap
どうなりますか?それでは、この2つの山は何ですか?
したがって、「ヒープ」が何を意味するのかを要約します。あなたの本と特定のmalloc
実装が実際にメモリを予約する方法について説明します。