2つのアセンブリプログラムを同時に実行したり、スレッドを使用したりすると、なぜこのようになるのでしょうか。
//program1
mov eax,1
add eax,50
program 2
xor eax,eax
add eax,eax
ram とは異なり、レジスターはどのプログラムからでもアクセスできるのに、これらのプログラムが互いに変更しないのはなぜですか? つまり、プログラム 1 命令 1 は、命令 1 コマンド 2 の後にある可能性があります。
オペレーティング システムは、異なるプログラムが互いのレジスタを混乱させないようにします。そうでなければ、どんな種類のマルチタスクも不可能です。
すべてのプログラム (そもそもアセンブリで書かれていないものも含む) は、常にレジスタを変更します。これが CPU の仕組みです。それを回避する方法はありません。タスクの切り替えは任意の 2 つのアセンブリ命令の間でいつでも発生する可能性があるため、OS は、プログラムが制御を取り戻したときに、レジスタの以前の値が復元されるようにします。レジスタは変数のようなものです。プログラム内の変数がランダムな瞬間に予期せず値を変更した場合、どう思いますか?
内部的には、OS がスレッドを作成するときに、CPU 内のすべてのレジスタを保持するのに十分な大きさのメモリ チャンクも割り当てます。タスクの切り替えが発生し、スレッドが制御を失うと、OS はそこにすべてのレジスタを保存します。スレッドが制御を取り戻すと、レジスターが復元されます。
OS カーネルに関する限り、異なるプログラム (プロセス) は異なるスレッドとして実行されます。各プロセスには、少なくとも 1 つのスレッド (メイン スレッド) があります。同じプログラムを 2 回実行しても、2 つの異なるプロセスと 2 つのスレッド (プロセスごとに 1 つずつ) になり、互いのレジスタを参照したり変更したりすることはありません。
同じプロセス内のスレッド間で情報を共有するために、メモリを使用できます。プロセス間で情報を共有するには、共有メモリまたはその他のプロセス間通信方法を使用できます。これらはすべて OS によって提供されます。CPU 自体には、マルチタスキング用の機能がほとんどありません。
マルチコア CPU では、各コアに独自のレジスタ セットがあります。コアが 1 つだけのマルチタスクでは、別のタスクまたはスレッドに切り替える前に、すべてのレジスタが保存されます。
ダーク