【问题标题】:What memory "state" does the kernel have to save between context switches?内核必须在上下文切换之间保存什么内存“状态”?
【发布时间】:2015-09-25 05:38:28
【问题描述】:

我目前正在阅读How Linux Works: What Every Superuser Should Know,我阅读了以下关于上下文切换的内容:

  1. CPU(实际的硬件)基于一个内部的 tinier 中断当前进程,切换到内核模式,并手动控制 回到内核。
  2. 内核记录 CPU 和内存的当前状态,这对于恢复刚刚中断的进程至关重要。
  3. 内核执行之前时间片中可能出现的任何任务(例如从输入和输出中收集数据, 或 I/O、操作)。
  4. 内核现在已准备好让另一个进程运行。内核分析准备运行的进程列表并选择一个。
  5. 内核为这个新进程准备内存,然后准备 CPU。
  6. 内核告诉 CPU 新进程的时间片将持续多长时间。
  7. 内核将 CPU 切换到用户模式,并将 CPU 的控制权交给进程。

我了解需要从 CPU 的状态(寄存器值等)中保存哪些内容,但我不了解需要管理哪些内存。进程不是有自己的内存块,应该不受上下文切换的影响吗?

内核在上下文切换之间需要保存哪些内存?

【问题讨论】:

  • 我认为这完全不正确。在任务切换时,内核会记录 CPU 的状态(根据处理器寄存器和标志)。进程的内存不需要这样保存,因为它与分配给其他进程的内存是分开的。也许它正在谈论内存映射(即活动的逻辑到物理地址的映射)。
  • 第 6 步也像是胡扯:内核不需要告诉 CPU 时间片将持续多长时间;相反,它使用一个定时器(它可能是也可能不是 CPU 的一部分)周期性地产生一个中断,这决定了时间片将持续多长时间。同样在第 1 步中,timer(在您的帖子中写为 tinier)不需要是 CPU 的一部分。

标签: linux memory-management linux-kernel


【解决方案1】:

在具有内存管理单元 (MMU) 的处理器上,在与内存相关的任务切换期间发生的主要事情是告诉 MMU 使用不同的虚拟地址空间。这是假设目标任务具有不同的地址空间,即任务是不同的进程,而不是同一进程中的不同线程。例如在 32 位 x86 上,控制寄存器 3 (CR3) 包含页目录表的物理地址。在任务切换到不同进程期间,目标进程的相应 CR3 值被加载到 CR3 中,因此所有进一步的虚拟内存访问都使用新的地址空间。

内存本身通常不会以任何方式保存,因为 MMU 用于保护页面,因此一个进程通常无法访问另一个进程内存。我之所以这么说,是因为在少数情况下这是允许的,但与这个问题无关。

在内存受限的系统中,当需要更多虚拟内存并且没有更多可用物理内存时,可以将内存页面存储到辅助存储(例如硬盘驱动器),但这通常不会在上下文中完成切换(尽管可以),而是根据需求进行。无论哪种方式,将内存存储到辅助存储都不是上下文切换的重要部分。

因此,关于以下陈述的结论

内核记录 CPU 和内存的当前状态,这对于恢复刚刚中断的进程至关重要。

如果通过“内存”语句指的是控制虚拟地址到物理地址转换的 MMU 状态,那么在上下文切换期间可以保存。我说可能是因为通常流程的 CR3 值不会改变,所以没有理由保存它,因为它是已知的。如果该语句指的是任务正在使用的实际内存,那么它是错误的。

最后关于以下声明:

内核为这个新进程准备内存,然后准备 CPU。

再次,如果“为新进程准备内存”意味着设置 MMU 以使用新的虚拟到物理地址转换,那么是的,这确实发生在上下文切换期间。如果这意味着它从某个地方为新进程加载内存,这不需要发生,这要感谢 MMU。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多