我想知道为什么当你同时执行2个汇编程序或者他们使用线程时它会是这样的。
//program1
mov eax,1
add eax,50
program 2
xor eax,eax
add eax,eax
与ram不同的寄存器可以通过任何程序访问,因此这些程序不会如何访问 互相改变? 我的意思是程序1指令1可以在指令1命令2之后 救命啊!
答案 0 :(得分:1)
操作系统确保不同的程序不会混淆彼此的寄存器。否则,任何类型的多任务处理都是不可能的。
所有程序(即使不是首先用汇编编写的程序)也会不断更改寄存器。这就是CPU的运作方式;没有办法绕过它。由于任务切换可能在任何时刻发生 - 在任何两个汇编指令之间 - 操作系统确保当程序获得控制权时,恢复寄存器的先前值。寄存器就像变量 - 如果程序中的变量在随机时刻无法预测地改变了它们的价值,你会感觉如何?
在内部,当操作系统创建一个线程时,它还会分配一个内存块,大小足以容纳CPU中的所有寄存器。当任务切换发生且线程失去控制时,操作系统会将所有寄存器保存在那里。当线程重新获得控制权时,寄存器将被恢复。
就操作系统内核而言,不同的程序(进程)作为不同的线程运行。每个进程至少有一个线程 - 主线程。即使您运行相同的程序两次,您最终会得到两个不同的进程和两个线程,每个进程一个,并且他们不会看到或更改彼此的寄存器。
为了在同一进程中的线程之间共享信息,您可以使用内存。要在进程之间共享信息,可以使用共享内存或其他进程间通信方法。所有这些都是由操作系统提供的; CPU本身对多任务处理的准备很少。
答案 1 :(得分:0)
对于多核cpus,每个核心都有自己的一组寄存器。对于只有一个核心的多任务处理,在切换到另一个任务或线程之前,所有寄存器都将被保存。
德克