4

私の理解では、プロセスが実行中の場合、プロセスには自由に使えるメモリがいくらかあります。スタックのサイズが大きくなると、スタックはプロセスの一方の端から構築され (スタックの前にあるグローバル変数は無視されます)、ヒープは別の端から構築されます。スタックまたはヒープに追加し続けると、最終的にすべてのメモリがこのプロセスで使い果たされます。

プロセスに割り当てられるメモリの量はどのように決定されますか? さまざまな変数に依存しているとしか想像できませんが、可能な限り一般的な応答は素晴らしいでしょう. 具体的に言うと、C++ で書かれた Linux プロセスに興味があります。

4

2 に答える 2

2

遭遇するほとんどのプラットフォームでは、Linux は仮想メモリが有効な状態で実行されます。つまり、各プロセスには独自の仮想アドレス空間があり、そのサイズはハードウェアとカーネルが構成した方法によってのみ決定されます。

たとえば、「3/1」分割構成の x86 アーキテクチャでは、すべてのユーザー空間プロセスに 3GB のアドレス空間があり、その中にヒープとスタックが割り当てられます。これは、システムで使用可能な物理メモリの量に関係ありません。x86-64 アーキテクチャでは、通常、各ユーザー空間プロセスで 128 TB のアドレス空間を使用できます。

その仮想メモリをバックアップするために、物理メモリが個別に割り当てられます。プロセスで利用できるこの量はシステムの構成によって異なりますが、一般的には単に「オンデマンド」で提供されます。ほとんどの場合、存在する物理メモリとスワップ ファイル領域の量が制限され、現在他の目的で使用されている量が制限されます。 .

于 2011-06-20T06:23:50.150 に答える
-1

スタックは魔法のように大きくなりません。サイズは静的で、サイズはリンク時に決定されます。したがって、スタックから十分なスペースを取ると、オーバーフローします (スタック オーバーフロー;)

一方、ヒープ領域は「魔法のように」大きくなります。つまり、ヒープにさらに多くのメモリが必要になると、プログラムはオペレーティング システムにメモリの追加を要求します。

編集: Mat が以下で指摘したように、スタックは実際には最新のオペレーティング システムの実行時に増加する可能性があります。

于 2011-06-18T12:38:18.980 に答える