だから私はこの質問を読んでいます。
https://stackoverflow.com/questions/1762418/what-resources-are-shared-Between-threads
そして、「スレッドはスタックを除くすべてのセグメントを共有しますが、あるスレッドはまだ別のスレッドのスタックにアクセスできます」という答えに基づいていますか?
しかし、まだ3つの質問があります。
プロセスのすべてのスレッドが同じ仮想メモリ空間で動作しますか?
スレッドが他のスレッドのスタックに引き続きアクセスできることは、たとえば、スタックが0x00から0xffで始まる場合、1つのスレッドは0x00から0x0fまで動作し、他のスレッドは0x10から0xffまで動作できることを意味しますか?または..?
スタックは、Linuxの各スレッドに固有の仮想メモリの唯一の部分ですか?
ベストアンサー1
- プロセスのすべてのスレッドが同じ仮想アドレス空間で動作しますか?
はい。各スレッドには独自のスタックがありますが、プロセスに関連するすべてのメモリは同じ仮想アドレス空間にあります。あるスレッドの関数に別のスレッドのスタック割り当て変数へのポインタがある場合、関数はその変数を読み書きできます。
- スレッドが他のスレッドのスタックに引き続きアクセスできることは、たとえば、スタックが0x00から0xffで始まる場合、1つのスレッドは0x00から0x0fまで動作し、他のスレッドは0x10から0xffまで動作できることを意味しますか?
最初の質問に対する答えで述べたように、各スレッドには独自のスタックがあります。要約すると、あるスレッドのスタックはAからB、他のスレッドのスタックはCからDまで実行されます。します。
- Linuxでは、スタックは各スレッドの仮想メモリの唯一の部分ですか?
スタックの一意性は仮想メモリとは関係ありません。スタック(実際には「アクティブ化レコードスタック」)は、実行中の関数(現在実行中の関数とすべての呼び出し関数)に関する情報を格納するために使用されます。スレッドが複数ある場合、関数(および呼び出し関数)も複数あります。スレッドがインターリーブされたアクティブ化レコードとスタックを共有する場合、関数が完了したときにどの呼び出し関数に返すかを知ることはほとんど不可能です。