操作系统系列笔记(三) - 虚拟存储和页面置换算法

虚拟存储

需求背景

存储器的层次结构: 寄存器, 高速缓存, 内存, 磁盘, 磁带, 速度依次降低且差距巨大
虚拟存储目标是解决内存不够用问题, 在有限容量的内存中, 以页为单位自动装入更多更大的程序

覆盖和交换

覆盖: 应用程序将程序根据功能划分为独立的模块, 必要部分的代码和数据常驻内存, 可选部分需要时才装入到内存, 不存在调用关系的模块可以相互覆盖, 共用一块内存区域
不足是, 增加编程困难(需划分功能模块, 确定模块间覆盖关系), 增加执行时间(从外存装入覆盖模块)
交换: 增加正在运行程序的内存, 操作系统可自动将暂时不能运行的程序放到外存, 换入换出的基本单位是整个进程的地址空间, 只有当内存不够或有不够可能时换出
依赖于局部性原理: 程序在执行过程中的一个较短时期, 所执行的指令地址和指令的操作数地址, 分别局限于一定区域, 时间局部性, 空间局部性, 分支局部性

虚拟存储概念

核心: 将不常用的部分内存块暂存到外存
装载程序时, 只将当前指令执行需要的部分页面或段装入内存, 指令执行中需要的指令或数据不在内存称为缺页或缺段, 处理器通知操作系统将相应的页面或段调入内存
操作系统将内存中暂时不用的页面或段保存到外存

虚拟页式存储

在页式存储管理的基础上, 增加请求调页和页面置换
程序装载到内存运行时, 只装入部分页面, 就启动, 进程在运行中发现有需要的代码或数据不在内存时, 则向系统发出缺页异常请求, 操作系统在处理缺页异常时, 将外存相应的页面调入内存, 使得进程能继续运行
页表项需要添加几个标志位:
驻留位, 表示该页是否在内存, 修改位, 表示在内存中的该页是否被修改过, 访问位, 是否被访问过, 用于置换算法, 保护位, 表示该页允许的访问方式

缺页异常

处理流程, 指令->页表项, 有效直接访问, 无效就产生缺页异常->操作系统缺页异常服务例程执行->查找在外存中对应的页面->物理内存有空闲帧, 则直接放并修改页表项->重新执行指令
如果以上没找到空闲帧, 则依据页面置换算法选择被替换的物理页帧, 并判断是否修改过, 修改过则写回外存, 并修改该页的页表项表示已无效
未被映射的页通常保存到兑换区, 采用特殊格式存储, 代码段和共享库不去修改, 不用放到兑换区, 数据段和堆栈段需要放
虚拟页式存储管理的性能: 有效存储访问时间 = 访存时间×(1-p)+缺页异常处理时间×缺页率p
想要性能高就要保证缺页率p足够小

页面置换算法

简介

当出现缺页异常, 需调入新页面而内存已满时, 置换算法选择被置换的物理页面, 且尽可能减少页面的调入调出次数, 把未来不再访问或短期内不访问的页面调出
页面锁定: 有些不能调出, 如声明必须常驻内存的, 操作系统的关键部分, 要求响应速度的, 可通过页表中的锁定标志位锁定
算法评价方法, 模拟页面置换行为, 产生缺页次数少的性能更好
局部页面置换算法: 选择范围仅限于当前进程占用的物理页面, 每个进程占用的页面总数不会变化, 例如最优算法(预测未来), 先进先出, 最近最久未使用算法(统计过去), 时钟算法, 最不常用算法
全局页面置换算法: 范围为所有可换出的物理页面, 进程间分配的物理页面数会发生变化, 例如工作集算法, 缺页率算法

局部页面置换算法

依次介绍每种算法
最优页面置换算法(Optimal, OPT): 置换在未来最长时间不访问的页面, 因为需要预测未来所以无法实现, 但可以作为其他算法的评测依据
先进先出算法(First-In First-Out, FIFO): 选择在内存驻留时间最长的页面进行置换, 好实现, 但性能差, 分配物理页面增加甚至会缺页更多, 很少单独使用
最近最久未使用算法(Least Recently Used, LRU): 选择最长时间没有被引用的页面进行置换, 有点复杂, 开销大
时钟页面置换算法(Clock): 对页面访问进行粗略统计, 页表项增加访问位, 页面组成环形链表, 指针指向最先调入页面, 缺页时从指针处开始顺序找未被访问页面置换, LRU和FIFO的折中
改进的时钟算法: 减少修改页的缺页处理开销, 再添加修改位, 缺页时跳过有修改的页面
最不常用算法(Least Frequently Used, LFU): 对LRU改进, 置换访问次数最少的页面, 每个页面加一个访问计数, 缺页时置换计数最小的

全局页面置换算法

工作集置换算法
换出不在工作集中的页面, 窗口大小b, 当前时刻前b个内存访问的页引用是工作集
工作集: 一个进程当前正在使用的逻辑页面集合, 可表示为二元函数W(t, a), t是当前的执行时刻, a是工作集窗口(一个定长的页面访问时间窗口), W是指在当前时刻t前面的a时间窗口里, 所有访问页面所组成的集合, |W(t,a)|表示工作集的大小, 即页面数目
常驻集: 当前时刻, 进程实际驻留内存的页面集合
工作集和常驻集的关系, 工作集是进程运行过程中固有的性质, 常驻集取决于系统分配给进程的物理页面数和页面置换算法
访存链表: 维护窗口内的访存页面链表, 访存时换出不在工作集的页面, 更新访存链表, 缺页时, 换入页面, 更新访存链表, 开销也很大

缺页率算法
缺页率: 缺页次数/内存访问次数或者缺页平均时间间隔的倒数
影响缺页率的因素: 页面置换算法, 分配给进程的物理页面数, 页面大小, 程序的编写方法
缺页率置换算法通过调整常驻集大小, 使得缺页率保持在一个合理的范围内, 访存时, 设置引用标志位, 缺页时计算上次缺页时间到现在的时间间隔, 如果大于常数T, 说明缺页比较低, 减小常驻集, 如果小于T, 则缺页率较高, 增大常驻集
抖动: 进程物理页面太少, 不能包含工作集, 造成大量缺页频繁置换, 进程运行速度变慢
原因是随着驻留内存的进程数目增加, 分配给每个进程的物理页面不断减少, 缺页率不断上升, 解决办法负载控制, 通过调节并发进程数, 来进行系统负载控制

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值