thread
プロセス内に実装された独自のスタックがあることがわかっています。しかし、私の質問は、いつthread
彼自身のスタックに実装されたとき、それはプロセスまたは他の機能によって使用されたのと同じスタックですか?
グローバル変数、ファイル記述子、シグナルハンドラーなどを共有することにもう1つ疑いがthread
あります。しかし、すべてのスレッドが実行された同じアドレス内でこれらすべてのパラメーターをどのように共有するのでしょうか?
簡単な説明をいただければ幸いです。
thread
プロセス内に実装された独自のスタックがあることがわかっています。しかし、私の質問は、いつthread
彼自身のスタックに実装されたとき、それはプロセスまたは他の機能によって使用されたのと同じスタックですか?
グローバル変数、ファイル記述子、シグナルハンドラーなどを共有することにもう1つ疑いがthread
あります。しかし、すべてのスレッドが実行された同じアドレス内でこれらすべてのパラメーターをどのように共有するのでしょうか?
簡単な説明をいただければ幸いです。
スレッドが自分のスタックに実装されているとき、それはプロセスまたは他のスタックで使用されているのと同じスタックですか?
これを完全に解析することはできませんが、要点はわかります。
ほとんどの場合、マルチスレッド アプリケーションの Linux では、すべてのスレッドが同じアドレス空間を共有します。個別のプロセッサで実行されている場合、各スレッドはローカルにキャッシュされたメモリを持っている場合がありますが、全体的なアドレス空間はすべてのスレッドで共有されます。スレッドごとのスタック領域でさえ、すべてのスレッドで共有されます。つまり、各スレッドが異なる連続したメモリ領域を取得するだけです。
しかし、これらすべてのパラメーターを同じアドレス内で共有するにはどうすればよいでしょうか。
これは、グローバル変数、ファイル記述子などにも当てはまります。それらはすべて共有されます。
Linux で実行されるほとんどのスレッド実装は、clone(2) syscall を使用して新しいスレッド プロセスを作成します。クローンのマニュアルページから引用するには:
clone() は、fork(2) と同様の方法で新しいプロセスを作成します。これは、実際には、下層の clone() システム コール (以降、sys_clone と呼びます) の上層にあるライブラリ関数です。sys_clone の説明は、このページの最後にあります。
fork(2) とは異なり、これらの呼び出しにより、子プロセスは実行コンテキストの一部 (メモリ空間、ファイル記述子のテーブル、シグナル ハンドラのテーブルなど) を呼び出しプロセスと共有できます。
ps -eLf
Linux でを使用すると、複製されたプロセスを確認できます。