4 虚拟内存

概述

  1. 起因:应用程序对内存的容量的需求大于内存容量的增长速度
  2. 解决办法:
    • 起初,OS的内存管理能力较弱,程序员可以采取手动覆盖(overlay)的方法,自己编写程序,只将需要的程序和数据留在内存中,不需要的放硬盘(代表:DOS系统)
    • 后期,当程序太多,超出内存容量时,可采用自动的交换(swapping)技术,将暂时不使用的程序送到外存
    • 现在,如果想要在有限的内存中,以更小的页粒度放入更多、更大的程序,可以采用自动的虚拟存储技术

覆盖技术(Overlay)

  1. 按照程序自身逻辑结构,对程序功能模块进行拆分,对不会同时执行的模块,按时间先后加载到内存中去

    • 程序必要模块(常用功能)的代码和数据常驻内存,同时负责该程序的内存调度
    • 对于可选功能(不常用功能),平时存放在外存中,只在被调用时才加载到内存中去
    • 对于不存在相互调用关系的模块,在不同时间段加载到同一块内存分区,可以相互覆盖

    image-20200708103224490

  2. 缺点:

    • 程序员需要对程序的功能模块进行拆分,考虑程序的覆盖顺序,增加了程序员的设计开销
    • 覆盖模块从外存加载到内存,IO增加了时间开销

交换技术(Swapping)

  1. 通过将暂时不运行的程序存放到外存中,以腾出空闲内存空间
    • Swap in:OS从外存中某个进程的地址空间读入内存
    • Swap out:当内存空间不够时,OS在MMU的帮助下,将内存中一个进程的整个地址空间的内容存放到外存中
    • 换入换出的大小为整个程序的地址空间
    • 交换过程由OS管理,对程序员透明
  2. 问题
    • 何时交换? 交换时间开销较大, 只有当内存空间不足或有不足的风险时换出
    • 交换区大小:必须足够大,以存放所有用户进程的所有内存映像的拷贝
    • 程序换入时的重定位:换出后再换入的内存位置一定要在原来的位置上吗?- 最好采用动态地址映射的方法
  3. 覆盖 vs 交换
    • 覆盖需要程序员给出程序的逻辑覆盖结构,交换则完全由OS负责
    • 交换发生在程序与程序之间,覆盖发生在程序内部的模块之间

虚拟内存技术

  1. 原理: 将内存中暂时不运行的程序、数据存放到外存中去

  2. 与覆盖和交换技术的对比

    • 虚存技术和覆盖技术都是只加载程序的一部分到内存中去,但覆盖技术需要由程序员手动给出程序的逻辑覆盖结构,而虚存技术则是由OS进行管理
    • 虚存技术和交换技术都会将内存中暂时不用的程序、数据存放到外存中去,但交换技术是将内存中整个进程的代码和数据swap out到外存中,而虚存技术只是将程序部分代码、数据存放到外存
  3. 如何实现OS自动管理? → 程序局部性原理

    • 时间局部性:一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短的时期内
    • 空间局部性:一条指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内
    • 程序局部性表明,从理论上说,虚存技术是能够实现的,而且实现以后应该是能够得到一个满意的效果的
  4. 可以在页式或段式内存管理的基础上实现

    • 在装入程序时,不必将整个程序装入内存,只需将当前需要执行的部分页或段装入内存,即可让程序运行
    • 在程序执行中,如果需要执行的指令或访问的数据尚未在内存中(缺页或缺段异常),则由处理器通知OS将相应页/段调入内存,然后继续执行程序
    • 当内存不足时,OS将内存中暂时不使用的页 / 段保存到外存上,从而腾出更多空闲空间存放将要装入的程序及将要调入的页 / 段

    image-20200708144157442

  5. 基本特征:

    • 大的用户空间:通过将物理内存和外存相结合,使得提供给用户的虚拟内存空间大于实际的物理内存,即实现二者的分离
    • 部分交换:与交换技术相比,虚存技术的调入调出是对部分虚拟空间进行的
    • 不连续性:物理内存分配不连续;虚拟地址空间也是不连续的(不连续的物理内存swap out导致)
  6. 虚拟页式存储管理

    • 大部分虚拟存储系统均采用虚拟页式存储管理技术,即在页式存储管理的基础上,增加请求调页和页面置换功能

    • 基本原理

      • 当一个用户程序要调入内存时,不是将程序的所有页面都装入内存,而是只装入部分页面,就可启动程序运行
      • 运行过程中,如果发现要运行的程序或访问的数据不在物理内存中,则CPU向OS发出缺页中断请求。系统处理该中断时,将外存相应页面调入内存,使该程序能够继续运行(内存已满时,采用页面置换算法)。
    • 页表表项 -- 增加了部分标识位flags
      image-20200708201435190

      • 驻留位(resident bit):表示该页是否在物理内存中。1表示存在于内存中,该页表项有效;0表示该页还在外存中,若访问该页将导致缺页中断。
      • 保护位:表示允许对该页做何种类型的访问(如只读、可读写、可执行等)
      • 修改位(dirty bit):表示该页在内存中是否被修改过,当系统回收该物理页面时,根据该位决定是否将该页写到外存。若未修改过,可直接释放内存。
      • 访问位(access bit):表示该页在内存中是否被访问过。如果该页被频繁访问,则页面置换时不应将其换到外存中;反之,说明该页不常被访问,可置换到外存中
    • 缺页中断处理过程:

      1. 如果内存中有空闲的物理页面,则分配一物理页帧,然后转步骤4,否则转2
      2. 采用某种页面置换算法,选取一将被置换的物理页帧f,其对应的逻辑页号为q。若页帧f在内存中被修改过,则将其写回外存
      3. 修改q对应的页表项,驻留位置为0
      4. 将需要访问的页p装入物理页面f中
      5. 修改p对应的页表项的内容,将驻留位置1,物理页帧号置f
      6. 重新允许被中断的指令
    • 后备存储(Backing Store)--> 二级存储

      • 一个虚拟地址空间的页面可以被映射到一个文件(在二级存储中)中的某个位置
      • 代码段:映射到可执行二进制文件,需要执行相应的指令时才被加载到内存中去
      • 动态加载的共享库程序段:映射到动态调用的库文件
      • 其他段:可能被映射到交换文件
    • 虚拟内存性能 -- 衡量分页开销

      • 通过有效存储器访问时间EAT(Effective memory Access Time)衡量

      • EAT = 访存时间 x 页表命中率 + 缺页中断处理时间 x 缺页中断几率

      • 例子:

        - 访存时间:10 ns
        - 磁盘访问时间:5 ms
        - 参数p -- page fault(缺页中断)几率
        - 参数q -- dirty page几率 (内存修改位为1,需要Swap Out)
        - EAT = 10(1 - p) + 5,000,000p(1 + q)
        
posted @ 2022-02-16 14:09  DreamEagle  阅读(68)  评论(0编辑  收藏  举报