【问题标题】:How more than a one program uses the registers simultaneously without interrupting other programs on the windows OS? [duplicate]一个程序在不中断 Windows 操作系统上的其他程序的情况下同时使用寄存器的情况如何? [复制]
【发布时间】:2022-01-09 12:59:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果你有多个内核,你也有多个寄存器文件。这是多个程序实际同时运行的唯一方式。操作系统还执行多任务处理,即在线程之间调度内核,以便它们看起来同时运行。当 CPU 分配给一个新线程时,前一个的寄存器状态被保存并加载新的。这称为上下文切换。

标签: windows assembly operating-system cpu-registers context-switch


【解决方案1】:

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

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

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

MSDN 对 Windows 上的how context switching works 进行了粗略概述:

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

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

...

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

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

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

【讨论】:

  • 上下文切换有效地虚拟化了寄存器,因此每个任务(线程)都有自己的一组架构寄存器。就像虚拟内存如何为每个进程提供自己的地址空间一样。但是,是的,我们不叫它“虚拟寄存器”,我们只是说“那个线程的寄存器”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多