操作系统『4』 虚拟内存

1.起因

    磁盘容量很大,然而很慢,理想中的存储器:容量更大、速度更快、价格更便宜的非易失性存储器 ,掉电后数据仍能保存。
    虚拟存储就是在有限容量的内存中,以为单位自动装入更多更大的程序。


    在计算机系统中,尤其是在 多道程序运行的环境下,可能会出现内存不够用的情况,怎么办?

  • 如果是程序太大,超过了内存的容量,可以采用手动的覆盖 技术,只把需要的指令和数据保存在内存当中。
  • 如果是程序太多,超过了内存的容量,可以采用自动的交换技术,把暂时不能执行的程序送到外存中。
  • 如果想要在有限容量的内存中,以更小的灵敏度为单位装入更大的程序,可以采用自动的 虚拟存储技术。

2.覆盖技术

  • 目标:
        在较小的可用内存中运行较大的程序,常用于多道程序系统,与 分区存储管理配合使用。

  • 方法:
        依据程序逻辑结构,将程序划分为若干功能相对独立的模块;将不会同时执行的模块共享同一块内存区域。可以理解为 分时 共享同一块内存空间。
        必要部分(常用功能)的代码和数据常驻内存。
        可选部分(不常用功能)放在其他程序模块中,只在需要用到时装入内存。
        不存在调用关系的模块可相互覆盖,共用同一块内存区域。
    在这里插入图片描述
        要把不存在调用关系的函数或模块分成一个分区,A 是单独的,是常驻内存, 因为它需要调用 B、C、D、E、F,B 和 C相互不调用,所以分在一个区。

  • 缺点:
        编程复杂:需程序员划分功能模块,并确定模块间的覆盖关系。
        覆盖模块从外存装入内存,实际上是以时间延长来换取空间节省。

3.交换技术

  • 目标
        增加正在运行或需要运行的程序的内存。
  • 实现方法
        可将暂时不能运行的程序放到外存。
  • 换入换出的基本单位
        整个进程的地址空间。
  • 换出
        把一个进程的整个地址空间保存到外存。
  • 换入
        将外存中某进程的地址空间读入到内存。
    在这里插入图片描述

👀 需要考虑的问题
(1)交换时机:何时需要发生交换?
    硬盘和内存的访问速度是相差几个量级的,只有内存空间不够时,或有不够的危险时才换出。
(2)交换区大小?
    必须足够大以存放所有用户进程的所有内存映像的拷贝;必须能对这些内存映像进行直接存取。
(3)程序换入时的重定位:换出后再换入时要放在原处吗?怎么保证放在新位置的程序能正常执行?
    比如页表机制,虚拟地址和物理地址本来就没有直接的一一映射关系 ,是比较灵活的映射关系——采用动态地址映射的方法。


🤞 覆盖和交换的比较

  • 覆盖:
    只能发生在没有调用关系的模块间 (因此程序员必须给出程序内的各个模块之间的逻辑覆盖结构。)
    发生在运行程序的内部模块间

  • 交换
    以进程为单位
    不需要模块间的逻辑覆盖结构
    发生在内存进程间 / 运行程序的内部


4.虚存技术(虚拟内存管理技术)

目标:
    像覆盖技术那样,不是把程序的所有内容都放在内存中,因而 能够运行比当前的空闲空间还要大的程序。但做得更好,由操作系统自动来完成,无须程序员的干涉。
    像交换技术那样,那能够实现内存与外存之间的交换,因而获得更多的空闲内存空间。但做得更好,只对进程的部分内容在内存和外存之间进行交换。
在这里插入图片描述
    只把部分程序放到内存中,从而运行比物理内存大的程序;实现进程在内存与外存之间的交换,从而获得更多的空闲内存空间。

  • 程序的局部性原理
        程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域。
    (1)时间局部性
        一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内。
    (2)空间局部性
        当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内。
    (3)分支局部性
        一条跳转指令的两次执行,很可能跳到相同的内存位置。
        程序的局部性原理表明,从理论上来说,虚拟存储技术是能够实现的,而且在实现了以后应该是能够取得一个满意的结果的。
        正是因为有局部性,使得操作系统可以认为,当前正在访问的数据和代码,在很短的
  • 不同程序编写方法的局部性特征
    例子:
        页面大小为 4K ,分配给每个进程的物理页面数为 1 。在一个进程中,定义了如下的二维数组int A [1024] [1024],该数组按行存放在内存,每一行放在一个页面中。

程序编写方法1,按照 行 访问:

for (j = 0; j < 1024; j++)
for (i = 0; i < 1024; i++)
      A[i][j] = 0;

程序编写方法2 ,按照 列 访问:

for (i=0; i<1024; i++)
for (j=0; j<1024; j++)
          A[i][j] = 0;

     C 语言中是行优先来放置数组的:
在这里插入图片描述
方法1:
     0,1,2,………1023,0,1,………,共1024组,先访问 a 0,0 ,然后访问 a 1,0 … … 第 1 行 占了一个页,所以第一次访问后,如果数据是在硬盘中,还没放到内存,就会产生缺页异常,操作系统就会把 4 k 的数据块放到内存中,下一次 该访问 a 1,0 ,隔了 4 k,以此类推,每次访问都会产生一次中断… …就会产生 1024×1024 即 1 兆 次缺页中断 【在请求分页的过程中,如果访问的页面不再内存中,会产生一次缺页中断,在外存中找到所缺的一页将其调入内存】。每次中断就会产生一次从硬盘到内存的读写操作,开销很大。
    
方法2:
    具有很好的空间局部性和时间局部性,共发生了1024 次缺页中断 。
    
在这里插入图片描述
    由上图可知,虚拟内存管理技术的思路是 将不常用的部分内存块暂存到外存 (不必将所有的代码或数据放到内存中) ,装载程序时,只将当前指令执行需要的部分页面或段装入内存。指令执行中需要的指令或数据不在内存(称为缺页或缺段)时,会产生异常,处理器通知操作系统将相应的页面或段从硬盘调入内存,然后执行,如果内存空间不足时,操作系统将内存中暂时不用的页面或段保存到外存。

  • 实现方式
    (1)虚拟页式存储
    (2)虚拟段式存储
        
  • 虚拟内存管理的特征
    (1) 大用户空间
        提供给用户的虚拟内存可大于实际的物理内存,即 实现了两者的分离。如 32 位的虚拟地址 理论上可以访问 4 GB,而可能计算机上 仅有 256 M 的物理内存,但硬盘容量 大于 4 GB。
    (2)部分交换
        虚拟存储只对部分虚拟地址空间进行调入和调出。
    (3)不连续性
        物理内存分配非连续,虚拟地址空间使用非连续。
        
  • 支持技术
    (1)硬件: 页式或短时存储中的地址转换机制
    (2)操作系统:管理内存和外存间页面或段的换入和换出
虚拟页式内存管理

在这里插入图片描述

    在页式存储管理的基础上,(回顾一下,就是说逻辑地址空间 与 物理地址空间 的映射关系是通过 页表 维护的 )增加请求调页页面置换
    当用户程序要装载到内存运行时,只装入部分页面,就启动程序运行。
    进程在运行中发现有需要的代码或数据不在内存时,则向系统发出缺页异常请求。
    操作系统在处理缺页异常时,将外存中相应的页面调入内存,使得进程能继续运行。
页表选项:
在这里插入图片描述

  • 驻留位:
        表示该页是否在内存:1表示该页位于内存中,该页表项是有效的,可以使用;0 表示该页当前在外存中,访问该页表项将导致缺页异常.;回收该物理页面时,据此判断是否要把它的内容写回外存。
  • 修改位:
        表示在内存中的该页是否被修改过,1 表示 修改 (写)过,0 表示未修改过。
  • 保护位:
        表示该页的允许访问方式:只读、可读写、可执行等。
  • 访问位:
        表示该页面是否被访问过(读或写)。用于页面置换算法,尽量换 没有被访问过的 。
        
  • 示例:
    在这里插入图片描述
缺页异常(缺页中断)的处理流程

     X 表示驻留位为 0。
(A) 在内存中有空闲物理页面时,分配一物理页帧f,转第E步;
(B)依据页面置换算法选择将被替换的物理页帧 f,对应逻辑页 q ;
(C)如 q 被修改过,则把它写回外存;
(D)修改 q 的页表项中驻留位置为0;
(E)将需要访问的页 p 装入到物理页面 f ;
(F)修改 p 的页表项驻留位为 1 ,物理页帧号为 f ;
(G)重新执行产生缺页的指令;


在何处保存未被映射的页?
    能够简单地识别在二级存储器中的页。
    交换空间(磁盘或文件):特殊格式,用于存储未被映射的页面。


后备存储

    一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)的某个位置。

  • 代码段:映射到可执行二进制文件
  • 动态加载的共享程序段:映射到动态调用的库文件
  • 其他段:可能被映射到交换文件(swap file)
        
  • 虚拟页式存储管理的性能
    有效存储访问时间(effective memory access time EAT)
    EAT = 访存时间 * (1-p) + 缺页异常处理时间 * 缺页率p

例子:访存时间: 10 ns;磁盘访问时间: 5 ms;缺页率p;页修改概率q;
则 EAT = 10(1–p) + 5,000,000p(1+q) ,其中的 1+q 是因为有换入,还有换出。

5.页面置换算法

  • 功能
        当出现缺页异常,需调入新页面而物理内存已满时,就需要通过置换算法 选择 被置换的物理页面。
  • 目标
        (页面置换就意味着对硬盘进行读或写操作)尽可能减少页面的调入调出次数。
        把未来不再访问或短期内不访问的页面调出。

不是所有的页面都需要置换的,这里就需要有 ”页面锁定“ (frame locking)的概念,能把相关的页不在页面置换的算法之内,保证操作系统的正常工作:
(1)描述必须常驻内存的逻辑页面
(2)操作系统的关键部分
(3)要求响应速度的代码和数据
(4)页表中的锁定标志位(lock bit)
    
    通过以下方式比较不同的页面置换:
(1)记录进程访问内存的页面轨迹 ,形成一个序列
举例: 虚拟地址访问用 (页号, 位移) 表示:
(3,0), (1,9), (4,1), (2,1), (5,3), (2,0), (1,9), (2,4), (3,1), (4,8)
    (3,0)表示第 3 个页面的第 0 个 offset。可以只关注 页号,不考虑位移,因为只有页面不存在的时候,才会产生缺页中断,才要考虑页面置换。(同一个页如果有多次访问,只有第一次才可能产生缺页中断。)对应的页面轨迹:3, 1, 4, 2, 5, 2, 1, 2, 3, 4;根据这个序列就可以设计各种各样的置换算法,来看看 一定的页帧/物理页的size 下用某种算法会产生多少次缺页,认为缺页次数越少,性能就越高。

(1)局部页面置换算法
① 最优页面置换算法(OPT, optimal)
  • 基本思路:
         当一个缺页中断发生时,对于保存在内存当中的每一个逻辑页面,计算在它的下一次访问之前,还需等待多长时间,从中选择等待时间最长的那个作为被置换的页面。
        这只是一种理想情况,在实际操作中是无法实现的,因为操作系统无法知道每一个页面要等待多长时间以后才会被再次访问。但是它可以作为其他算法性能评价的依据(因为它根据未来的情况做推断,产生的缺页次数会很少,所以可以看看程序在采取其他的页替换算法时,的缺页次数,和它的比较。 在一个模拟器上运行某个程序,并记录每一次的页面访问情况,在第二遍运行时间即可使用最佳算法,得出预知未来的情况下 的 最少缺页的次数,经过比较可知 ,如果页面置换算法 能够尽量接近 最优页面置换算法,那就是比较好的算法。)
    例子:
    在这里插入图片描述
        如上图所示,0 - 4 时间内,不会产生缺页中断,而当时间为 ”5“ 时, ”e“ 不在物理页帧中,就需要进行页面置换了,根据最优页面置换算法,应该换成离下次访问最远的页,最远的是时间 ”10“ 对应的 “d”,所以需要把 ”d“ 替换出去,然后把 ”d“ 留出来的物理空间 ,填上 ”e“ 。
② 先进先出算法(First-In First-Out, FIFO)
  • 思路
        选择在内存驻留时间最长的页面进行置换。
        
  • 实现
        维护一个记录所有位于内存中的逻辑页面链表。链表元素按驻留内存的时间排序,链首最长,链尾最短。出现缺页时,选择链首页面进行置换,新页面加到链尾。
  • 特点
  • 实现简单
        性能较差,调出的页面可能是经常访问的;进程分配物理页面数增加时,缺页并不一定减少(Belady现象);很少单独使用。
    例子:
    在这里插入图片描述
        如上图所示,0 - 4 时间内,不会产生缺页中断,而当时间为 ”5“ 时, ”e“ 不在物理页帧中,就需要进行页面置换了,根据先进先出算法,
    驻留时间最久的是 “a”,所以需要先把 “a” 换出去,时间 ”7“ 时,访问到 “a”,而 “a” 已经被换出去了,所以又需要替换,这时驻留最久的是 “b”,就需要把 “b” 换出去,把 "a” 换进来;再接下来,时间 “8” 时,访问到 “b”,而 “b” 刚被换出去,所以又产生了中断 和 置换,这回该把 “c” 换出去,以此类推… …总共产生了 5 次缺页中断,确实产生缺页次数比较多。
        
③ 最近最久未使用算法(Least Recently Used, LRU)
  • 思路
        选择最长时间没有被使用的页面进行置换,如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问。
  • 实现
         缺页时,计算内存中每个逻辑页面的上一次访问时间。选择上一次使用到当前时间最长的页面。
         它是对最优页面置换算法的一个近似,其依据是 程序的局部性原理,即 再最近一小段时间(最近几条指令)内,如果某些页面被频繁地访问,那么再将来的一小段时间内,它们还可能会再一次被频繁地访问。反过来说,如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问。

例子:
在这里插入图片描述
     如上图所示,0 - 4 时间内,不会产生缺页中断,而当时间为 ”5“ 时, ”e“ 不在物理页帧中,就需要进行页面置换了,根据 最近最久未使用算法,a 是 “2” 时刻被访问的, b 是 “4”,“c” 是 “1”.,“d” 是 “3”,所以 “5”时刻需要替换的是 “c”; 到了 “6” 时刻,“b”仍在… … 到了 “9” 时刻,“c” 不在物理页帧中了,这时 a 是 “7”,b 是 “8”… … 所以要换的是 “d” … … 产生了三次缺页中断。

  • 实现方法
    (1)页面链表
         系统维护一个按最近一次访问时间排序的页面链表,链表首节点是最近刚刚使用过的页面;链表尾节点是最久未使用的页面。
         访问内存时,找到相应页面,并把它移到链表之首;缺页时,置换链表尾节点的页面。
    (2)活动页面栈
         访问页面时,将此页号压入栈顶,并把栈内相同的页号抽出(需要查找栈内有无相同的页号,开销比较大,操作系统讲究高效、整洁);缺页时,置换栈底的页面。
        
④ 时钟页面置换算法(Clock)
  • 思路
         仅对页面的访问情况进行大致统计
  • 数据结构
         在页表项中增加访问位 ( access byte ),它的置位是硬件来完成的(当然软件也可以置位)。描述页面在过去一段时间的内访问情况,置 “1” 表示最近被访问,它是粗略的,但是有效的;各页面组织成环形链表指针指向最先调入的页面
  • 算法
         访问页面时,在页表项记录页面访问情况;缺页时,从指针处开始顺序查找未被访问的页面进行置换。
  • 实现
         页面装入内存时,访问位初始化为0访问页面(读/写)时,访问位置1, 缺页时,从指针当前位置顺序检查环形链表,访问位为0,则置换该页;访问位为1,则访问位置0,并指针移动到下一个页面,直到找到可置换的页面。
  • 例子
    在这里插入图片描述
        如上图所示,某个运行的程序有 5 个物理页帧,有 8 个虚拟页,建好一个环形 list,页 7、4、0、3、1 是放在物理内存中的,同时,最左边的位 ”驻留位“ 表示是否存在,置 ”1“ 代表页在物理内存中是存在的,第二位表示访问位,”1“ 表示被访问过一次,硬件置为 ”1“了。最右边的是 页帧号。我们要关注的是 驻留位 必须是 ”1“,然后看第二位,是置换的依据。
        指针指向上一次访问的位置,程序本来是在正常运行,当它产生缺页中断后,需要把新的页调到物理内存中,根据时钟页面置换算法,首先,对于页号 0 ,访问位开始时是 ”1“,说明被访问过,需要做的处理是把这一位清零,然后指针顺时针向下一个,指向页号 3,而 页号 3 也是同样的情况,以此类推,页号 1、 7… … 直到页号 4 ,才找到了访问位为 0 的页表项,这个页表项对应的页帧号是 ”6“。

    以上 ”访问位“ 的 ”访问“,没有区分 读 和 写,即 读也是访问,写 也是访问, 而除了 ”访问位“ access byte ,页表项中还有一个 ”脏位“ dirty byte,只有对页进行写操作时,会被置为 ”1“。如果都是读操作,那么硬盘和内存中页的内容是一致的,那么替换后不需要把页重新写入到硬盘中,直接释放掉就好了;但是如果进行了写操作,那么硬盘和内存中的内容就不一致了,需要把内容写回硬盘。
因此 如果 dirty byte 就可以使时钟效率更高——二次机会法。

  • 思路
        减少修改页的缺页处理开销。
  • 算法
        在页面中增加修改位,并在访问时进行相应修改;缺页时,修改页面标志位,以跳过有修改的页面。

⑤ 最不常用算法(Least Frequently Used, LFU)
  • 思路
        缺页时,置换访问次数最少的页面。
        每个页面设置一个访问计数访问页面时,访问计数加1;缺页时,置换计数最小的页面。

👀 LRU和LFU的区别
    LRU关注多久未访问,时间越短越好;LFU关注访问次数,次数越多越好。

⑥ Belady 现象
  • 现象
        采用 FIFO 等算法时,可能出现分配的物理页面数增加,缺页次数反而升高的异常现象。
LRU,FIFO 和 Clock 的比较
  • LRU依据页面的最近访问时间排序;FIFO依据页面进入内存的时间排序。
  • LRU需要动态地调整顺序;FIFO 的页面进入时间是固定不变的。
  • LRU算法性能较好,但系统开销较大; FIFO算法系统开销较小,会发生Belady现象
         LRU可退化成FIFO:如页面进入内存后没有被访问,最近访问时间与进入内存的时间相同;例如:给进程分配3个物理页面,逻辑页面的访问顺序为1、2、3、4、5、6、1、2、3…
    Clock算法是它们的折衷,页面访问时,不动态调整页面在链表中的顺序,仅做标记,缺页时,再把它移动到链表末尾。对于未被访问的页面,Clock和LRU算法的表现一样好;对于被访问过的页面,Clock算法不能记录准确访问顺序,而LRU算法可以 。

局部置换算法没有考虑进程访存差异 (主要程序是动态变化的过程,物理页帧的需求是可变的,而之前假设物理页帧是固定的),而且是基于程序的局部性原理。
    如果局部性原理不成立,那么各种页面置换算法就没什么分别,也没什么意义。例如:假设进程对逻辑页面的访问顺序是 1、2、3、4、5、6、7、8、9… … 即单调递增,那么在物理页面数有限的前提下,不管采用什么置换算法,每次的页面访问都必然导致缺页中断。
    如果局部性原理是成立的,那么如何证明它的存在,如何来对它进行定量地分析?这就是工作集模型。


(2)全局页面置换算法
  • 思路
    全局置换算法为进程分配可变数目的物理页面。
  • 全局置换算法要解决的问题
    进程在不同阶段的内存需求是变化的
    分配给进程的内存也需要在不同阶段有所变化
    全局置换算法需要确定分配给进程的物理页面数
工作集模型

    工作集:一个进程当前正在使用的逻辑页面集合,可表示为二元函数 W(t, △)。

  • t 是当前的执行时刻。
  • △ 称为工作集窗口(working-set window ),即一个定长的页面访问时间窗口。
  • W(t, △)是指在当前时刻 t 前的 △ 时间窗口中的所有访问页面所组成的集合。
  • | W(t, △) | 指工作集的大小,即页面数目。
  • (很有用的)例子:
    在这里插入图片描述    t2 对应的局限性比较好。
  • 工作集的变化
    -在这里插入图片描述

    进程开始执行后,随着访问新页面逐步建立较稳定的工作集;当内存访问的局部性区域的位置大致稳定时,工作集大小也大致稳定;局部性区域的位置改变时,工作集快速扩张和收缩过渡到下一个稳定值。

  • 常驻集
        在当前时刻,进程实际驻留在内存当中的页面集合。
        工作集是进程在运行过程中固有的性质,常驻集取决于系统分配给进程的物理页面数目和页面置换算法。
        常驻集 ⊇ 工作集时,缺页较少;工作集发生剧烈变动(过渡)时,缺页较多;进程常驻集大小达到一定数目后,缺页率也不会明显下降
工作集页置换算法
  • 思路
        换出不在工作集中的页面。随着程序的执行,工作集窗口是在挪动 / 平移的,平移过程中,如果某一页不在时间窗口页内,该页也会被丢掉(并不是缺页才会被丢掉。)
    在这里插入图片描述
缺页率置换算法

    以上 窗口是是固定的,现在设想,窗口本身是可以变化的,体现为 常驻集 可变,(例如,每个进程在刚开始运行时,先根据程序大小给它分配一定数目的物理页面,然后在进程运行过程中,再动态地调整常驻集的大小。)设计一种 基于缺页率的算法,依据是缺页的频度,缺页次数越多,就应该给程序更多的物理内存页,使得缺页次数降低。否则,应该适当压缩常驻集。即 通过缺页率的变化,


缺页率:缺页次数 / 内存访问次数 或者是 缺页平均时间间隔的倒数。

  • 影响因素:
    (1)页面置换算法
    (2)分配给进程的物理页面数目
    (3)页面大小(页面越大,缺页次数减少)
    (4)程序的编写(程序的局部性好,缺页次数会减少)
    在这里插入图片描述

    通过调节常驻集大小,使每个进程的缺页率保持在一个合理的范围内:
若进程缺页率过高,则增加常驻集以分配更多的物理页面;
若进程缺页率过低,则减少常驻集以减少它的物理页面数。

  • 实现
        保持追踪缺失发生概率:当缺失发生时,从上次页缺失起,记录这个时间。t [last] 是上次页缺失的时间。
        设置引用位标志;缺页时,计算从上次缺页时间t [last] 到现在t [current] 的时间间隔,如果 t[current] – t[last]>T, 则置换所有在 [ t[last] , t[current] ] 时间内没有被引用的页;如果 t[current] – t[last] ≤ T, 则增加缺失页到工作集中。

抖动问题

产生抖动的原因:
    随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升。

    进程物理页面太少,不能包含工作集,即 常驻集⊆ 工作集,会造成大量缺页,频繁置换,就是 频繁地在内存与外存之间替换页面,从而使进程的运行速度变得很慢,这种状态称为 “抖动”。
    所以需要使常驻集 与 工作集 尽可能匹配,即 一致,就能尽量少出现缺页的情况。
在这里插入图片描述

    量化缺页:有两个参数,MTBF 和 工作集的大小。希望二者平衡。如上图所示,x轴代表 并发进程数,y 轴代表 CPU 利用率。希望能维持在曲线的最高峰——进程尽量多,而 CPU 利用率也很高。我们需要找到这样的平衡点,缺页产生的平均时间,和 完成一次缺页的中断服务的时间,尽量相等,那就是理想的情况了。绿线就是 平均缺页间隔时间 / 缺页异常处理的时间 。比值越大意味着缺页的频度低,说明大部分时间是用于程序的运行的,利用率很高;但是随时时间增长,可能缺页次数越来越多,那么平均缺页间隔时间就会越来越少,但是缺页异常处理的时间是不变的 ,所以曲线呈下降趋势。我们要找的是图上红线与虚线的交会位置。操作系统可以根据 CPU 利用率动态调整并发进程数,调整合适了,内存抖动现象自然也就得到改善了。(## 抖动问题
产生抖动的原因:
    随着驻留内存的进程数目增加,分配给每个进程的物理页面数不断减小,缺页率不断上升。

    进程物理页面太少,不能包含工作集,即 常驻集⊆ 工作集,会造成大量缺页,频繁置换,就是 频繁地在内存与外存之间替换页面,从而使进程的运行速度变得很慢,这种状态称为 “抖动”。
    所以需要使常驻集 与 工作集 尽可能匹配,即 一致,就能尽量少出现缺页的情况。
在这里插入图片描述

    量化缺页:有两个参数,MTBF 和 工作集的大小。希望二者平衡。如上图所示,x轴代表 并发进程数,y 轴代表 CPU 利用率。希望能维持在曲线的最高峰——进程尽量多,而 CPU 利用率也很高。我们需要找到这样的平衡点,两个缺页产生的平均时间,和 完成一次缺页的中断服务的时间,尽量相等。绿线就是 平均缺页间隔时间 / 缺页异常处理的时间 。比值越大意味着缺页的频度低。
通过调节并发进程数(MPL)来进行系统负载控制,∑ WSi = 内存的大小;平均缺页间隔时间(MTBF) = 缺页异常处理时间(PFST))
    即使只有一个程序,但是它耗费了很大的内存,也可能会产生内存抖动现象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值