malloc
ヒープ、ピリオドにメモリを割り当てます。
C ライブラリは通常、使用可能なメモリ チャンクのリスト (またはより複雑なデータ構造) を保持し、malloc
を満たす適切なチャンクを見つけます。 (大きなチャンクをいくつかの小さなチャンクに分割する可能性があります) free
を返します 'd メモリをリストに追加 (おそらくいくつかの小さなチャンクを大きなチャンクにマージ)
のみ malloc
を満たすのに十分な大きさのチャンクがリストに含まれていない場合 、ライブラリはOSに追加のメモリを要求します。 sbrk システムコールを使用します。この syscall によって返されるアドレスは、ハードウェアに応じて仮想アドレスまたは実際のアドレスになる可能性がありますが、プログラマーとしてこれを知ることはできません (また、知る必要もありません)。
malloc
と言って ヒープ上のブロックではなく仮想アドレス空間を割り当てるのは、read
と言っているようなものです ファイルからではなくハードディスクから読み取ります。呼び出し元の観点からは無関係であり、常に正しいとは限りません。
メモリ消費量を測定するには、少なくとも 3 つの方法があります:
- 仮想アドレス空間 - 割り当てによって消費されるプロセスのアドレス空間の量。これは、フラグメンテーションと、作成できる連続した将来の最大割り当てにも影響します。
- コミット チャージ - これは、プロセスに割り当てられた書き込み可能でファイル/デバイスに依存しないメモリをすべて維持するために必要な最大物理ストレージのオペレーティング システムの計算です。 OS が合計物理メモリ + スワップを超えることを許可すると、超過分が最初に書き込まれたときに非常に悪いことが起こる可能性があります。
- 物理メモリ - プロセスが現在占有している物理リソースの量 (解釈によってはスワップを含む可能性があります)。これは、バージン ゼロ ページとファイルのバージン プライベート書き込み可能マップによりコミット チャージよりも少なくなるか、プロセスが使用している書き込み不可または共有マッピングによりコミット チャージよりも多くなる可能性があります (ただし、これらは通常、スワップ可能/破棄可能です)。
malloc
一般的にそれらすべてに影響します。
編集: ですから、あなたの質問に答える最善の方法は、次のように言うことです:
malloc
仮想メモリを割り当てます .
仮想メモリは以下を消費します:
- 仮想アドレス空間
- コミット チャージ、および
- 物理リソース (書き込まれている場合)
malloc
ライブラリ呼び出しです。 Linux では、次に sbrk
を呼び出します。 システムコール。 sbrk
ヒープのサイズを増やしますが、実際には物理メモリを割り当てません。プロセスがこのアドレスにアクセスしようとすると、page fault
が発生し、その時点でカーネルは実際の物理ページを割り当て、仮想アドレスにマップします。
TL;DR:malloc
仮想アドレスを返し、物理メモリを割り当てません。
これをチェックしてください。