上下文切换期间进程的物理内存内容发生了什么

What happens to the physical memory contents of a process during context switch

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

在上下文切换期间,进程 A 的页面 table 与进程 B 的页面 table 换出。

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

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

OS 可以通过多种方式处理问题中描述的场景,即如何有效地处理 运行 空闲 RAM 不足的问题。根据 CPU 体系结构和 OS 的目标,这里有一些处理此问题的方法。

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

如前所述,另一种方法是使用非易失性存储来保存无法放入 RAM 的页面。实际的具体实现可以根据系统的具体需求而有所不同。这里有一些可能的方式来直接回答 V1->P1 和 V2->P1 的映射如何存在。

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

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

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