虚拟存储管理技术(分页)

局部性

  • 局部性特征:
    由于大多数程序执行时,在一段时间内仅使用它的程序编码的一部分,即并不需要在全部时间内将该程序的全部指令和数据放入主存,所以将程序的地址空间部分装入主存,也可以正常的执行。
  • 局部性原理:
    一个编写良好的计算机程序,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,我们称这种程序具有良好的局部性。这种倾向性,我们称之为局部性原理。

空间局部性:在一个具有良好空间局部性的程序中,如果一个存储器的位置被引用了一次,那么程序在不远的将来会被再次引用附近的一个存储器位置
时间局部性:在一个具有良好时间局部性的程序中,被引用的一次存储器在不远的将来会被再次引用

  • 局部性应用:
    在硬件层,局部性原理允许计算机设计者通过引入称为高速缓存存储器的小而快速的存储器来保存最近被引用的指令和数据项,从而提高对主存的访问速度。
    在操作系统级,局部性原理允许系统使用主存作为虚拟地址空间最近被引用块的高速缓存。

虚拟存储管理器

将用户的逻辑主存(辅存)与物理主存(主存)分开;计算机系统在处理应用程序时,只装入部分程序代码和数据就启动运行,由操作系统和硬件相配合完成代码和数据就启动其运行,由操作系统和硬件相配合完成主存和外围联机存储器之间的信息动态调度,这样的计算机系统好像为用户提供了一个存储容量比实际主存大得多的存储器,这就是虚拟存储器

  • 特征

多次性:一个作业允许被多次调入内存
对换性:允许作业在运行过程经行换进换出
虚拟性:从逻辑上扩充内存容量

  1. 虚拟内存的优点:可以弥补物理内存大小的不足;一定程度的提高反映速度;减少对物理内存的读取从而保护内存延长内存使用寿命;
  2. 虚拟内存的缺点:占用一定的物理硬盘空间;加大了对硬盘的读写;设置不得当会影响整机稳定性与速度。

Q: 虚拟存储是否可以无限大?他受什么限制?
虚拟存储要点: 虚拟存储总和 <= (外存 + 内存)m1
虚拟地址空间 <= MAR(存储器地址寄存器)的位数所能表示的空间 m2
取min(m1, m2);

虚拟存储系统的软件策略

  1. 驻留集管理
  2. 放置策略
  3. 获取策略
  4. 置换策略

缺页率

如果程序p在运行中访问成功的次数为s,不成功的次数为f,总次数a = s + f; F = f / a; F 为缺页中断率

- 驻留集管理

进程的驻留集:虚拟存储系统中, 每个进程驻留在内存的页面集合。

驻留集需要解决的问题:为每个进程分配多少个页框

  • 分配给每个进程的页框数越少:驻留内存的进程数目越多, 进程能调度就绪进程的概率越大。但是缺页中断概率增加,(一个进程的页框数少,就容易缺页嘛), 为进程分配过多的页框,虽能降低缺页率, 但是降低幅度不大, 也就是不能显著的降低缺页中断率

在这里插入图片描述

  • 左图是页框大小与缺页率关系:
    页框越小, 同样的内存, 页面数就越多,缺页率越小;但当页框逐渐增大时,到一个峰值, 增加页框大小反而缺页率就会降低,一个页面能包含很多信息了。
  • 右图是页框数量(驻留集大小)与缺页率的关系
    比如当驻留集大小就是进程的大小就不会缺页了

驻留集管理策略

  • 固定分配策略
    为每个进程分配固定的数量的页框, 每个进程的驻留集尺寸在运行期间固定不变。

  • 可变分配策略
    为每个进程分配的页框数在进程生命周期内是可变的。 当进程的缺页率很高时,驻留集太小, 可以适当增加页框; 当进程缺页率在一段时间都保持很低时, 可以适当减少进程的驻留集,回收部分页框。

    两种策略比较:
    可变分配更加灵活, 能提高系统的吞吐量, 同时也带来了增加系统开销(需要统计缺页率), 同时用什么去评判缺页率高低(标准是什么) 的问题。

- 页面放置策略

系统应当在内存的什么位置为进程分配页框?

  • 对于分段系统, 需要考虑将一个程序段装入哪一个合适的分区中, 可采用首次适应, 下次适应, 最佳适应, 最差适应算法。
  • 对于段页式, 分页式无关紧要;

- 页面获取策略

系统在什么时候把页面装入内存?

请调为主, 预调为辅。
页面调入过程

  1. 向CPU发出缺页中断
  2. 中断处理程序保存CPU环境转中断处理程序
  3. 该程序查找页表, 得到该页的块号
  4. 若内存未满, 启动磁盘I/O读入; 若已经满了, 置换, 再调入
  5. 修改页表对应项的内容, 并将此页表项填入快表
  • 请求调页

在进程执行时, 通过检查页表发现相应的页面不在内存, 才装入页面
此方法一次装入请求的一个页面, 增加磁盘I/O频率, 系统开销大

  • 预调页方式

当进程创建时, 预先为进程装入多个页面。 (缺页中断时, 系统为进程装入指定的页面以及与之相邻的多个页面)
对于局部性差的, 预先装入的不会被很快引用, 占用大量内存。

- 页面置换策略

抖动问题:一个刚被淘汰出去的页面, 不久又要访问, 又从辅存调入, 调入后不久, 又被调出, 如此反复, 导致整个系统一直陷于页面调入调出, 大部分时间都在处理缺页中断和页面淘汰中

影响缺页次数的因素:

  • 分配给作业的内存快数
  • 页面尺寸
  • 程序的实现
  • 页面淘汰算法

当缺页中断并且没有足够内存时, 我们应该置换一些页面
在什么范围判断没有空闲框?
没有空闲框时, 又应该将那个置换?

  • 1,局部置换(固定分配策略):

系统在自身的驻留集中判断当前是否存在空闲页框,并进行置换

页面置换算法:

1. 最佳置换算法(OPT)

  • 基本思想:淘汰的页面是以后永久不使用或者在最长时间内不再访问的页面或在较长的时间内不在访问,若采用固定分配策略,OPT能保证系统缺页率最低算法前提是知道后面引用的页面,而实际是不可能的,(理想型算法), 常用于评价其他算法。
  • 实例:
    在这里插入图片描述
    12次页面引用, 7次缺页中断, 4次页面置换

2.最近最少使用置换算法(LRU)

  • 基本思想:当一个缺页中断发生时, 选择最近最久未使用多的那个页面,淘汰,该算法是OPT的近似, 实现比较困难。
  • 两种实现方式:
  • 实例:
    在这里插入图片描述
    在第5次应用时, 应用页面号为5, 发生缺页中断, 之前的序列(2, 3, 2, 1)最少使用时(3, 1),最远的为3, 所以替换3 ;
    12次页面引用, 7次缺页中断, 4次页面置换。

3.先进先出置换算法(FIFO)

  • 基本思想:淘汰最先进入内存的页面, 选择在内存中驻留时间最久的页面。可以用一个队列实现, 并设置一个指针, 指向驻留时间最久的哪一个, 准备需要时直接替换。
  • 该算法与进程的动态性不符合, 进程中某些程序代码,数据需要被高频使用, FIFO会导致这种页面换入换出,该算法会造成Belady异常, 也就是分配多的内存,缺页次数反而增多;
    原因:FIFO算法的置换特征与进程访问内存的动态特征是矛盾的,与置换算法的目标是不一致的(即替换较少使用的页面),因此,被它置换出去的页面并不一定是进程不会访问的。

4,时钟置换算法(Clock)

  • 给进程每个页面设置一个使用为(U), 当引用时U,设置成1; 系统将置换范围内所有页面组成一个循环队列, 设置一个指针;
  • 指针:未进行置换时, 指针总是上一次进行页面置换时的下一个位置
  • 规则:当需要进行页面置换时(),
    如果当前扫描指针页面的U为1, 将U位变成0, 指针向下移动, 继续搜索,(有1变0, 并移动指针)直到找到U = 0, 进行替换, 停止搜索 。
    如果当前扫描指针页面的U为0, 系统将给页面进行置换并移动指针。停止搜索
  • 式例:
    在这里插入图片描述
    过程:
    a:驻留集有空间, 页面2进入,U位为1, 指针下移,用p(2, 1), 2:表示页面2U位为1,指针在2;
    b:有多余空间, p(2, 1), p(3, 1), 3;
    c:页面2在驻留集中能找到, 指针不移动
    d:有多余空间,页面进入, p(2, 1), p(3, 1), p(1, 1), 1;
    e:无多余空间需要置换, 按照规则,当前指针的页面U位为1, 变0+移动…最终p(5, 1), p(2, 0), p(1, 0), 2;
  • 时钟算法的改进

系统把一个页面移出内存, 如果该页面驻留内存期间没有被修改过, 就不必写会辅存, 反之写回。(表明:换出未修改的页面比换出修改的页面开销小

  • 系统为每个页面设置一个使用位(U), 修改位(M),
    U=0, M=0: 最近没使用过 , 也没有修改过
    U=0, M=1: 最近没使用过 , 修改过
    U=1, M=0: 最近使用过 , 但没有修改过
    U=1, M=1: 最近使用过 , 也有修改过

  • 规则
    从扫秒指针当前位置开始, 搜索U=0, M=0, 的页面。如果找到, 置换该页面, 终止算法。
    第一步没成功, 扫面指针将回到原位置。 再次搜索 U = 0, M = 1; 的页面。 如果遇到U = 1, 的页面, 将 U改成0。如果找到了 U = 0, M = 1, 置换该页面, 终止算法。
    如果第二步也没成功, 转第一步, 一定会成功。

  • 2,全局置换:在整个内存空间内判断是否有空闲框, 并允许从其他进程的驻留集中选择一个页面换出内存。(可变分配策略)

页面清除

页面清除:由页面置换算法选中的要被修改到外存的页面。

决定系统什么时候将一个被置换页面写入外存

页面缓冲技术:当发生缺页中断时, 不必先写出置换页, 可以将其保存到内存的一个缓冲区, 在以后某个时间, 批量写到外存。减少磁盘的I/O次数

负载控制

多道程序允许多个进程同时驻留内存, 来提高系统的吞吐量和资源利用率, 驻留进程数太多反而降低系统效率

负载控制主要解决系统中应当保持多少个活动进程驻留内存的问题, 多道程序控制的度。

  • 当内存中活动进程数很少, 负载控制将增加新进程或激活一些挂起进程进入内存
  • 反之, 内存进程数太多时, 负载控制将暂时挂起一些进程, 减少内存中进程数

判断系统负载?

  1. L = S准则:通过调整多道程序的度, 使发生两次缺页之间的平均时间等于一次缺页所需要的平均时间, 即:一次缺页处理完成, 再发生下一次缺页。
  2. 50%准则:分页设备的利用率保持在50%左右, 处理机利用率将最大
    如果系统基于Clock置换算法, 那么, 可以通过监视指针的移动速率来调整系统负载。如果指针移动速率低于某个阈值那么意味着近期的页面的失败次数较少或者没有被引用的页面次数较多,此时系统可以增加驻留内存的进程数。如果超出了此时应当减少驻留内存的活动进程数。

一些问题

简单分页和虚拟分页的区别

  • 简单分页:一个程序中所有的页必须在主存储器中才可以正常运行,(覆盖技术除外)
  • 虚拟分页:不是程序的每一页都必须在主存储器的帧中是程序运行, 在需要的时候进行读取

驻留集和工作集的区别

  • 一个进程的驻留集是指在当前主存中进程的页的个数
  • 一个进程的工作集是指进程最近被使用过页的个数

已知系统为32位实地址,采用48位虚拟地址,页面大小4KB,页表项大小为8B;每段最大为4GB。
(1)假设系统使用纯页式存储,则要采用多少级页表,页内偏移多少位?
(2)假设系统采用一级页表,TLB命中率为98%,TLB访问时间为10ns,内存访问时间为100ns,并假设当TLB访问失败后才访问内存,问平均页面访问时间是多少?
(3)如果是二级页表,页面平均访问时间是多少?

1.首先,页面大小为4KB,故页内偏移需要12位来表示。其次,系统虚拟地址一共48位,所以剩下的48-12=36位可以用来表示虚页号。每一个页面可以容纳的页表项为:4KB/8B=29(也就是可以最多表示到9位长的页号),而虚页号的长度为36位,所以需要的页表级数为:36/9=4级。

2.当进行页面访问时,首先应该先读取页面对应的页表项,98%的情况可以在TLB中直接得到得到页表项,直接将逻辑地址转化为物理地址,访问内存中的页面。如果TLB未命中,则要通过一次内存访问来读取页表项,所以页面平均访问时间是:
98%×(10+100)ns+2%×(10+100+100)ns=112ns

3.二级页表的情况下:
如果TLB命中,和(2)的情况一样,如果TLB没有命中,采用二级页表需要访问3次内存,所以页面平均访问时间是:
98%×(10+100)ns+2%×(10+100+100+100)ns=114ns
  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值