操作系统中的虚拟内存
虚拟内存是一种存储分配方案,其中辅助内存可以像主内存的一部分一样进行寻址。程序可能用来引用内存的地址与内存系统用来标识物理存储位置的地址不同,程序生成的地址会自动转换为相应的机器地址。
虚拟存储的大小受计算机系统寻址方案的限制,辅助存储器的可用量不受主存储位置的实际数量的限制。
这是一种使用硬件和软件来实现的技术。它将程序使用的内存地址(称为虚拟地址)映射到计算机内存中的物理地址。
- 进程内的所有内存引用都是在运行时动态转换为物理地址的逻辑地址。这意味着一个进程可以在主存中交换进出,这样它在执行过程中的不同时间占据主存中的不同位置。
- 一个进程可以被分成多个片段,并且这些片段在执行期间不需要连续地位于主存储器中。动态运行时地址转换和页表或段表的使用的组合允许这一点。
如果存在这些特征,则在执行期间不必所有页面或段都存在于主存储器中。这意味着需要时需要将所需的页面加载到内存中。虚拟内存是使用需求分页或需求分段实现的。
需求寻呼:
按需(无论何时发生页面错误)将页面加载到内存中的过程称为需求分页。
该过程包括以下步骤:
- 如果 CPU 尝试访问当前在主内存中不可用的页面,它会生成一个中断,指示内存访问错误。
- 操作系统将中断的进程置于阻塞状态。为了继续执行,操作系统必须将所需的页面放入内存中。
- 操作系统将在逻辑地址空间中搜索所需的页面。
- 所需的页面将从逻辑地址空间带到物理地址空间。页替换算法用于在物理地址空间中替换页的决策。
- 页表将相应地更新。
- 该信号将被发送到 CPU 以继续程序执行,它将使进程回到就绪状态。
因此,每当发生页面错误时,操作系统都会遵循这些步骤,并将所需的页面带入内存。
好处 :
- 更多的进程可能会保存在主内存中:因为我们将只加载任何特定进程的一些页面,所以有更多进程的空间。这导致更有效地利用处理器,因为更多进程中的至少一个进程更有可能在任何特定时间处于就绪状态。
- 一个进程可能比所有主内存都大:取消了编程中最基本的限制之一。由于需求分页,可以执行大于主内存的进程。操作系统本身根据需要在主内存中加载进程的页面。
- 通过为每个进程使用较少的可用(主)内存,它允许更高的多道程序级别。
缺页服务时间:
服务缺页错误所花费的时间称为缺页服务时间。缺页服务时间包括执行上述六个步骤所花费的时间。
Let Main memory access time is: m
Page fault service time is: s
Page fault rate is : p
Then, Effective memory access time = (p*s) + (1-p)*m
交换:
换出一个进程意味着从内存中删除它的所有页面,或者标记它们以便它们被正常的页面替换过程删除。挂起进程可确保它在换出时不可运行。稍后,系统会将进程从辅助存储器交换回主存储器。当进程忙于交换页面进出时,这种情况称为抖动。
颠簸:
在任何给定的时间,任何进程只有几页在主存中,因此可以在内存中维护更多进程。此外,因为未使用的页面不会交换进出内存,所以节省了时间。然而,操作系统必须很聪明地知道它如何管理这个方案。实际上在稳态下,所有的主内存都会被进程页占用,这样处理器和操作系统就可以直接访问尽可能多的进程。因此,当操作系统引入一页时,它必须抛出另一页。如果它在使用页面之前抛出一个页面,那么它几乎必须立即再次获取该页面。这太多会导致称为颠簸的情况。系统大部分时间都在交换页面而不是执行指令。所以需要一个好的页面替换算法。
在给定的图中,多道程序的初始程度达到一定程度的点(lambda),CPU 利用率非常高,系统资源利用率为 100%。但是如果我们进一步增加多道程序的程度,CPU利用率将急剧下降,系统将花费更多的时间只在页面替换上,并且完成进程执行所花费的时间会增加。系统中的这种情况称为颠簸。
抖动的原因:
- 高度的多道程序:如果内存中的进程数不断增加,则分配给每个进程的帧数将减少。因此,每个进程可用的帧数将减少。因此,页面错误会更频繁地发生,更多的 CPU 时间将浪费在换入和换出页面上,并且利用率将继续下降。
例如:
让自由帧 = 400
案例 1 :进程数 = 100
然后,每个进程将获得 4 帧。案例 2 :进程数 = 400
每个进程将获得 1 帧。
情况2是颠簸的情况,随着进程数量的增加,每个进程的帧数减少。因此,仅交换页面将消耗 CPU 时间。 - 缺乏帧:如果一个进程有更少的帧,那么该进程的更少页面将能够驻留在内存中,因此需要更频繁地换入和换出。这可能会导致颠簸。因此,必须为每个进程分配足够数量的帧以防止抖动。
颠簸的恢复:
- 不要通过指示长期调度程序不要在阈值之后将进程带入内存来让系统进入颠簸状态。
- 如果系统已经在颠簸,则指示中期计划暂停一些进程,以便我们可以从颠簸中恢复系统。