gpt4 book ai didi

linux - 在进程上下文切换的情况下,新进程的虚拟地址空间 (VAS) 是否已加载到 CPU 上下文(CPU 的寄存器)中?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:41 26 4
gpt4 key购买 nike

我已阅读:

Process switching is context switching from one process to a different process. It involves switching out all of the process abstractions and resources in favor of those belonging to a new process. Most notably and expensively, this means switching the memory address space. This includes memory addresses, mappings, page tables, and kernel resources—a relatively expensive operation.

还有:

A context is the contents of a CPU's registers and program counter at any point in time.

Context switching can be described in slightly more detail as the kernel (i.e., the core of the operating system) performing the following activities with regard to processes (including threads) on the CPU: (1) suspending the progression of one process and storing the CPU's state (i.e., the context) for that process somewhere in memory, (2) retrieving the context of the next process from memory and restoring it in the CPU's registers and (3) returning to the location indicated by the program counter (i.e., returning to the line of code at which the process was interrupted) in order to resume the process.

由于 VAS 对于每个进程都是独立的,并且最大可达 4GB,因此在上下文的情况下,进程的整个 VAS 是否加载到 CPU 上下文中进程切换?

另外,由于每个进程都有单独的页表,在上下文切换的情况下,页表是否也被带入 CPU 上下文?

如果不是,那么为什么进程上下文切换比线程上下文切换慢(线程共享相同的 VAS)?

最佳答案

As the VAS is separate for each process and can be of size upto 4GB,is the whole VAS of a process is loaded in the CPU context in case of context switch of the process ?

Also as each process has separate page table, does the page table is also bought in the CPU context in case of context switch ?

这些问题是相关的。您可以更改执行虚拟-> 线性转换的页表集,将一个虚拟地址空间换成另一个。这就是地址空间交换的完成方式。

让我们考虑一个非常简单的例子。

  • 假设我们有两个进程 PA 和 PB。两个进程都在虚拟地址 0x1000 处执行它们的程序镜像。
  • 进程不可见的是一组页表,它将虚拟地址空间映射到 RAM 的物理页面:
    • Pagetable TA 将虚拟地址 0x1000 映射到物理地址 0x88000
    • Pagetable TB 将虚拟 0x1000 映射到物理 0x99000。
  • 假设理论上的 CPU 有一个名为 PP 的寄存器(可分页指针)

进程初始化后,在两者之间“交换虚拟地址空间”就很简单了。要加载 PA 的地址空间,只需将 TA 的地址放入 PP 中,现在该进程“看到”了内存在 0x88000。同样,PB 的 TB 地址,因此他将“看到”0x99000 处的内存。

在(同一进程的)线程之间切换时,不需要更改虚拟地址空间(因为给定进程的所有线程共享相同的虚拟地址空间)。

当然还有其他东西也需要换入(比如 CPU 寄存器),但是对于这个讨论,我们只关心虚拟内存。

在 x86 CPU 上,CR3 寄存器是指向页表层次结构基址的指针。交换进程时,操作系统会更改此寄存器以更改地址空间。


当然,它比这更复杂。由于可能的虚拟地址空间非常大(x86-32 上为 4 GiB,x86-64 上为 16 exabytes),页表本身将占用大量空间(每 4 个条目一个条目) KiB 页)。为了缓解这种情况,将额外的间接级别添加到页表中,这就是为什么我将它们称为层次结构。在 x86-64 上,有 4 个级别。

现在想象一下,如果 CPU 必须为每个 虚拟到物理转换“遍历”这些分页结构。从虚拟内存中读取一次总共需要 5 次内存访问!这会非常慢。

输入 Translation lookaside buffer , 或 TLB。 TLB 缓存这些转换,因此给定的虚拟到物理转换只需要遍历页表一次。在那之后,TLB 会记住翻译,并且会快得多。 (当然 TLB 可以变满,但缓存逐出是另一回事)。

假设 PA 正在运行,突然间内核在地址空间中交换 PB。现在,所有这些缓存的虚拟到物理转换对于新的虚拟地址空间都不再有效!这意味着我们需要刷新 TLB,或者清除它的所有条目。因此,CPU 必须再次进行缓慢的页表遍历,直到 TLB 缓存再次“升温”。

就是交换虚拟地址空间被认为“昂贵”的原因。不是因为很难写入 CR3,而是因为我们每次写入时都会破坏 TLB。

关于linux - 在进程上下文切换的情况下,新进程的虚拟地址空间 (VAS) 是否已加载到 CPU 上下文(CPU 的寄存器)中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33798877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com