操作系统-内存管理4(虚拟内存)

一、虚拟内存

由于局部性原理,在程序装入内存时,将很快用到的那一部分装到内存中,暂时不用的留在外存。
在程序执行过程中,当所访问的信息不存在时,有操作系统负责将所需的信息由外存调入内存。
若内存不足,由操作系统将暂时不使用的信息交换到外存。
在操作系统的管理下,在用户看来有一个比实际内存大得多的内存,这就是虚拟内存。

特点:
多次性:无需在作业运行时一次调入内存,而是被允许多次调入内存。
对换性:在作业运行过程中无需常驻内存,而是在运行时调入调出。
虚拟性:从逻辑上扩充了内存的容量,使用户看到的内存远大于实际内存。

二、虚拟内存的实现

虚拟内存允许一个作业多次调入内存,如果使用连续空间分配方式,下次在调入内存时,也需要接着原来的内存地址分配连续的空间,所以实现上不方便。因此,虚拟内存需要建立在离散分配的内存基础上。

基于非连续内存分配方式的:基本分页存储管理、基本分段存储管理和基本段页式存储管理。操作系统需要在上述分配方式的基础上提供请求调页(调段)功能和提供页面置换(段置换)功能。
由此虚拟内存的实现有:
1)请求分页存储管理
2)请求分段存储管理
3)请求段页式存储管理。

三、请求分页管理方式
3.1 页表结构:
1)和基本分页相比,为了实现"请求调页",操作系统需要知道每个页面是否已经调入内存,如果没有,应该需要知道该页面在外存中的位置。
2)当内存页面不足时,需要"置换页面",操作系统需要根据某些指标来决定到底要置换那个页面;如果页面没有被修改过,就不需要浪费时间去写回外存;如果被修改过,需要写回外存覆盖旧数据。因此需要记录各个页面是否被修改过。

所以请求分页管理的页表相较于基本页表多了如下几个字段:
状态位:表示是否调入内存
访问字段:可以记录被访问过几次,作为置换算法的参考选择。
是否修改:表示是否修改
外存地址:也所属的外存地址。

在这里插入图片描述
3.2 缺页中断
每当访问的页面不存在时,就会产生一个缺页中断。然后操作系统的缺页中断程序就会处理该中断(就是将页面由外存调入内存),此时缺页进程阻塞,放入阻塞队列,当调页完成后将其唤醒。

如果内存中有空闲块,在将该缺页页面调入该内存块,并修改页表中相应的页表项(状态位、访问字段…)
如果内存中没有空闲也,则按照转换算法淘汰一个页面,如果该页面没有被修改直接,不用写回外存;如果被修改过,需要写回外存。

3.3 请求分页管理的地址转换
转换过程和基本分页一致,只不过多加了几步,大致流程如下:
1)根据逻辑地址计算页号和页面偏移量
2)根据页号和页寄存器判断是否越界
3)根据页号从快表中判断是否命中,命中则取出内存块号和偏移量计算物理内存地址(命中,则该页面一定在内存中;应为页面被置换出内存时,需要删除快表中的记录)
4)未命中则根据寄存器中起始页地址和页号计算出该页表项的内存,并判断该页是否在已调入内存,没有则产生缺页中断,进入中断处理程序,完成调页和页面置换(内存不足的情况下)
5)完成页面调入或者置换后,需要更新也标的内存块号,状态为、访问字段等;然后访问实际物理内存。

原理图如下:
在这里插入图片描述
3.4 置换算法

3.4.1 最佳置换算法(OPT)
每次选择淘汰的页面是以后永不使用,或者最长时间内不在被访问的页面。

缺点:这种方式需要提前知道接下来所有要访问的页面,才能判断那个页面以后永不使用或者长时间内不被访问。但是实际情况是只有在进程实际执行的时候才知道接下来访问的页面,所以该方法无法实现。

3.4.2 先进先出置换算法(FIFO)
每次选择淘汰的页面是最早进入内存的页面。
实现:把调入内存的页面按照调入的先后顺序排成一个队列,需要换出时选择头页面即可。队列的最大长度取决于系统为进程分配了多少内存块

缺点:先进入队列的页面也可能在以后的运行中经常被访问,所以会增加换入换出的次数,FIFO的性能很差;还会引起Belay(贝拉迪)异常。

注:Belay(贝拉迪)异常是指当为进程分配的物理块数增大时,缺页次数不减反增。?(为什么:因为把经常使用的置换出去,造成缺页,下次又置换回来;增加了无效的置换。)

3.4.3 最近最久未使用置换算法(LRU least recently used)
每次淘汰的页面是最近最久未使用的页面。
实现方法:用页表项中的访问字段来记录自上次被访问以来所经历的时间t,当需要淘汰一个页面时,选择t值最大的页面淘汰。

缺点:该算法实现性能很好,但是需要专门的硬件支持,实现困难,开销大。

3.4.4 时钟置换算法(CLOCK 或NRU 最近未使用)
实现方法:在页表中为每一个页面设置一个访问位,1为最近被访问过,0为最近没有没有被访问过。在将内存中的页面链接成一个循环队列,当需要淘汰一个页面时,只需要检测访问位,如果是0就淘汰该页面。如果是1,就将它置为0,暂时不淘汰,接着去检测下一个页面。若第一轮扫描中所有页面都是1,则将这些面叶的访问位依次置为0,再进行第二轮扫描。(第二轮扫描一定会有访问位为0的页面,因此CLOCK算法淘汰一个页面最多经过两次扫描)。
在这里插入图片描述

3.4.5 改进型时钟置换算法
CLOCK算法只是淘汰最近未访问的页面,事实上,如果被淘汰的页面没有被修改过,则不需要写回外存,只有被修改过的页面才需要写回外存。
改进型CLOCK正式这样的算法,使用访问位和修改位共同作为淘汰指标。同样的没被访问难过的页面,没有被修改的则优先淘汰,避免I/O操作。

使用(访问位,修改位)来表示页面状态
算法规则:将内存 中所有的页面排成循环列表
第一轮:从当前位置开始扫描,遇到第一个(0, 0)页面(没访问,没修改),则淘汰该页面;本轮扫描不修改任何标志位
第二轮:第一轮失败,进行第二轮扫描,尝试找到第一个(0, 1)状态的页面(没访问,有修改),用于置换。同时将扫描过的页面访问位置为0
第三轮:第二轮失败,重新扫描,尝试找到第一个(0, 0)的页面(没访问,没修改),用于置换。本轮扫描不做任何标志位修改。
第四轮:第三轮失败,重新扫描,找到第一个(0, 1)页面,用于替换。

由于第二轮将所有的访问位置为0,所以第三轮或者第四轮一定能找到一个页面淘汰。因此改进型CLOCK淘汰一个页面最多需要4轮扫描。

四轮扫描的淘汰优先策略:
第一轮(0,0)优先淘汰没有被访问,也没有没修改过的
第二轮(0,1)优先淘汰没有被访问,但是被修改的
第三轮(0,0)优先淘汰被访问过,但没有被修改的(二轮将访问位置位了)
第四轮(0,1)优先淘汰被访问过,且被修改过

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值