暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

详解操作系统的虚拟内存

海人为记 2021-08-25
1038

多道程序并发执行不仅使进程之间共享了处理器,而且同时共享了主存。但随着对处理器需求的增长,进程的执行速度会以某种合理平滑的方式慢下来。但是,若太多进程需要许多的内存时,其中的程序会因为没有内存空间可用而无法运行。所以,在物理上扩充内存有限的情况下,现代操作系统提供了虚拟内存的抽象概念,用以在逻辑上扩充内存。

虚拟内存为每个程序提供了一个大的、一致的和私有的地址空间,并分割成多个块,每一块称作一页或页面。每一页有连续的地址范围,并被映射到物理内存,但并不是所有页都必须在内存中才能运行。当程序引用到一部分在物理内存中的地址空间时,有硬件立刻执行必要的映射。当程序引用不在物理内存中的地址空间时,由操作系统负责引入缺失部分并执行。虚拟内存还为每个进程的地址空间提供保护不被其他进程破坏。

之所以叫虚拟内存,是因为内存并不存在,只是由于系统提供了部分装入、请求调入和置换功能后,给用户感觉是存在一个比实际物理内存要大的多的存储器。虚拟内存的大小由计算机的地址结构决定,并不是内存和外存的简单相加。虚拟内存主要有三个主要特征,如下所示。

  1. 多次性。指无需一次性地将程序全部装入内存,而允许多次调入内存运行。
  2. 对换性。指无需一直常驻内存,允许程序在运行过程中换进换出。
  3. 虚拟性。指逻辑上扩充了内存容量,使用户看到的内存容量远大于实际内存容量。

局部性原理

局部性原理既适用于程序结构,又适用于数据结构,其主要表现在以下两个方面。

  1. 时间局部性。程序中的某指令一旦执行,不久后就可能再次执行;某数据被访问过,不久后可能再次被访问。产生时间局部性的典型原因是程序中存在大量的循环操作。
  2. 空间局部性。一旦程序访问某存储单元,不久后,其附近的存储单元也将被访问。即程序在一段时间内所访问的地址,可能集中在一定的范围之内,因为指令通常是顺序存放、顺序执行,数据也一般是以向量、数组、表等形式簇聚存储的。

时间局部性通过将近来使用的指令和数据保存到高速缓冲存储器中,并使用高速缓存的层次结构实现。空间局部性通常使用较大的高速缓存,并将预取机制集成到高速缓存控制逻辑中实现。虚拟内存技术实际上建立了 “内存-外存” 的两级存储器结构,利用局部性原理实现高速缓存。

虚拟内存实现

虚拟内存技术允许将一个程序分多次调入内存。采用连续分配方式时,必须一次性申请足以容纳程序的内存空间,以便能将该程序分先后地多次装入内存,但会有一部分内存空间都处于暂时或永久的空闲状态,造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。所以,虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。

虚拟内存空间的大小要同时满足两个条件,光满足一个是不行的,如下所示。

  • 虚存的大小 内存容量和外存容量之和,这是硬件的硬性条件规定的,若虚拟大小超过了这个容量,则没有相应的空间来供虚存使用。
  • 虚存的大小 计算机的地址位数能容量的最大容量。假设地址是 32 位的,按字节编址,一个地址代表 1B 存储空间,则虚存的大小 4GB = 。这是因为若虚存的大小超过 4GB,则 32 位的地址将无法访问全部虚存,也就是说 4GB 以后的空间被浪费了,相当于没有一样,没有任何意义。

虚拟内存使用外存上的空间来扩充内存空间,通过一定的换入/换出,使得整个系统在逻辑上能够使用一个远远超出其物理内存大小的内存容量。因为虚拟内存技术调换页面时需要访问外存,会导致平均访存时间下降,若使用了不合适的替换算法,则会大大降低系统性能。

虚拟内存的实现有请求分页存储管理方式、请求分段存储管理方式和请求段页式存储管理方式。但不管哪种方式,都需要有一定的硬件支持,如下所示。

  • 一定容量的内存和外存。
  • 页表机制或段表机制,以及数据结构。
  • 中断机构,当用户程序要访问的部分尚未调入内存时,则产生中断。
  • 地址变换机构,逻辑地址到物理地址的变换。

请求分页存储

请求分页存储是在分页存储的基础上,为了虚拟内存功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟内存的方法。

在请求分页中,允许将程序当前所需要的部分装入内存即可启动运行。执行过程中,通过调页功能把所要访问且不再内存中的页面调入内存,同时通过页面置换功能将暂时不运行的页面置换到外存上,以便腾出内存空间。

为了实现请求分页,系统必须提供必要的硬件支持。除了需要一定容量的内存和外存外,还需要有请求页表机制、缺页中断机构以及地址变换机构。

请求页表机制

请求分页存储中的请求页表数据结构,除了将用户地址空间中的逻辑地址映射为内存空间中的物理地址的作用的页号和物理块号两个字段外,还增加了四个字段,用于满足页面换进换出的需求,如下图所示。

增加的 4 个字段说明如下所示。

  • 状态位 P。用于指示该页是否已调入内存,供程序访问时参考。
  • 访问字段 A。用于记录本页在一段时间内被访问的次数,或记录本页最近已有多长时间未被访问,供置换算法换出页面时参考。
  • 修改位 M。标识该页在调入内存后是否被修改过,供置换页面时参考。只有修改过的页会重新写到外存上,以保证外存中保留的始终最新。
  • 外存地址。用于指出该页在外存上的地址,通常是物理块号,供调入该页时参考。

缺页中断机构

在请求分页存储中,每当所要访问的页面不在内存中时,便产生一个缺页中断,请求操作系统将所缺的页调入内存。此时应将缺页的进程阻塞,调页完成再唤醒,若内存中有空闲块,则分配一个块,将要调入的也装入该块,并修改页表中的相应页表项,若此时内存中没有空闲块,则要淘汰某页;若被淘汰页在内存期间被修改过,则要将其写回外存。

缺页中断作为中断,同样要经历诸如保护 CPU 环境、分析中断原因、转入缺页中断处理程序、恢复 CPU 环境等几个步骤。但与一般的中断相比,它有以下两个明显的区别:

  • 在指令执行期间产生和处理中断信号,而并非一条指令执行完,属于内部中断。
  • 一条指令在执行期间,可能产生多次缺页中断。

地址变换机构

请求分页存储的地址变换机构是在分页存储的地址变换机构的基础上,为实现虚拟内存,再增加了某些功能而形成的。请求分页存储的地址变换过程如下图所示。

在进行地址变换时,先检索快表,如下所示。

  • 若找到要访问的页,便修改页表项中的访问位,对于写指令还需要重置修改位,然后利用页表项中给出的物理块号和页内地址形成物理地址。
  • 若未找到该页的页表项,则应到内存中去查找页表,在对比页表项中的状态位 P,看该页是否已调入内存,未调入则产生缺页中断,请求从外存把该页调入内存。

请求分段存储

请求分段存储是在分段存储的基础上,为了虚拟内存功能而增加了请求调段和分段置换功能。

在请求分段中,允许将程序当前所需要的部分分段装入内存即可启动运行。之后以分段为单位,通过调段功能和段的置换功能将暂不运行的段调出,将所缺的段调入内存运行。

为了实现请求分段存储管理,系统必须提供必要的硬件支持。除了所需一定容量的内存和外存外,还需要有段表机制、缺段中断机构以及地址变换机构。

请求分段机制

请求分段存储中的请求段表数据结构,除了具有请求分页机制中存在的访问字段 A、修改位 M、存在位 P 和外存始址四个字段外,还增加了存取方式和增补位,供程序在调进调出时参考。如下图所示。

增加的字段说明如下所示。

  • 存取方式。应用程序中的段是信息的逻辑单位,根据信息的属性对它实施保护,故在段表中增加存取方式字段,如果该字段为两位,则存取属性是只执行、只读和允许读写。
  • 访问字段 A。用于记录该段被访问的频繁度。提供给置换算法选择换出页面时参考。
  • 修改位 M。用于表示该页在进入内存后是否已被修改过,供置换页面时参考。
  • 存在位 P。用于指示本段是否已调入内存,供程序访问时参考。
  • 增补位。请求分段存储中所特有的字段,用于表示本段在运行过程中是否做过动态增长。
  • 外存始址。指示本段在外存中的始址地址。

缺段中断机构

请求分段存储中采用的是请求调段策略。每当发现运行进程所要访问的段尚未调入内存时,便由缺段中断机构产生一缺段中断信号,进入操作系统后,由缺段中断处理程序将所需的段调入内存。与缺页中断机构类似,缺段中断机构需要在一条指令的执行期间产生和处理中断,以及在一条指令执行期间,可能产生多次缺段中断。但由于分段是信息的逻辑单位,因而不可能出现一条指令被分割在两个分段中,和一组信息被分割在两个分段中的情况。缺段中断的处理过程如下图所示。由于段不是定长的,这使对缺段中断的处理要比对缺页中断的处理复杂。

地址变换机构

请求分段存储的地址变换机构是在分段存储地址变换机构的基础上,为实现虚拟内存,又增加了某些功能而形成的。请求分段存储的地址变换过程如下图所示。

被访问的段并非全在内存,在地址变换时,若发现所要访问的段不在内存,先将所缺的段调入内存,并修改段表,然后利用段表进行地址变换。

分段共享

在系统中配置一张共享段表实现分段共享,所有各共享段都在共享段表中占有一表项。在表项的上面记录了共享端的段号、段长、内存始址、状态位、外存始址以及共享计数等信息。共享段表如下图所示。

各项说明如下所示。

  • 共享进程计数 count。共享段为多个进程所需要,设置共享进程计数 count 记录多少进程正在共享该分段。当不需要并且释放时,会先检查 count ,不为 0,表示还有进程需要,仅当所有共享段的进程不再需要时,此时 count 为 0,才回收该段所占内存区。
  • 存取控制。为不同的进程赋予不同的存取权限。
  • 段号。不同的进程具有不同的段号,每个进程可用自己进程的段号去访问共享段。

共享段供多个进程共享,一次内存分配方法与非共享段不同。共享段分配内存时,第一个请求使用该共享段的进程,由系统为共享段分配物理区,再把共享段调入该区,同时将该区始址填入请求进程的段表的相应项中,还需在共享段表中增加一表项,填写请求使用该共享段的进程名、段号和存取控制等有关数据,把 count 置为 1。当之后的进程需要调用该共享段时,只需在调用进程的段表中增加一表项,填写该共享段的物理地址。在共享段的段表中增加一个表项,填上调用进程的进程名、该共享段在本进程中的段号、存取控制等,再执行 count=count+1 操作,以表明有增加一个进程共享该段。

当共享此段的某进程不再需要该段时,执行撤销在该进程段表中共享段所对应的表项,及执行count = count - 1 操作,并释放该段。当 count = 0 时,则回收该共享段的物理内存,以及取消在共享段表中该段所对应的表项,表明此时已没有进程使用该段;若不为 0,则只取消调用者进程在共享段表中的有关记录即可。

分段保护

分段存储中的每个分段在逻辑上是相对独立的,比较容易实现信息保护,常采用以下几种措施。

  • 越界检查。地址变化机构中设置段表寄存器,用于存放段表始址和段表长度,进行地址变化时,将逻辑地址空间的段号与段表长度进行比较,如果段号大于段长,将发出地址越界中断信号。此外,还在段表中为每个段设置段长,进行地址变化时,检查段内地址是否大于段长,若大于,将产生地址越界中断信号,从而保证每个进程只能在自己的地址空间内运行。

  • 存储控制检查。以段为基本单位进行,在段表的每个表项设置一个存取控制字段,用于规定对该段的访问方式。通常有以下几种访问方式:

    • 只读,只允许进行对该段中的程序或数据进行读访问。
    • 只执行,只允许进程调用该段去执行,但不准读该段的内容,更不允许对该段执行写操作。
    • 读写,允许进程对该段进行读写访问。
  • 环保护机构。低编号环具有高优先权。操作系统核心处于 0 号环内;某些重要的使用程序和操作系统服务占居中间环;而一般的应用程序,则被安全在外环上。在环系统中,程序的访问和调用应遵循以下规则:

    • 一个程序可以访问驻留在相同环或较低特权环中的数据,较低特权环为外环。
    • 一个程序可以调用驻留在相同环或较高特权环中的服务,较高特权环为内环。

存取控制对于共享段尤为重要,可以对不同的进程赋予不同的读写权限。既保证信息的安全性,又满足运行需要。

请求分页的内存分配

对于分页式的虚拟内存,在进程准备执行时,不需要也不可能把一个进程的所有页都读入主存。因此,操作系统必须决定读取多少页,即决定给特定的进程分配几个页框。给一个进程分配的物理页框的集合就是这个进程的 驻留集。需要考虑以下几点:

  1. 分配给一个进程的存储量越小,任何时候驻留在主存中的进程数就越多,从而可以提高处理器的时间利用效率。
  2. 若一个进程在主存中的页数过少,则尽管有局部性原理,页错误率仍然会相对较高。
  3. 若页数过多,则由于局部性原理,给特定的进程分配更多的主存空间对该进程的错误率没有明显的影响。

内存分配策略

基于这些因素,现代操作系统通常采用三级策略:

  1. 固定分配局部置换。为每个进程分配一组固定数目的物理块,在运行期间都不再改变。若进程在运行中发生缺页,使用局部置换从该进程在内存中的 n 个页面中选出一页换出,然后调入需要的页面。实现这种策略时,难以确定应为每个进程分配的物理块数目:太少会频繁出现缺页中断,太多又会使 CPU 和其他资源利用率下降。
  2. 可变分配全局置换。这是最易于实现的物理块分配和置换策略,它为系统中的每个进程分配一定数目的物理块,操作系统自身也保持一个空闲物理块队列。当某进程发生缺页时,系统从空闲物理块队列中取出一个物理块分配给该进程,并将预调入的也装入其中。这种方法比固定分配局部置换更加灵活,可以动态增加进程的物理块,但也存在弊端,如它会盲目地给进程增加物理块,从而导致系统多道程序的并发能力下降。
  3. 可变分配局部置换。它为每个进程分配一定数目的物理块,当某个进程发生缺页时,只允许从该进程在内存的页面中选出一页换出,因此不会影响其他进程的运行。若进程在运行中频繁地缺页,则系统再为该进程分配若干物理块,直至该进程缺页率趋于适当程度;反之,若进程运行中的缺页率特别低,则可适当减少分配给该进程的物理块。比起可变分配全局置换,这种方法不仅可以动态增加进程物理块的数量,还能动态减少进程物理块的数量,在保证进程不会过多地调页的同时,也保持了系统的多道程序并发能力。当然它需要更复杂的实现,也需要更大的开销,但对比频繁地换入换出所浪费的计算机资源,是值得牺牲的。

页面调入策略

为确定系统将进程运行时所缺的 页面调入内存 的时机,可采取以下两种调页策略:

  1. 预调页策略。根据局部性原理,一次调入若干相邻的页可能会比一次调入一页更高效。但若调入的一批页面中大多数都未被访问,则又是低效的。因此,需要采用以预测为级别的预调页策略,将预计在不久之后便会被访问的页面预先调入内存。但目前预调页的成功率仅约 50%。故这种策略主要用于进程的首次调入,由程序员指出应先调入哪些页。其次在采用工作集的系统中,每个进程都具有一张记录有运行时的工作集的表,每当程序被调度运行时,将工作集中的所有页调入内存。
  2. 请求调页策略。进程在运行中需要访问的页面不在内存而提出请求,由操作系统将所需页面调入内存。由请求调页策略调入的页一定会被访问,且这种策略比较易于实现,故在目前的虚拟内存中大多采用此策略。它的缺点是每次仅调入一页,调入调出页面数多时会花费过多的 I/O 开销。

预调入实际上就是运行前的调入,请求调页实际上就是运行期间调入。一般情况下,两种调页策略会同时使用。

请求分页存储中的外存又分为用于存放文件的文件区
和用于存放对换页面的对换区
两部分。对换区通常采用连续分配方式,而文件区采用离散分配方式,故对换区的数据存取速度比文件区的更快。这样,每当发生缺页请求时,从何处调入页面就存在三种情况:

  1. 系统拥有足够的对换区空间。可以全部从对换区调入所需页面,以提高调页速度。为此,在进程运行前,需将与该进程有关的文件从文件区拷贝到对换区。
  2. 系统缺少足够的对换区空间。凡不会被修改的文件都直接从文件区调入,而当换出这些页面时,由于它们未被修改而不必再将它们换出。但对于那些可能被修改的部分,在将它们换出时须调到对换区,以后需要时再从对换区调入。
  3. UNIX 方式。与进程有关的文件都放在文件区,故未运行过的页面都应从文件区调入。曾经运行过但又被换出的页面,由于放在对换区,因此下次调入时应从对换区调入。进程请求的共享页面若被其他进程调入内存,则无须再从对换区调入。

页面置换算法

进程运行时,若其访问的页面不在内存中而需要将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。

选择调出页面的算法就称为 页面置换算法。好的页面置换算法应具有较低的页面更换频率,也就是说,应将以后不会再访问或以后较长时间内不会再访问的页面先调出。常见的置换算法有以下几种。

最佳置换算法

最佳(Optimal,OPT)置换算法选择的被淘汰页面将是以后永不使用的,或是在最长时间内不再被访问的页面,以便保证获得最低的缺页率。然而,由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因而该算法无法实现,但可以用来评价其他算法。

假定系统为某进程分配了三个物理块,并考虑有页面号引用串 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1。进程运行时,先将 7,0,1 三个页面依次装入内存。进程要访问页面 2 时,产生缺页中断,根据最佳置换算法,选择将第 18 次访问才需调入的页面 7 淘汰。然后,访问页面 0 时,因为它已在内存中,所以不必产生缺页中断,访问页面 3 时,又会根据最佳置换算法将页面 1 淘汰 ······ 依次类推,如下图所示,从图中可以看出采用最佳置换算法时的情况。

可以看到,发生缺页中断的次数为 9,页面置换的次数为 6。

先进先出页面置换算法

先进先出(FIFO)页面置换算法优先淘汰最早进入内存的页面,即在内存中驻留时间最久的页面。该算法实现简单,只需把调入内存的页面根据先后次序链接成队列,设置一个指针总指向最早的页面。但该算法与进程实际运行时的规律不适应,因为在进程中,有的页面经常被访问,如含有全局变量、常用函数、例程等的页面,先进先出算法并不能保证这些页面不被淘汰。

这里仍用上面的实例采用 FIFO 算法进行页面置换。进程访问页面 2 时,把最早进入内存的页面 7 换出。然后访问页面 3 时,把 2,0,1 中最先进入内存的页面 0 换出。由下图可以看出,利用 FIFO 算法时进行了 12 次页面置换,比最佳置换算法正好多一倍。

FIFO 算法还会产生所分配的物理块数增大而页故障数不减反增的异常现象,这由 Belady 于 1969 年发现,故称为 Belady 异常。只有 FIFO 算法可能出现 Belady 异常,LRU 和 OPT 算法永远不会出现 Belady 异常。

如下图所示,页面访问顺序为 3,2,1,0,3,2,4,3,2,1,0,4。若采用 FIFO 置换算法,当分配的物理块为 3 个时,缺页次数为 9 次:当分配的物理块为 4 个时,缺页次数为 10 次。分配给进程的物理块增多,但缺页次数不增反减。

最近最久未使用置换算法

最近最久未使用(LRU)置换算法是选择最近最长时间未访问过的页面予以淘汰,它认为过去一段时间内未访问过的页面,在最近的将来可能也不会被访问。该算法为每个页面设置一个访问字段,来记录页面自上次被访问以来所经历的时间,淘汰页面时选择现有页面中值最大的予以淘汰。

再对上面的实例采用 LRU 算法进行页面置换,如下图所示。进程第一次对页面 2 访问时,将最近最久未被访问的页面 7 置换出去。然后在访问页面 3 时,将最近最久未使用的页面 1 换出。

在上图中,前 5 次置换的情况与最佳置换算法相同,但两种算法并无必然联系。实际上,LRU 算法根据各页以前的情况,是向前看
的,而最佳置换算法则根据各页以后的使用情况,是向后看
的。

LRU 算法的性能较好,但需要寄存器和栈的硬件支持。LRU 是堆栈类的算法,理论上可以证明,堆栈类算法不可能出现 Belady 异常。FIFO 算法基于队列实现,不是堆栈类算法。

时钟置换算法

LRU 算法的性能接近于 OPT 算法,但实现起来比较困难,且开销大;FIFO 算法实现简单,但性能差。因此,操作系统的设计者尝试了很多算法,试图用比较小的开销接近 LRU 算法的性能,这类算法都是时钟(Clock)置换算法的变体。因为算法要循环扫描缓冲区,像时钟的指针一样转动,所以称为时钟(Clock)置换算法。

简单的 Clock 算法给每帧关联一个附加位,称为使用位。当某页首次装入主存时,将该帧的使用位设置为 1;当该页随后再被访问到时,其使用位也被置为 1。对于页替换算法,用于替换的候选帧集合可视为一个循环缓冲区,并有一个指针与之相关联。当某一页被替换时,该指针被设置成指向缓冲区中的下一帧。当需要替换一页时,操作系统扫描缓冲区,以查找使用位被置为 0 的一帧。每当遇到一个使用位为 1 的帧时,操作系统就将该位重新置为 0;若在这个过程开始时,缓冲区中所有帧的使用位均为 0,则选择遇到的第一个帧替换;若所有帧的使用位均为 1,则指针在缓冲区中完整地循环一周,把所有使用位都置为 0,并停留在最初的位置上,替换该帧中的页。由于该算法循环检查个页面的情况,故称 Clock 算法,又称最近未用(Not Recently Used,NRU)算法。

Clock 算法的性能比较接近 LRU 算法,而通过增加使用的位数目,可以使得 Clock 算法更加高效。在使用位的基础上再增加一个修改位,则得到改进型 Clock 置换算法。这样,每帧都处于以下 4 种情况之一:

  1. 最近未被使用,也未被修改(u=0,m=0)。
  2. 最近被访问,但未被使用(u=1,m=0)。
  3. 最近未被访问,但被修改(u=0,m=1)。
  4. 最近被访问,被修改(u=1,m=1)。

算法执行如下操作步骤:

  1. 从指针的当前位置开始,扫描帧缓冲区。在这次扫描过程中,对使用位不做任何修改。选择遇到的第一个帧(u=0,m=0)用于替换。
  2. 若第 1 步失败,则重新扫描,查找(u=0,m=1)的帧。选择遇到的第一个这样的帧用于替换。在这个扫描过程中,对每个跳过的帧,把它的使用位设置成 0。
  3. 若第 2 步失败,则指针将回到它的最初位置,且集合中所有帧的使用位均为 0。重复第 1 步,并且若有必要,重复第 2 步,以便可以找到供替换的帧。

改进型 Clock 算法由于简单 Clock 算法的地方在于替换时首选没有变化的页。由于修改过的页在被替换之前必须写回,因而这样做会节省时间。

抖动

在页面置换过程中,刚换出的页面马上要换入主存,刚换入的页面马上换出主存,这种频繁的页面调度行为称为抖动。若一个进程在换页上用的时间多余执行时间,则这个进程就在抖动。

频繁发生缺页中断,即抖动的主要原因是,某个进程频繁访问的页面数目高于可用的物理页帧数目。虚拟内存技术可在内存中保留更多的进程以提高系统效率。在稳定状态,几乎主存的所有空间都被进程块占据,处理器和操作系统可以直接访问到尽可能多的进程。然而,如果管理不当,那么处理器的大部分时间都将用于交换块,即请求调入页面的操作,而不是执行进程的指令,因此会大大降低系统效率。

工作集

工作集是指在某段时间间隔内,进程要访问的页面集合。基于局部性原理,可以用最近访问过的页面来确定工作集。一般来说,工作集 W 可由时间 t 和工作集窗口大小 来确定。例如,某进程对页面的访问次序如下:

假设系统为该进程设定的工作集窗口大小 为 5,则在 时刻,进程的工作集为 {2,3,5},在 时刻,进程的工作集为 {1,2,3,4}。

实际应用中,工作集窗口会设置得很大,即对于局部性好的程序,工作集大小一般会比工作集窗口 小很多。工作集反映了进程在接下来的一段时间内很有可能会频繁访问的页面集合,因此,若分配给进程的物理块小于工作集大小,则该进程就很有可能频繁缺页,所以为了防止这种抖动现象,一般来说分配给进程的物理块数,即驻留集大小要大于工作集大小。

工作集模型的原理是,让操作系统跟踪每个进程的工作集,并为进程分配大于其工作集的物理块。落在工作集内的页面需要调入驻留集中,而落在工作集外的页面可从驻留集中换出。若还有空闲物理块,则可以再调一个进程到内存以增加多道程序数。若所有进程的工作集之和超过了可用物理块的总数,则操作系统会暂停一个进程,将其页面调出并将其物理块分配给其他进程,防止出现抖动现象。



文章转载自海人为记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论