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