malloc() によって割り当てられたメモリ領域は何ですか?

malloc() によって割り当てられたメモリ領域は何ですか?

私は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実装が実際にメモリを予約する方法について説明します。

おすすめ記事