让我们考虑进程A的虚拟地址V1-> P1(虚拟地址(V1)映射到物理地址(P1))。
在上下文切换期间,进程A的页表与进程B的页表交换出来。
让我们考虑进程B的虚拟地址V2-> P1((虚拟地址(V2)映射到物理地址(P1)),其内存区域中有自己的内容。
现在V1指向的物理内存内容发生了什么? 当上下文切换发生时,它是否保存在内存中?如果是这样,如果进程A写入的内容值或接近物理内存或RAM的大小,该怎么办?它会在哪里保存内容呢?
答案 0 :(得分:1)
操作系统有多种方法可以处理问题中描述的场景,即如何有效地处理空闲RAM的耗尽。根据CPU体系结构和操作系统的目标,这里有一些处理此问题的方法。
一种解决方案是在尝试malloc(或其他类似机制)并且没有可用的免费页面时简单地终止进程。这有效地避免了原始问题中提出的问题。从表面上看,这似乎是一个坏主意,但它具有简化内核代码和潜在加速上下文切换的优点。实际上,在某些应用程序中,如果运行的代码必须使用交换空间来容纳通过使用非易失性存储无法容纳到RAM中的页面,那么应用程序将会受到性能损失,系统无论如何都会有效地失败。或者,并非所有计算机都具有非易失性存储空间用于交换空间!
正如已经提到的,替代方案是使用非易失性存储来保存不适合RAM的页面。实际的具体实现可以根据系统的特定需求而变化。以下是一些直接回答如何存在V1-> P1和V2-> P1的映射的可能方法。
1 - 通常没有严格要求OS需要维持V1-> P1和V2-> P1映射。只要虚拟空间的内容保持不变,支持它的物理地址对于运行的程序是透明的。如果两个程序需要同时运行,则OS可以停止程序在V2中运行并将P1的内存移动到新区域,例如P2。然后将V2重新映射到P2并继续在V2中运行程序。假设当然存在可用的RAM。
2 - 操作系统可以简单地选择不将程序的完整虚拟地址空间映射到RAM支持的物理地址空间。假设并非所有的V1地址空间都直接映射到物理内存中。当V1中的程序遇到未标记的部分时,操作系统可以捕获由此触发的异常。如果可用RAM运行不足,则OS可以在非易失性存储中使用交换空间。 OS可以通过推送当前未使用的区域的一些物理地址来释放一些RAM来交换非易失性存储器中的空间(例如P1空间)。接下来,OS可以将请求的页面加载到释放的RAM中,设置虚拟到物理映射,然后将执行返回到V1中的程序。
这种方法的优点是OS可以分配更多的内存,然后它有RAM。另外,在许多情况下,程序倾向于重复访问小区域的存储器。因此,不将整个虚拟地址区域页面放入RAM可能不会导致大的性能损失。这种方法的主要缺点是代码更复杂,与RAM相比,上下文切换速度更慢,访问非易失性存储的速度非常慢。