2011-07-23 19 views
1

HEAPはプロセスに対してローカルですか?言い換えれば、私たちは常にプロセスにローカルなスタックを持ち、プロセスごとにスタックしています。ヒープにも同じことが当てはまりますか?また、HEAPがローカルの場合は、CPUからのメモリ使用量が増えるにつれて、HEAPのサイズが変更されるはずだと思いますので、どのくらいのメモリを要求できるのですか?メモリ管理とプロセス

答えて

1

'ヒープ'はプロセスのローカルですが、スレッド間で共有されますが、スタックはスレッドごとではありません。

制限については、例えばlinuxではulimit(マンページを参照)で設定します。

2

実際、ヒープはプロセスのローカルです。制限はオペレーティングシステムによって設定されます。アドレッシングに使用されるビット数によってメモリを制限することもできます(つまり、32ビットは、一度に2G 4Gのメモリしかアドレス指定できません)。

+0

4GB ... 2GBだけではありません – yankee

+0

ああ、2^32 = 4GB(もちろん署名されていない限り:P) –

1

最新のプリエンプティブなマルチタスクOSでは、各プロセスが独自のアドレス空間を取得します。表示できるメモリページのセットは、他のプロセスが見ることができるページとは別です。結果として、はい、スタックとヒープは単なるメモリ領域であるため、各プロセスは独自のスタックとヒープを認識します。

以前の協調的なマルチタスクOSでは、各プロセスが同じアドレス空間を共有していたため、ヒープはすべてのプロセスで効果的に共有されていました。

ヒープは、その中の物の集合によって定義されるため、ヒープサイズはメモリが割り当てられ、解放されるにつれて変化します。これは、OSがどのようにメモリを管理しているかに関係なく当てはまります。

どのくらいのメモリを要求できるかの上限は、メモリマネージャによって決まります。仮想メモリのないマシンでは、コンピュータにインストールされているメモリの上限が上限です。仮想メモリでは、物理メモリとディスク上のスワップファイルのサイズに上限が定義されます。

2

はい、最新のオペレーティングシステムでは、プロセスごとに別々のヒープが存在します。ところで、すべてのプロセスに別々のスタックだけでなく、プロセス内のすべてのスレッドに対して別々のスタックがあります。したがって、プロセスは非常に多くの独立したスタックを持つことができます。

すべてのオペレーティングシステムではなく、すべてのハードウェアプラットフォームでこの機能が提供されているわけではありません。そのためには、メモリ管理ユニット(ハードウェア内)が必要です。しかし、デスクトップコンピュータはその機能を持っています...まあ...しばらく前に... 386-CPU? (あなたがよく知っているなら、コメントを残してください)。あなたは、その機能を持たない何らかの種類のマイクロプロセッサであなた自身を見つけるかもしれません。

とにかく:ヒープサイズの制限は、主にオペレーティングシステムとハードウェアによって制限されます。ハードウェアの制限は、特に制限されたアドレス空間のため制限されます。例えば、32ビットCPUは4GB(2^32)以上は扱わない。現在のCPUでサポートされている物理アドレス拡張(PAE)機能を持つCPUは、64GBまでアドレス指定できますが、これはセグメントの使用によって行われ、1つのプロセスでこの機能を使用することはできません。常に最大4GBが表示されます。

また、オペレーティングシステムによって、メモリが適切に制限されることがあります。 Linuxではulimitコマンドを使用して制限を表示および設定できます。ネイティブではなくインタプリタ/仮想マシン(JavaやPHPなど)でコードを実行している場合、その環境ではさらにヒープサイズを制限できます。