操作系统 需求分页和预分页是什么
根据虚拟内存的概念,在给定时间执行任何进程时,整个进程不需要加载到主内存中。只有一些页面在特定时间内存在于主内存中,进程才能高效执行。但是,问题在于在进程执行之前,我们如何决定加载哪些页面到主内存中。也就是说,特定时间应该有哪个页面存在于主内存中,哪个页面不应该在那里。
为了解决这个问题,在操作系统中引入了需求分页的概念。该概念表明,在需要之前我们不应该将任何页面加载到主内存中,或者保留所有页面在辅助存储器中,直到需要。相反,在预分页中,操作系统提前猜测进程将需要哪些页面,并将它们预先加载到内存中。
预分页的概念用于减少进程开始时产生的大量页面错误。基本策略是在进程引用这些页面之前,将所有将同时需要的页面都加载到内存中。
什么是操作系统中的需求分页
需求分页是虚拟内存系统中使用的一种技术,即只有在CPU需要时才将页面带入主内存。因此,它也被称为“懒交换程序”,因为只有在CPU需要时才进行页面交换。需求分页通常在虚拟内存中实现。
在需求分页中,分页器只将那些必要的页面带入内存中,而不是整个进程。因此,需求分页避免了读入不会使用的页面到内存中,从而减少了交换时间和所需的物理内存量。
需求分页是如何工作的
需求分页系统依赖于页面表实现,因为页面表帮助将逻辑内存映射到物理内存。位运算符在页面表中实现,用于指示页面是否正常(有效或无效)。所有有效页面都存在 主内存 中,无效页面存在 辅助存储器 中。现在所有进程都可以访问所有页面,然后会发生以下情况:
- 尝试当前访问页面。
- 如果页面是有效的,则所有处理指令都按照正常方式工作。
- 如果找到任何无效页面,则会出现页面故障问题。
- 现在确定内存引用在辅助存储器中是否存在有效引用。如果不存在,则进程终止,否则需要的页面将被分页进来。
- 现在实施磁盘操作,将所需页面抓取到 主内存 中。
需求分页的例子
假设我们要执行一个具有四个页面P0、P1、P2和P3的进程P。当前,在页面表中,我们有页面P1和P3。
- 如果CPU要访问进程P的页面P2,它将首先在页表中查找该页面。
- 由于页表中不包含该页面,因此会发生 陷阱 或 页面错误 。在陷阱生成并发生上下文切换后,控制权转移到操作系统。
- 操作系统将进程置于等待/阻塞状态。然后操作系统将在后备存储器或辅助内存中搜索该页面。
- 然后,操作系统将页面从后备存储器中读取并加载到主内存中。
- 接下来,操作系统将相应地更新页表项。
- 最后,控制权从操作系统中夺回,并恢复进程的执行。
因此,每当发生页面错误并且所需页面被引入内存时,操作系统都会按照这些步骤进行处理。
因此,每当发生页面错误时(如上述2到6步骤所示),服务页面错误所需的时间称为 页面错误服务时间 。
有效内存访问时间: 当在执行任何进程时,页面错误率为 ‘p’ 时,有效内存访问时间计算如下:
有效内存访问时间 = (p)(s) + (1-p)(m)
其中:
- p是页面错误率。
- s是页面错误服务时间。
- m是主内存访问时间。
注意:EAT与页面错误率成正比。
需求分页的优点
操作系统中需求分页的优点如下:
- 它增加了多道程序的程度,因为多个进程可以同时存在于主内存中。
- 内存的利用更加高效,因为可以使用该机制执行大小大于主内存大小的进程,因为我们不是一次加载整个页面。
- 我们有权进行 虚拟内存 的扩展。
- 如果程序大于物理内存,它可以帮助运行该程序而不需要压缩。
- 分区管理更简单。
- 在 分时系统 中更有用。
- 对多道程序 没有限制 。
- 消除了外部碎片。
- 容易交换所有页面。
需求分页的缺点
操作系统中需求分页的一些缺点如下:
- 处理页面错误时,处理器开销和使用的表数量大于简单页面管理技术。
- 它更容易出现内部碎片。
- 访问内存的时间较长。
- 页面表长度寄存器(PTLR)对虚拟内存有限制。
- 需要额外的内存和寄存器来存储页面映射表。
什么是操作系统中的预分页
预分页被用来克服请求分页的一个主要缺点。请求分页的一个主要缺点是在进程开始执行时可能会发生许多页面错误。这种情况是由于将初始局部性加载到内存中造成的,并且可能反复出现相同的情况。
举例来说,当一个进程在被换出后重新启动时,它的所有页面都保存在磁盘上,因此每个页面都必须通过它自己的页面错误最坏情况下被带回主存储器中以执行进程。
如果系统使用 工作集模型 ,则每个进程都在其工作集中维护一个页面列表。如果由于缺少空闲帧或I/O等待而暂停进程,则该进程的工作集不会丢失。当进程恢复后,在进程重新开始执行之前,整个工作集都会被重新加载到内存中。
上图显示,CPU只引用或需求了一页,但操作系统预先调入了另外三页。 预调 操作系统试图预测处理器下一个可能需要的页,并主动将该页调入主内存。
预调的主要优势在于,当进程引用连续地址时,它可能节省时间。在这种情况下,操作系统很容易猜测和加载适当的页面,并且由于对许多页面的猜测正确的可能性很高,所以会发生更少的页面错误。
预分页可能并不总是有益的。预分页的好处基于一个简单的问题的答案:实施预分页的成本是否小于处理相应页面错误的成本。可能存在这样一种情况,即通过预分页带回内存的页面数量相当大,但实际上并没有被使用。该概念的缺点在于,如果预加载的页面未被使用,会浪费时间和内存等资源。
预分页的优点
在操作系统中,预分页具有以下优点,例如:
- 当使用大量连续结构时,可以节省时间。考虑一个例子,其中进程请求连续地址。因此,在这种情况下,操作系统可以猜测下一个页面。如果猜测正确,将发生较少的页面错误,并且有效的内存访问时间将增加。
预分页的缺点
预分页还具有以下缺点,例如:
- 如果这些预分页的页面未被使用,则会浪费时间和内存。
需求分页和预分页的区别
在需求分页中,只有那些程序执行所需的页面被引入主内存。当程序需要其他页面时,它将从主内存中交换出未使用的页面,并交换所需的页面进来。因此,允许程序通过可用空间执行,而不需要将整个程序带入主内存。需求分页引发的问题之一是页面错误,即由于未在主内存中找到所需页面而引起的页面错误,需要进行页面交换。
在预分页中,会带入除了由页面错误需求的页面之外的其他页面。这样的页面选择是基于常见访问模式进行的,特别是对于二级储存设备。以下是需求分页和预分页之间的一些更多区别,例如:
需求分页 | 预先分页 |
---|---|
除非进程当前引用它,否则任何页面都不会加载到主存。 | 所有页面都会被加载到内存中,即使进程实际上并没有引用它们。 |
页面错误的数量非常高。 | 在某些特定情况下,页面错误的数量可能会减少。 |
加载页面所需的时间无论如何都不会减少。 | 当进程引用连续地址时,加载页面所需的时间会减少。 |
主存中加载的页面一定会被使用。 | 主存中加载的页面可能会被使用,也可能不被使用。 |
由于页面在需要时加载,没有资源浪费。 | 由于页面可能不会被使用,存在资源浪费的风险。 |