web-dev-qa-db-ja.com

スタックとヒープは、Windowsの同じプロセスでスレッドにどのように割り当てられますか?

異なるスレッドのスタックは異なりますが、ヒープはどうでしょうか。スレッドごとにヒープが異なる場合、それらはどのようにオブジェクトを共有しますか?

4
sk patra

オペレーティングシステムスレッドの標準実装は、同じメモリ(ヒープ)、コード、データ、リソースハンドルなどを共有することです。この種類のスレッドを使用するコードは、オブジェクトを共有できます(ただし、「オブジェクトをどのように共有するか安全に? ")ただし、一部の言語(例 Erlang )は、共有メモリにアクセスできない独自のバージョンのスレッドを提供します。このような場合、共有状態はないため、共有オブジェクトはありません。これらの構成要素は、何らかの形式の メッセージパッシング で通信します。

3
itsbruce

AFAICR、新しいユーザースペーススレッドの場合、スタックスペースはオペレーティングシステムによって ZwAllocateVirtualMemory()ルーチン のカーネル側を使用して仮想メモリに割り当てられます。スレッドのスタックポインターがこのブロックの先頭に設定され、スレッドプロシージャが開始されます(他のセットアップの中で、ここでは省略されています)。

スレッドがヒープに動的に割り当てる必要がある場合、スレッドは 'new'、 'malloc()'またはGlobalAlloc()を使用できます-それらは最終的にすべてネイティブAPI ' RtlAllocateHeap ()'を通過します。 プロセスヒープから割り当てます。これを実行する複数のスレッドがあるため、スレッドセーフである必要があります(デフォルトでは、オプションopt-フラグ)。

ヒープにメモリが割り当てられると、スレッドは自由にそれを使って何でも実行できます。オペレーティングシステムによって強制されるロックはありません。必要に応じて、オブジェクトへのアクセスをシリアル化するのは言語/ランタイム次第です。一部の言語にはこの組み込み機能があります(例: ' synchronised ')。他の言語ではすべて手動です。

1
JBRWilkinson