【问题标题】:what happens during context switch between two processes in linux?在linux中两个进程之间的上下文切换期间会发生什么?
【发布时间】:2017-04-18 14:50:44
【问题描述】:

假设进程p1 正在使用自己的地址空间(堆栈、堆、文本)执行。当上下文切换发生时,我知道在加载过程p2 之前,所有当前的 cpu 寄存器都被推入 PCB。然后 TLB 被刷新并加载p2 地址映射,并开始使用它自己的地址空间执行。 我想知道的是p1 地址空间的状态。是否会在加载进程p2之前复制到磁盘并更新其页表?

【问题讨论】:

    标签: linux-kernel operating-system multiprocessing


    【解决方案1】:

    上下文切换的细节取决于底层硬件。但是,即使在不同的系统之间,上下文切换也基本相同。

    您的错误是“我知道所有当前的 cpu 寄存器在加载进程 p2 之前都被推入堆栈”。寄存器存储在通常称为过程上下文块(或 PCB)的内存区域中,其结构由处理器定义。大多数处理器都有将进程上下文(即它的寄存器)加载和保存到这个结构中的指令。在 Intel 的情况下,由于所有不同的寄存器集(例如 FPU、MMX),这可能需要将多条指令保存到多个块中。

    传出进程不必写入磁盘。如果系统需要更多内存,它可能会被调出,但它可能会完全保留在内存中并准备好执行。

    上下文切换只是将一个处理器保存的寄存器值交换为另一个处理器。

    【讨论】:

    • 这正是我想要的解释。谢谢。关于您的评论的问题“如果系统需要更多内存,它可能会分页,但它有可能完全保留在内存中”。如果我理解正确,p1 现在正在休眠,p2 正在执行,p1 的地址空间仅在需要时才被换出。如果 p1 页面发生换出,操作系统如何知道换出的页面属于进程 p1 以及它将如何更新 p1 页表。
    • 操作系统维护一个空闲页面的数据库。当从 P1 的工作集中删除页面时,它们会被添加到空闲页面中。更新页表是释放过程的一部分。通常,操作系统将不理会“释放”的页面,这样,如果 P1 再次需要它们并且它们尚未被使用,则可以通过更新页表而不读取磁盘来使这些页面再次有效。操作系统页面出进程,因此它知道它正在提供谁的页面。
    • 对不起,我还是没完全明白。如果有空闲页面,为什么操作系统不能使用空闲页面而不是换出 p1 的页面。在任何时候,内存都可能保存多个进程的页面。操作系统如何仅使用物理内存地址来识别页面的所有者?
    • 当操作系统认为它需要内存时,正常的过程是识别它可以用来减少物理内存的进程。然后它删除物理页框并声明它们。它没有说“我需要 3 个页面框架。找到三个页面来摆脱。”它可能会摆脱比实际更多的页框。它知道页面的所有者,因为它正在从进程中删除页面框架;不声明页框,然后尝试识别它们属于哪个进程。
    • 抱歉重复提问。但是仍然可能有多个进程在队列中等待。操作系统如何识别页面仍在内存中的正确进程。它会遍历每个进程并检查它的页面是否在内存中?
    猜你喜欢
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多