それで、最近少し組み立てを始めていて、初心者なので、誰かが何かを明確にできるかどうか疑問に思いました。私は、すべてのプロセスに独自のレジスタのセットがあり、各スレッドがこれらのレジスタを正しく変更できると考えています。では、複数のスレッドが衝突を引き起こすことなく同じレジスタを使用するにはどうすればよいでしょうか。または、各スレッドに独自のレジスタセットがありますか?
6 に答える
スレッドコンテキストスイッチでは、現在の実行コンテキストのレジスタを保存し、保存された値を含むレジスタを実行コンテキストからロードして切り替えを開始します。(とりわけ)。したがって、各スレッドには事実上、独自のレジスタセットがあります。ESPはレジスタの1つであるため、独自のスタックもあります。
これについての考え方の1つは、現在のレジスタの状態を保存し、レジスタに新しい状態をロードすることでスレッドを取得することです。それが起こらない場合は、スレッドスイッチではありません。別の仮想アドレステーブルのセットにも切り替える場合は、スレッドスイッチではなくプロセススイッチがあります。
あなたは言う:
私はそれをすべてのプロセスがそれ自身のレジスターのセットを持っていると思います、そして各スレッドはこれらのレジスターを正しく変更することができますか?
しかし、これは完全には正しくありません。各CPUコアには、単一のレジスタセットがあります。これらのレジスタは、OSが別のスレッドに切り替わるたびに変更されます。ただし、CPUコアで実行されるスレッドは一度に1つだけです。プロセスには実際には独自のレジスタがなく、プロセスには独自のスレッド(または少なくとも1つのスレッド)があり、スレッドにはレジスタがあります。つまり、スレッドがCPUコアが利用可能になるのを待っている間、レジスタの値を保持する場所があります。実行します。
ハードウェアでは、プロセッサコアごとに1セットのレジスタしかありません。このため、一度に1つのスレッドのみがレジスタを使用できます。あるスレッドから別のスレッドにすばやく切り替えることにより、単一のコアで複数のスレッドが同時に実行されます。オペレーティングシステムのジョブであるときに実行されるスレッドのスケジューリング。
あるスレッドから別のスレッドに切り替えると、レジスタの内容がメモリの特別な領域に保存され、次のスレッドのレジスタがプロセッサにコピーされます。これには命令ポインタが含まれているため、スレッドは制御を取り戻したときに実行を続行する場所を認識しています。このプロセスは、コンテキストスイッチングと呼ばれます。
オペレーティングシステムのスケジューラはさらに別のスレッドにあるため、実行中のプロセスのみをスケジュールできます。これは、コンテキストスイッチを制御するために特別なハードウェア機能(割り込み)が必要であることを意味します。オペレーティングシステムのみがコンテキストスイッチの割り込みをスケジュールできます。
スレッドはカーネルまたはOSによって実行されるため、プログラムはそれを気にする必要はありません。利用可能なカーネルまたはOSがない場合は、自分で実装する必要があります。そのために必要なもの:
- CPU内のすべてのレジスタ(SP:スタックポインタ、内部レジスタ値、PC:プログラムカウンタなど)の状態を他のメモリ空間に保存して、新しいスレッドに切り替える関数。
- スレッド環境をCPU環境にロードし、以前に保存した内部レジスタ値をCPUレジスタに復元する関数。
あなたが持っている
- オペレーティングシステムの1つである一連のプロセス
- すべてのプロセスには、動的に割り当てられたメモリ、静的データ、およびコードアセンブリを含むメモリスペースがあります。
- すべてのプロセスにはスレッドのリストがあります
- すべてのスレッドには、独自のレジスタセット、プログラムカウンタ、およびスタックがあります。
コンテキストスイッチを使用すると、スケジューラはスレッドデータを交換して、実行を別のスケジューラに渡します。
通常、プロセスはスレッドよりも重く、さまざまなスケジューリングアプローチが存在します。
- プログラムの内部(グリーンスレッド)でコンテキストスイッチを実行します(OSはそれを単一のプロセスと見なすため:ハードマルチコア)
- 多数の実際のプロセスを割り当ててハイブリッドアプローチを採用し、マルチコアの最適化を容易にすることができます。
プロセッサによっては、レジスタのセットは1つだけです。スレッドごとに1セットではありません。
すべてのレジスタの状態を保存して、スレッドが中断したところから再開できるようにする方法があります。
各スレッドには、レジスタのセット、CPUフラグ、スタックなどを含む独自のコンテキストがあります。