Linux kernel 在linux中,在两个进程之间切换上下文时会发生什么?

Linux kernel 在linux中,在两个进程之间切换上下文时会发生什么?,linux-kernel,operating-system,multiprocessing,Linux Kernel,Operating System,Multiprocessing,假设进程p1使用自己的地址空间(堆栈、堆、文本)执行。当发生上下文切换时,我知道在加载进程p2之前,所有当前cpu寄存器都被推入PCB。然后用p2地址映射刷新和加载TLB,并开始用自己的地址空间执行。 我想知道的是p1地址空间的状态。在加载进程之前,是否将其复制到磁盘并更新其页表p2?上下文切换的细节取决于底层硬件。然而,即使在不同的系统之间,上下文切换也基本相同 您的错误是“我知道在加载进程p2之前,所有当前cpu寄存器都被推入堆栈”。寄存器存储在通常称为进程上下文块(或PCB)的内存区域中,

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

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

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

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


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

这正是我想要的解释。谢谢对您的评论提出疑问“如果系统需要更多内存,它可能会被调出,但它可能会完全保留在内存中”。如果我理解正确,p1现在正在睡眠,p2正在执行,p1的地址空间只有在需要时才被交换。如果调出p1页,操作系统如何知道调出页属于进程p1,以及如何更新p1页表。操作系统维护一个空闲页数据库。当页面从P1的工作集中删除时,它们会被添加到空闲页面中。更新页表是释放过程的一部分。通常情况下,操作系统将保留“释放”的页面,这样,如果P1再次需要这些页面,并且这些页面还没有被使用,则可以通过更新页面表使这些页面再次有效,而无需读取磁盘。操作系统将进程分页,以便它知道它正在使用的是谁的页面。很抱歉,我仍然没有完全理解它。如果有空闲页面,为什么操作系统不能使用空闲页面而不是交换p1的页面。在任何时候,内存都可能包含多个进程的页面。仅使用物理内存地址,操作系统如何识别页面的所有者?当操作系统认为它需要内存时,通常的过程是识别可用于减少其物理内存的进程。然后它删除物理页面框架并声明它们。它并没有说“我需要3个页面框架。找到3个页面来删除。”它可能会删除比实际更多的页面框架。它知道页面的所有者,因为它正在从进程中删除页面框架;不声明页面框架,然后尝试确定它们属于哪个流程。抱歉重复提出问题。但仍然可能有多个进程在队列中等待。操作系统如何识别页面仍在内存中的正确进程。它会经历每个过程并检查它的页面是否在内存中吗?