操作系统-虚拟内存
传统存储方式特点 - 一次性:作业必须一次性全部装入内存后才能开始运行; - 驻留性:一旦作业装入内存,就会一直驻留在内存中,直至作业结束; 局部性原理 - 时间局部性 - 空间局部性 ## 虚拟内存 - 基于局部性原理,在程序装入时,可以将程序中很快会用到的部分装入内存,暂时用不到的部分留在外存,就可以开始执行程序; - 在程序执行过程中,当访问的信息不在内存时,由操作系统负责将所需信息调入内存,然后继续执行程序;(请求调页/请求调段) - 若内存空间不够,由操作系统负责将内存中暂时用不到的信息换到外存;(页面置换/段置换) #### 虚拟内存容量 虚拟内存最大容量:由计算机地址结构(CPU寻址范围决定),如32位计算机地址结构:2^32B=4GB; 虚拟内存实际容量:min(内外存容量之和,CPU寻址范围); #### 特征 - 多次性; - 对换性; - 虚拟性; ## 请求分页管理方式 #### 请求页表 - 内存块号 - 状态栏:表示页面是否已在内存中; - 访问字段:记录最近被访问过几次,或记录上次访问的时间,供置换算法选择换出页面时参考; - 修改位:表示页面调入内存后是否被修改过; - 外存地址:页面在外存中存放的位置; #### 缺页中断机构 - 在请求分页系统中,当访问的页面不在内存(状态位为0)时,便产生一个缺页中断,由操作系统的缺页中断处理程序处理中断。 - 此时缺页的进程阻塞,放入阻塞队列,调页完成后再将其唤醒,放回就绪队列。 - 如果内存中有空闲块,则为进程分配一个空闲块,将所缺页面装入,并修改相应页表项; - 如果内存中没有空闲块,则由页面置换算法选择一个页面淘汰,若该页面被修改过则需写回外存; #### 地址变换机构 - 找到页表项时需检查页面是否在内存中; - 若页面不在内存中,需请求调页; - 如内存空间不够,需换出页面; - 页面调入内存后,需要修改相应页表项; ## 页面置换算法 追求更小的缺页率(缺页次数/访问次数)。 #### 最佳置换算法 每次选择以后永不使用,或长时间内不再被访问的页面淘汰,保证最低缺页率。 操作系统无法预判,所以无法实现。 #### 先进先出置换算法(FIFO) 每次淘汰最早进入内存的页面。FIFO会产生Belady异常。 Belady异常:当为进程分配的物理块数增大时,缺页次数不减反增。 #### 最近最久未使用置换算法(LRU) 每次淘汰最近最久未使用的页面。用访问字段记录上次被访问以来经历的时间t。 性能好,但实现困难、开销大。 #### 时钟置换算法(CLOCK) 简单的CLOCK算法: - 为每个页面设置一个访问位,通过链接指针链接成一个循环队列; - 一个页面被访问时,访问位设为1; - 需要淘汰一个页面时,按队列顺序检查访问位,访问位为0则换出,访问位为1则设为0; 简单的CLOCK算法仅考虑一个页面最近是否被访问过。事实上,只有被修改过的淘汰页面才需要写回外存,因此没有被修改过的页面应该优先淘汰,避免I/O操作。 改进型的时钟置换算法: -用(访问为,修改位)表示各页面状态; - 第一轮:扫描找到第一个(0,0)页面用于替换,不修改任何标志位; - 第二轮:若第一轮扫描失败,则继续扫描查找第一个(0,1)的帧用于替换,并将扫描过的访问位设为0; - 第三轮:若第二轮扫描失败,则继续扫描查找第一个(0,0)的帧用于替换,不修改任何标志位; - 第四轮:若第三轮扫描失败,则继续扫描查找第一个(0,1)的帧用于替换; ## 页面分配策略 驻留集:指请求分页存储管理中给进程分配的物理块的集合。 采用了虚拟存储技术的系统中,驻留集一般小于进程总大小。 - 驻留集太小,换页频繁,开销大; - 驻留集太大,并发度小,资源利用率低; 固定分配 VS 可变分配:驻留集大小是否可变; 局部置换 VS 全局置换:是否可以将其他进程的物理块换出; - 固定分配局部置换:很难在刚开始就为每个进程分配合理的物理块数量,灵活性差; - 可变分配全局置换:部分进程物理块被减少,导致缺页率过高; - 可变分配局部置换:根据缺页的频率来动态调整进程物理块; #### 何时调入页面 - 预调页策略:进程运行前预测不久之后可能访问到的页面,用于首次调入,由程序员指出; - 请求调页策略:进程运行期间发现缺页才将所缺页面调入内存,需要频繁的I/O操作; #### 从何处调入页面 外存分为文件区和对换区。 |对换区|文件区| |:---:|:---:| |读写速度快|读写速度慢| |连续分配|离散分配| |一般空间较小|一般空间较大| - 对换区空间充足:进程运行前相关数据复制到对换区,页面调入、调出都在内存和对换区进行; - 对换区空间不足:不会被修改的数据直接从文件区调入; - UNIX方式:运行之前进程相关数据全部放在文件区,运行时内存换出的页面写回对换区; #### 工作集 抖动(颠簸)现象:刚刚换出/换入的页面马上又要换入/换出,频繁缺页。 工作集:在某段时间间隔里(窗口尺寸),进程实际访问页面的集合。 一般驻留集大小不能小于工作集大小,否则容易频繁缺页。