2016-07-24 13 views
0

私はスレッドがコード/グローバルデータを共有しているが、スタックが異なることを知っています。各スレッドには独自のスタックがあります。私は各プロセスのための1つの仮想アドレス空間があると信じています。これは、各スレッドがこの単一の仮想アドレス空間を使用することを意味します。1つの仮想アドレス空間内のプロセススレッドのメモリ管理はどのように行われますか?

仮想アドレス空間に複数のスレッドがある場合にスタック/ヒープがどのように成長するか知りたいですか? 1つのスレッドでスタック領域がいっぱいになった場合、OSはどのように管理しますか?

+1

Windowsでは、各スレッドはスタックのアドレス空間のブロックを取得します。デフォルトでは1MBです。スレッドがこの領域をオーバーフローすると、アプリケーションがクラッシュします。 –

+1

一般に、OS、Cランタイム、独自のコードの3つの関係者が関与しています。 OSは、あなたのプログラムがC言語で書かれていること、そしてCランタイムが 'malloc/free'を使ってヒープを管理していることや、C++プログラムが' new/delete'を使っていることには気にしません。 – MSalters

答えて

0

実際に、オペレーティングシステムのメモリマネージャは、プロセスごとに仮想メモリスペースを作成します(プロセスは異なるメモリスペースを持ち、スレッドはプロセス内の同じメモリスペースを共有します)。

スレッドのメモリ空間内では、各スレッドには独自のスタックがあります。しかし、それらは同じヒープを共有し、賢明なメモリ管理技術を使用してスタックの共有使用を最適化します(Memory Allocation/Deallocation Bottleneck?を参照)。

1つのスレッドでスタック領域がいっぱいになった場合、OSはどのように管理しますか?

OSはスタックを管理しません。スタックは、コンパイラによって作成された静的なデータ構造です。スタックからのメモリ割り当てとメモリ解放はコンパイラによって管理され、いつでもスタックのサイズを知ることができます。したがって、メモリ空間の静的メモリ領域(すなわち、「スタック」全体)をスレッド「サブスタック」に分割することができる。

+1

Windowsでは、少なくとも、OSはスタックを管理します。それはコンパイラの助けを必要としますが、それは大部分の重い持ち上げです。 –

2

linuxでは、スタックオーバーフローが発生した場合にguardsizeが発生すると、スタックサイズはguardsizeで決定されます。

stackoverflowを処理するのはプログラマの責任です。デフォルトのguardsize値は、システムで定義されたページサイズに等しい。

関連する問題