【问题标题】:Does Page fault means CPU blocked until the page is brought into RAM?页面错误是否意味着 CPU 在页面被放入 RAM 之前被阻塞?
【发布时间】:2020-11-16 11:40:58
【问题描述】:

当页面错误发生时,我不太确定哪些工作将由 CPU 完成,哪些将由操作系统完成。这就是我问以下问题的原因。

考虑一个单核 CPU,有多个进程在运行。当页面错误发生时,操作系统会尝试从磁盘获取所需的页面到 RAM,这将花费很长时间。在这段时间内,CPU 能否继续执行?还是 CPU 必须等到所需的页面加载到 RAM 中?

如果 CPU 可以在不等待所需页面的情况下继续执行,那么当进程过多时可能会发生抖动。在某些时候,CPU 执行的大部分指令都会导致页面错误,那么大部分时间将花费在等待 OS 将页面从磁盘加载到 RAM 上。这就是为什么会发生颠簸。请问我的理解是否正确?

提前致谢。


更新:website 很好地描述了颠簸。

【问题讨论】:

    标签: operating-system


    【解决方案1】:

    CPU 不知道它“处于”页面错误中。 CPU 不是递归的!

    当 32 位 x86 CPU(例如)遇到页面错误时,它的作用如下(稍微简化):

    • 将 CR2 的值设置为导致页面错误的地址。
    • 查看中断描述符表和其他一些表,找到页面错误处理程序(新 CS、新 EIP)和内核堆栈(新 SS、新 ESP)的地址。
    • 将 CS、EIP、SS 和 ESP 的值设置为刚刚读取的值。
    • 将旧 SS、旧 ESP、EFLAGS、旧 CS 和旧 EIP 推入堆栈。
    • 将 SS、ESP、EFLAGS、CS 和 EIP 寄存器推入该堆栈。
    • 更新标志以说明我们现在处于内核模式。

    仅此而已。现在,当内核想让 CPU 回到页面错误发生之前它正在做的事情时,内核会使用堆栈上的一些数据。但是内核没有义务使用这些数据。它可能会回到完全不同的地方,或者永远不会回去。这取决于内核。 CPU 不在乎。

    通常的内核会首先保存所有其他寄存器(很重要!),查看地址,决定从哪里获取页面,告诉磁盘开始获取页面,记下该进程因页面错误而停止,然后它将继续执行完全不同的操作,直到数据从磁盘返回。例如,它可能运行不同的进程。如果没有进程可以运行,它可能会关闭 CPU(是的,真的)。

    最终数据从磁盘返回,内核看到有一个进程由于页面错误而等待该数据,它更新页表以便进程可以看到数据,并重置所有寄存器,包括 SS、ESP、EFLAGS、CS 和 EIP。现在 CPU 正在做它之前所做的一切。

    要注意的关键点是:CPU 只关心其寄存器中的内容现在!它没有长期记忆。如果您将寄存器值保存在某处,您可以让它停止做它正在做的任何事情,并在稍后恢复它,就好像什么都没发生过一样。例如,绝对没有要求您必须按照它们发生的顺序从函数调用中返回。 CPU 并不关心您是否有一个返回两次的函数,例如(参见setjmp),或者如果您有两个协程并且在一个协程中调用yield 会导致yield 在另一个协程中返回。您不必像在 C 中那样按堆栈顺序执行操作。

    【讨论】:

      【解决方案2】:

      在cooperative multitasking OS 中,操作系统无法初始化上下文切换,因此 CPU 必须等待页面被引入。

      现代系统是preemptive multitasking systems。在这种情况下,操作系统很可能会启动上下文切换,因此其他线程/进程将在 CPU 上运行。

      当使用的内存量远远超过 RAM 的容量时,抖动是一个问题。 “下载更多内存”是一个梗是有原因的。

      【讨论】:

      • 对于抖动,您提到使用的内存量远远超过了 RAM 的容量。这里的内存是指虚拟内存吗?
      • @EthanL。是的___
      【解决方案3】:

      CPU 可以继续执行。

      但是,CPU 不能继续执行导致故障的线程。在执行下一条指令之前,该线程需要解决故障。也就是说,它必须在故障上阻塞。

      许多线程/进程可能在错误处理时被阻塞,这本身并没有颠簸。当为了引入页面而没有足够的空闲页面框架时,就会发生抖动,因此有必要将页面写出。但是,当操作系统试图找到另一个线程来运行时,它会选择拥有它刚刚写出的页面的线程,因此它必须重新输入该页面。

      因此,抖动是可用实内存不足的症状。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-05
        • 1970-01-01
        • 2011-03-22
        • 2013-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多