虚拟存储器


文章目录

        • 只使用物理地址的弊端
        • 简述虚拟存储器
        • 请求分页管理方式
        • 内存分配策略
        • 页面置换算法

只使用物理地址的弊端 首先, 主存的容量是有限的, 每一个进程都独占一块内存地址很难实现. 实际上, 不同进程在不同时刻可以使用同一块物理地址.
进程间通信的需求, 如果每个进程都独占一块物理地址, 就只能通过socket通信, 如果使用同一块地址就可以实现数据共享
主存保护, 实现对不同的段赋予不同的读/写/执行权限
简述虚拟存储器 由于程序运行的局部性原理, 程序在运行之前, 没必要全部装入内存, 只需要将当前运行所需的少量页/段加载到内存, 同时操作系统会为这个进程分配一段虚拟地址, 然后通过查找页表等机制完成虚拟地址到物理地址的映射
通过调用请求调页和页面置换功能来实现页面的换进换出
程序在运行时, 如果它要访问的数据所在的页面不在内存中(通过查找页表项可以知道), 它会调用os提供的请求调页功能, 将他们调入内存.
如果此时内存已满, 还会调用页面置换的功能, 将内存中暂时不用的页换到交换空间, 再将所需的页换入内存. 页面置换算法有 FIFO, LRU, Clock

由上面的简述可以总结出, 虚拟存储器的三大特征
  1. 多次性: 一个作业被分成多段调入内存执行
  2. 对换性: 程序运行过程中会换进换出
  3. 虚拟性: 从逻辑上扩充地址容量, 用户能用到的地址空间远大于物理空间
请求分页管理方式 分页机制下, 进程和页表是一对一的关系(这个页表可能是一级或多级的). 每个页表项中保存了该页的一些细节信息, 比如表示该页是否在主存, 读写, 修改, 访问频率等
分段机制下, 进程和段表是一对一的
段页式机制下, 进程和段表一对一, 段表和页表是一对多
请求分页中的地址变换过程
虚拟存储器
文章图片

其中要注意的是,
快表机制很像 Cache 高速缓存
缺页中断是在指令执行期间完成处理的, 发现要访问的指令或数据(取址, 取数期间)不存在内存中, 便发出中断信号, 并处理却页.
内存分配策略 (1) 固定分配局部置换
开始我每个进程分配固定的块, 置换也是在这个范围内
(2) 可变分配全局置换
os自身保持一个空闲物理块队列, 仅当空闲物理块用完时, os才会从内存中选择一个页换出
【虚拟存储器】(3) 可变分配局部置换
在局部置换的基础上, 通过附加物理块使缺页率保持在一定范围
页面置换算法 (1) 最佳置换 Optimal
这是一种理论上的算法, 它选出的要淘汰的页面, 将会是之后最大概率不会被使用到的. 或者所是最长时间不用到的. 这种情况下可以保证最低的缺页率
(2) 先进先出 FIFO
这个算法总是先淘汰最先进入内存的页面, 页面之间可以组织成一个链式队列的形式.
但是没有考虑到程序运行的局部性原理, 比如全局变量, 常用函数等等这些经常会被访问. 所以这个算法下缺页率是比较高的
(3)LRU最近最少使用
根据页面的最近使用频度来判断换出. 该算法有两种实现方式
  • 通过寄存器实现. 每个页面保持一个寄存器, 当访问到该页面时, 高位置1. 同时定时信号每隔一段时间将寄存器右移. 这样, 寄存器中具有最小数值所对应的页面就是最近最少使用的
  • 链式栈, 该栈保存页面的页号. 每当访问一个内存中的页面, 就将该页面的页号放到栈顶, 这样栈低就是最近最少使用的页面号. 缺点是每次访问都需要更新, 访问代价大
(4)Clock时钟算法
结合FIFO算法, 将页面组织成一个循环队列, 循环的检查各页的使用情况. 同时为每页设置一个访问位, 当某页被访问时, 访问位置1.
选择一个页淘汰时, 如果访问位是0, 将该页换出; 如果是1, 置0, 暂时不换出
改进型的Clock算法, 增加一个修改位, 如果一个页修改过, 换出时还要写回磁盘. 这样考虑到置换的代价, 优先选择最近未被访问且未被修改的页

    推荐阅读