【问题标题】:What happens to the physical memory contents of a process during context switch上下文切换期间进程的物理内存内容会发生什么变化
【发布时间】:2017-10-01 15:54:16
【问题描述】:

让我们考虑进程 A 的虚拟地址 V1->P1(虚拟地址(V1)映射到物理地址(P1))。

在上下文切换期间,进程 A 的页表与进程 B 的页表交换出来。

让我们考虑进程 B 的虚拟地址 V2->P1((虚拟地址(V2)映射到物理地址(P1))在该内存区域中具有自己的内容。

现在 V1 指向的物理内存内容发生了什么变化? 上下文切换发生时是否保存在内存中?如果是这样,如果进程 A 写入的内容值或接近可用物理内存或 RAM 的大小怎么办?那么它会将内容保存在哪里?

【问题讨论】:

  • 两个进程可以有相同的虚拟地址,但不能有相同的物理地址。进程 B 可以与进程 A 具有相同的虚拟地址,但物理地址会不同。

标签: memory-management operating-system context-switch


【解决方案1】:

操作系统可以通过多种方式处理问题中描述的场景,即如何有效地处理可用 RAM 不足的情况。根据 CPU 架构和操作系统的目标,这里有一些处理此问题的方法。

一种解决方案是在进程尝试 malloc(或其他类似机制)并且没有可用页面时简单地终止进程。这有效地避免了原始问题中提出的问题。从表面上看,这似乎是个坏主意,但它具有简化内核代码和可能加速上下文切换的优点。实际上,在某些应用程序中,如果运行的代码必须使用交换空间来容纳通过使用非易失性存储无法放入 RAM 的页面,那么应用程序将受到性能影响,以至于系统实际上无论如何都会失败。或者,并非所有计算机都具有可用于交换空间的非易失性存储!

正如已经提到的,替代方法是使用非易失性存储来保存无法放入 RAM 的页面。实际的具体实现可以根据系统的具体需求而变化。这里有一些可能的方法来直接回答 V1->P1 和 V2->P1 的映射如何存在。

1 - 对于操作系统需要维护 V1->P1 和 V2->P1 映射,通常没有严格的要求。只要虚拟空间的内容保持不变,支持它的物理地址对运行的程序是透明的。如果两个程序需要同时运行,操作系统可以停止在 V2 中运行的程序并将 P1 的内存移动到新的区域,比如 P2。然后将 V2 重新映射到 P2 并继续运行 V2 中的程序。当然,这假设存在用于映射的空闲 RAM。

2 - 操作系统可以简单地选择不将程序的完整虚拟地址空间映射到 RAM 支持的物理地址空间。假设不是所有的 V1 地址空间都直接映射到物理内存中。当 V1 中的程序遇到未分页的部分时,操作系统可以捕获由此触发的异常。如果可用 RAM 不足,则操作系统可以使用非易失性存储中的交换空间。操作系统可以通过将当前未使用的区域的一些物理地址推送到非易失性存储中的交换空间(例如 P1 空间)来释放一些 RAM。接下来,操作系统可以将请求的页面加载到释放的 RAM 中,设置虚拟到物理的映射,然后将执行返回给 V1 中的程序。

这种方法的优点是操作系统可以分配比 RAM 更多的内存。此外,在许多情况下,程序往往会重复访问一小块内存区域。因此,没有将整个虚拟地址区域页面放入 RAM 可能不会导致那么大的性能损失。这种方法的主要缺点是代码更复杂,可以使上下文切换更慢,并且与 RAM 相比,访问非易失性存储非常慢。

【讨论】:

  • "对于操作系统需要维护一个 V1->P1 和 V2->P1 映射通常没有严格的要求。" - 你能真正命名一个为同一物理地址维护不同虚拟地址的操作系统吗?
  • 我的经验主要是使用 VxWorks,VxWorks 会将前 8Gb 的物理地址空间映射到单个大型虚拟映射。然后它还将设置单独的较小的虚拟到物理映射,从而导致两个虚拟地址映射到同一个物理。我需要更多两个或更多虚拟地址来映射到同一个物理地址还有其他一些原因。
  • @babon 除非我不关注,否则每次你分叉一个进程时都会发生这种情况,假设操作系统正在执行写时复制?当你 fork 一个进程时,两个进程的页表都会将大多数虚拟地址指向相同的物理地址,直到其中一个写入共享物理空间之一。
猜你喜欢
  • 2014-08-25
  • 2017-04-18
  • 2015-05-04
  • 2017-09-28
  • 2020-07-14
  • 2017-08-22
  • 2023-03-14
  • 2015-09-25
相关资源
最近更新 更多