十、虚拟存储器(一)

提纲

  • 硬件和控制结构
    • 虚拟页式存储管理
    • 虚拟段式存储管理
    • 虚拟段页式存储管理
  • 操作系统软件
    • 调页、放置和替换策略
    • 驻留集和工作集管理
    • 清除(回写)策略
    • 加载(并发度)控制
  • 虚拟存储管理实例

7.1硬件和控制结构

  • 虚拟存储的关键基础
  • 局部性与虚拟存储
  • 页式虚拟存储
  • 段式虚拟存储
  • 段式和页式结合的虚拟存储
  • 共享与保护

7.1.1虚拟存储的关键基础

  • 动态地址转换(重定位)
    • 进程中的逻辑地址在运行时动态转换成物理地址,从而进程可被交换出/入内存,前后所占内存位置可以不同
  • 不连续分配
    • 进程可分为几块(页/段),且这些块可分别存储到内存的不连续区域里
  • 部分加载
    • 运行时进程的所有页/段不必都在内存里,只要下一条要执行的指令和下一个要访问的数据在内存里即可
    • 操作系统仅把程序起始的一个或几个块装进内存
    • 页表/段表表项中有二进制位指示块是否在内存中,进程中驻留在内存的部分成为驻留集
    • 若逻辑地址访问不在内存中的块,则产生一个访问内存错误的中断
    • 操作系统响应中断
      1. 将进程置于阻塞态
      2. 发出一个磁盘I/O请求,将逻辑地址访问的块读入内存
      3. 在执行I/O操作期间,分派另外一个进程运行
      4. 磁盘I/O完成时产生一个中断,操作系统把受影响的进程置于就绪队列
    • 采用部分加载,内存中可同时容纳更多进程
      • 每个进程都只加载一部分,更多进程中应该也会有更多的就绪进程,从而提高CPU效率
    • 采用部分加载,进程可以比内存大,实现了虚拟存储
      • 用户进程可以使用的独立于物理内存的逻辑地址单元组成存储空间(虚拟存储)
      • 逻辑地址空间可以比物理地址空间大,例如,设物理内存64KB,1KB/页,则物理地址需要16位,而逻辑地址可以是28位!
      • 虚拟存储由内存和外存结合实现
虚拟存储技术的特征
  • 不连续性
    • 物理内存分配的不连续
  • 部分交换
    • 与交换技术相比,虚拟存储和调入和调出是对部分虚拟地址空间进行的
  • 大空间
    • 总容量不超过物理内存和外存交换区容量之和
  • 虚拟存储的实现模型
    • MMU,存储管理单元,位于CPU内
      image

7.1.2程序局部性与虚拟存储

  • 局部性原理
    • 一段时间内进程的运行往往呈现出高度的局部性,表现为只运行某一段程序,只访问某一块数据区
  • 空间局部性
    • 在执行期间的短时间内,访问的地址集合聚集在程序的某个局部区域中
  • 时间局部性
    • 模块在程序运行期间只在某些很短的时间内被调用
  • 程序局部性示例图:
    image
虚拟存储的要求与抖动问题
  • 虚拟存储管理要求
    • 为了容纳更多进程,每个进程只有一小部分在内存中
    • 如果内存满时操作系统若要调入新的块,则必须要把内存中的某一块换出去
    • 操作系统必须在新的块要使用之前就换入它
  • 抖动(thrashing)问题
    • 交换操作过于频繁,导致CPU忙于处理“交换”或等待,而非执行用户程序(页交换涉及外存读写,比内存访问慢)
  • 局部性原理保证虚拟存储系统的可行性和效率性
    • 内存可容纳更多进程
    • 算法优化交换效率,避免抖动,如根据最近的历史记录猜测哪些块最近最不可能使用到
虚拟内存必要的支持
  • 硬件支持
    • 内存管理硬件必须要支持分页/分段所需的动态地址转换等,如早期Unix因运行平台的处理器不支持分页/分段而不支持虚存
    • 除一些老式计算机系统(如MS-DOS)和专用系统外,当前主流操作系统均支持虚拟存储
  • 软件支持
    • 操作系统必须管理内存与外存之间的页/段/段&页交换
    • 调页策略、放置策略、替换策略
    • 驻留集和工作集原理
    • 清除(回写)策略、加载(并发度)控制

7.1.3虚拟分页

image

  • 页表项(PTE)包括:
    • Present:在不在内存
    • Modified:有没有被修改
    • Protection:保护码,一位或多位(rwe:读/写/执行)
    • Referenced:有没有被访问
    • Cache:是否禁止缓存
  • 页表长度不定,取决于进程大小
    • 不适合用寄存器存储页表,而是存放在内存
  • 页表起始地址保存在一个CPU专用寄存器(Inter CPU的为CR3)
页式虚拟存储的地址转换

image

页表组织办法
  • 页表可能会非常大,从而占用内存也非常大
    • 例子:设逻辑地址为32位,每页(\(2^{12}\)=)4KB,则一个进程的页表就可能有\(2^{20}\)个表项
  • 通常也对页表进行分页
    • 进程运行时,部分页表必须在内存里(包括正在使用的页面对应的表项)
  • 多级页表
    • 既然一张页表通常需要几个页框来存储,一种页表的组织结构是多级层次,采用多级层次组织的页表称为多级页表
  • 反向页表
    • 如PowerPC、SPARC、IA-64的反向页表
多级页表
  • 多级页表是一种多级层次组织结构
    • 若采用二级页表(如32位的x86 CPU),则页号被划分为两个域:PT1和PT2
    • 顶级页表(内存中)以PT1为索引,其表项指向二级页表,二级页表以PT2为索引
    • 除顶级页表外的其他页表可以在内外存间交换
    • 对64位处理器,一般采用三级页表
      • Linux为了通用,采用支持64位处理器的三级页表结构,对32位CPU,设中间页表的表项个数为1解决
        image
  • 二级页表
    image
  • 二级页表的地址转换
    image
64位处理器与反向页表
  • 对64位CPU,若页面大小为4KB,则页表有\(2^{52}\)个表项,如果每个表项占8个字节,则整个页表需\(8*2^{52}\)B=32PB=32768TB存储空间!
  • 当物理内存远小于虚拟内存(CPU的可寻址空间)时,在内存中创建虚拟存储空间中的页对应的所有页表项,显然是不明智的
  • 反向页表
    • 实际内存的每个页框对应一个页表项(不是每个虚拟内存的页有一个页表项)
    • 页表项的内容为(进程ID,页号)=(n,p),记录定位于该占用页框的进程号和页号
      image
  • 优点:当物理内存较小时,反向页表可大量节省空间
  • 缺点:从虚拟地址转换到物理地址变得非常困难(不能使用CPU所提供的页框号映射机制,需搜索整个反向页表,查找对应于页表项(n,p)的页框号)
  • 反向页表详细流程
    image
转换后备缓冲区TLB
  • TLB = Translation Lookaside Buffer(查表缓冲区/转换缓冲区,缓冲页表)
  • 页表存储在内存,每次内存引用至少要访问两次内存,大大影响效率
  • 设置特殊的硬件装置————TLB缓存页表(联想存储器)
    • 存储少量最近常用的页表表项
  • TLB表项内容:有效位、页号、修改位、保护码、页框号等
    image
  • 使用TLB地址转换工作流程
      1. 给定一个逻辑地址,CPU首先检查TLB,判断页号是否存在
      1. 若存在(命中,hit),则直接从TLB中提取页框号,并形成物理地址
      1. 若不存在(不中/未命中,miss),则按普通访问页表方式工作,形成物理地址,并更新TLB(新页表表项替换一个TLB表项)
  • 不使用TLB的地址转换工作流程
    • 由页号去页表检查该页在不在内存(P位)
    • 若在,形成物理地址
    • 若不在,则产生页错误并发出缺页中断,由操作系统将页调入内存并更新页表,进而形成物理地址
  • TLB的一些细节
    • 逻辑地址中的页号与TLB表项的匹配检查由硬件实现,是并行的————关联映射
    • TLB中每个表项的页号部分必须包含页号的所有域,只有整个页号匹配时才算命中
    • TLB应随着进程的切换而刷新
      • 提供一条清除TLB中有效位的机器指令
      • 扩充TLB使包含一个进程标识域,同时增加一寄存器保存当前进程标识符
页大小问题
  • 页大小是一个重要的硬件设计问题
    • 小页有利于减少内碎片总量
    • 大页有利于减少每进程的页表容量
    • 大页有利于实现有效的磁盘数据块传送
  • 有些处理器支持多种页大小(也是发展趋势),例如:
    • x86支持4种:4KB、4MB、 2MB、 1GB
    • IA-64支持8种:4KB、8KB、64KB、256KB、1MB、4MB、16MB、256MB
    • R4000( MIPS 于1991年10月1日发布的64位CPU)支持7种:4KB到16MB
页大小与缺页率
  • 缺页率
    • 缺页次数/内存访问次数
    • 缺页的平均时间间隔
  • 页大小会影响缺页率
    • 页很小:每个进程的内存页较多,通过调页很快适应局部性原理的要求,缺页率低
    • 页很大:进程使用的大部分地址空间都在内存,缺页率低
    • 页中等大小:局部性区域只占每页的较小部分,缺页率高
  • 页大小也受软件策略影响
  • 页大小固定时,缺页率与分配给进程的内存页框数目的关系:
    • 分配给进程的内存页框数可少于进程所需页总数
    • 数目越多,缺页率越低
    • 页框数目的下限是一条指令及其操作数可能涉及页数
      • 足以保证进程的每条指令都能被执行
  • 程序的典型分页行为
    image

7.1.4虚拟段式存储管理

  • 段式存储的优点
    • 简化处理动态增长的数据结构
    • 支持模块的独立修改和重编译
    • 更有效的进程保护
    • 更容易实现保护
  • 虚拟段式存储管理的组织
    • 段表:由表项组成,每个进程一张
    • 段表长度不定,存放在内存
    • 当前进程的段表起始地址保存在CPU的一个专用寄存器里(如Inter CPU为LDTR/GDTR)
    • 进程中有的段可能不在内存中(位于外存)
  • 段式地址与段表表项
    image
  • 虚拟段式存储的地址转换
    image

7.1.5分段和分页优缺点对比

优势 不足
分页 内存利用率高
消除了外部碎片
固定分页大小易于存储管理
程序员透明(不可见)
不方便按逻辑模块共享与保护*
分段 程序员可见
动态应对数据增长
支持共享和保护
断长过大易导致外部碎片

*程序的页结构和数据对程序员不可见

7.1.6虚拟段页式存储管理

  • 结合分页和分段的优点,克服两者的缺点
  • 基本原理
    • 将程序按逻辑结构划分成若干段,每个段进一步划分为若干个页
    • Present位和Modified位只含在页表表项中
    • 保护和共享位通常在段表表项中
    • 只有缺页没有缺段
  • 页表和段表
    image
段页式中的逻辑地址
  • 程序中的逻辑地址包含由两个部分:(段号,段内偏移)
  • 操作系统将程序的逻辑地址分解为三个部分:(段号,页号,页内偏移)
  • 逻辑地址(n,p,d)中,程序员可见的是段号n以及段内偏移,段内偏移分解为页号p以及页内偏移d,对程序员透明(假设页的大小是2的m次幂)
  • 地址转换:综合分页和分段
  • 虚拟段页式存储的地址转换
    image

7.1.7共享和保护

  • 共享
    • 不同进程间可以共享代码段和数据段
    • 实现:段表表项记录相同的段起始地址
  • 保护
    • 越界保护(段基址&断长)
    • 访问方式保护(权限,如读写保护)
    • 环保护(模式&级别)
      image
环保护
  • 分层访问模式:
    • 中心0号环为内核模式
    • 内环1号环为执行模式
    • 中环2号环为管理模式
    • 外环3号环为用户模式
      image
  • 程序只能访问同层或更外层的数据
  • 程序可以调用同层或更内存的服务
  • CHM(change-mode,改变模式)
  • REI(return from exception or interrupt,从异常或中断返回)
posted @ 2024-11-25 13:47  韦飞  阅读(308)  评论(0)    收藏  举报