私はこれに対する決定的な答えを得ることを本当に望んでいます。
以前、「スレッドとは (本当は) なんですか?」という質問がありました。私はいくつかの非常に良い答えを得ました。ここから得た教訓は、スレッドが次のようなものであるということです。
スレッドは、プロセッサー・レジスター (シングル・コア用) の独立した一連の値です。これには命令ポインタ (別名プログラム カウンタ) が含まれているため、何をどの順序で実行するかを制御します。また、スタック ポインターも含まれています。これは、スレッドごとに一意のメモリ領域を指す方が適切です。そうしないと、互いに干渉します。
すなわち
スレッドは、一連のレジスタ値よりも「具体的な」ものではありません
と
CPU レジスタの正確なリストはアーキテクチャによって異なりますが、命令ポインタとスタック ポインタはほぼ普遍的です。このスレッド (一連のレジスタ値) がプロセッサ コアにロードされ、スレッドが実行されている限り、スレッドを定義します。プロセッサは、スレッドが要求する命令をフェッチし、スレッド レジスタを更新しています。コンテキストの切り替えが必要な場合、プロセッサはこのレジスタ値のセットをメモリに保存し、通常は割り込み処理ロジックの一部として、別のスレッドに属するセットをロードします。
さらに、スレッドには TLS (Thread Local Storage) と独自の呼び出しスタックがあることも理解しています。
繰り返しますが、私の質問を明確にするために、スレッドのコンポーネント(タイトルに記載したとおり) は、レジスタ値、その TLS、およびそのコール スタックです。タイトルの他の項目 (プロセス、アプリドメイン、およびコンテキスト) のコンポーネントを知りたいです。
これは私が読んでいる本の図です (Pro C# 2008 and the .NET Platform)
この図が Win32 プロセスに関するものであることは理解していますが、同じ TLS のコール スタックの考え方が .NET にも当てはまると思います。また、これらのスレッド (A および B) を定義するレジスタ値 (またはレジスタ値が存在することを示すもの) が含まれていれば、この図はより良くなると思います。
現在、調査を続けておりますので、まとめてお聞きしたいと思います。Processes、AppDomains、および Contexts について同じ情報を知りたいです (これは、ホスティングの「階層」として理解している順序です。つまり、プロセス ホスト appdomains、appdomains ホスト コンテキスト、contexts ホスト スレッド)。
私の最終的な目標は、これらすべてのエンティティ (またはそれらが何であれ) の間の関係を図式化できるだけでなく、それらを実際に構成するコンポーネント (たとえば、スレッドの場合、レジスタ値、TLS、実際にそれらを構成する呼び出しスタック)。その際、この質問の図を最後に編集として投稿します。今のところ、これは私が読んでいる本から取った図です (プロセス、アプリ ドメイン、およびコンテキストに関して):
PS 誰かが既にこれらすべてを説明している図を知っているなら、私はそれを見てみたい. そうでない場合。. . なぜ一体がないのですか??
編集:これまでのところ、図として持っているものは次のとおりです