假设您有一台配置不错的计算机(运行 Windows),配有双核处理器,但您将其推向了极限。Windows 有可能在一两秒钟内完全检测不到任何输入吗?
我之所以问这个问题,是因为我知道,即使在 CPU 上有多个微处理器的计算机上,操作系统仍然会调度进程,以确保每个进程都能获得纳秒的处理能力。所以,如果处理器很忙,而你又不幸在处理器正在处理其他进程时试图移动鼠标,Windows 肯定无法检测到这种情况吧?
此外,对于单核处理器,如果操作系统具有调度进程的任务,那么如果进程没有告诉它,那么 CPU 如何知道在一个进程执行完成后返回操作系统?
答案1
通常,输入设备的工作方式是,当使用它们时,会产生中断 (IRQ)。(唯一不像这样的设备是旧式 PC 风格的游戏端口,我不确定操作系统如何处理它。)
IRQ 导致 CPU 核心立即跳转到另一个位置 -IRQ 处理程序然后需要保存CPU的状态,处理设备(例如捕获输入并通过任何OS机制报告),然后从中断返回。
IRQ 还会导致 CPU 核心禁用进一步的中断。因此,在短时间内,即使设备试图触发另一个中断,它也无法执行任何其他操作或再次被中断。PC 具有 APIC 硬件,该硬件大量参与控制、分配和管理中断,因此,请认为这是过于简单化的说法。(例如,我认为 APIC 可以记住在 CPU 处理一个 IRQ 时是否有另一个 IRQ 进入,并在 CPU 告诉 APIC“嘿,我处理完这个 IRQ 了”后立即在 CPU 端触发它。)
Windows 通过一种称为“延迟过程调用”的方式处理中断 - 它在这种“中断”状态下执行最少的操作以确认设备的请求,然后将剩余的处理交给负责的实际设备驱动程序,当调度程序认为方便或必要时,该设备驱动程序会处理这些处理。
因此,Windows 应该确认每个设备引起的 IRQ,除非由于驱动程序故障、设备故障或操作系统二进制文件严重损坏而导致某个中断状态。实际上导致 Windows 对设备请求执行一些有趣操作的 DPC 可能会被延迟。
操作系统强制进程放弃 CPU 的一般方法是使用硬件计时器,当计时器用完时,会产生 IRQ。IRQ 类型与上面描述的相同。IRQ 总是导致 CPU 切换到内核模式。因此,此时内核拥有控制权并可以切换到另一个进程。如果没有这种机制,您就完全依赖进程来告诉操作系统何时完成,这就是所谓的“协作式多任务处理”,而不是“抢占式多任务处理”。