繁体   English   中英

windows OS 上的多个程序同时使用寄存器而不中断其他程序的情况如何?

[英]How more than a one program uses the registers simultaneously without interrupting other programs on the windows OS?

我一直想知道同时运行的多个程序如何使用 CPU 寄存器而不会导致 Windows 操作系统上的程序之间发生冲突。

Windows 操作系统是否使用“虚拟寄存器”来避免这种情况(多个程序同时使用相同的寄存器)?

因此,例如,如果两个程序使用eax寄存器,操作系统真的会改变物理eax寄存器吗?

还是像我上面提到的那样使用一些“虚拟寄存器”?

操作系统不使用虚拟寄存器,改变了物理寄存器。

在过去,机器只有一个 CPU 内核,并且在任何时间点实际上只有一个线程在运行。 每次在不同的线程可以开始运行操作系统之前,kernel 将保存旧线程的 state(寄存器)并在新线程继续之前恢复新线程的 state。 这称为上下文切换。 切换发生在 kernel 模式下,如果它切换到的线程位于不同的进程中,它还必须更改虚拟 memory 映射。

在具有多个内核的系统上,多个线程可以同时运行,并且每个内核都有自己的一组寄存器。

MSDN 粗略概述了上下文切换在 Windows 上的工作原理:

调度程序为每个优先级维护一个可执行线程队列。 这些被称为就绪线程。 当处理器可用时,系统会执行上下文切换。 上下文切换的步骤是:

  • 保存刚刚完成执行的线程的上下文。
  • 将刚刚执行完毕的线程放在队列的末尾,以获得它的优先级。
  • 找到包含就绪线程的最高优先级队列。
  • 移除队列头部的线程,加载它的上下文,然后执行它。

...

上下文切换的最常见原因是:

  • 时间片已过。
  • 具有更高优先级的线程已准备好运行。
  • 正在运行的线程需要等待。

如果您的程序在抢占式多任务操作系统上运行,那么您不必考虑上下文切换的发生方式和原因,您可以假装始终控制寄存器并且您的程序是唯一运行的程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM