背景

虚拟内存是非连续内存分配的一个延续,非连续内存分配在存储空间内可以连续也可以不连续。虚拟内存是在非连续内存分配基础上,可以把一部分内容放到外存中去,让应用程序有更大的空间使用。

需求背景:增长迅速的存储需求,程序规模的增长速度远远大于存储器容量的增长速度。

解决办法

  • 覆盖 ( overlay )

    应用程序手动把需要的指令和数据保存在内存中

  • 交换 ( swapping )

    操作系统自动把暂时不能执行的程序保存到外存中

  • 虚拟存储

    在有限容量的内存中,以页为单位自动装入更多更大的程序

覆盖技术

目标 :在较小的可用内存中运行较大的程序

方法 :依据程序逻辑结构,将程序划分为若干功能相对独立的模块,将不会同时执行的模块共享同一块内存区域

  • 必要部分(常用功能)的代码和数据常驻内存
  • 可选部分(不常用功能)放在其他程序模块中,只在需要用到时装入内存
  • 不存在调用关系的模块可相互覆盖,共用同一块内存区域

注:不存在相互调用关系可以分成一个覆盖区

不足

  • 增加编程困难
    • 需程序员划分功能模块,并确定模块间的覆盖关系
    • 增加了编程的复杂度
  • 增加执行时间
    • 从外存装入覆盖模块
    • 时间换空间

交换技术

目标:增加正在运行或需要运行的程序的内存

实现方法:

  • 可将暂时不能运行的程序放到外存
  • 换入换出的基本单位是整个进程的地址空间
  • 换出(swap out):把一个进程的整个地址空间保存到外存;
  • 换入(swap in):将外存中某进程的地址空间读入到内存;

交换技术面临的问题

  • 交换时机

    只当内存空间不够或有不够的可能时换出

  • 交换区大小

    存放所有用户进程的所有内存映像的拷贝

  • 程序换入时的重定位

    采用动态地址映射的方法

覆盖和交换的对比

  • 覆盖
    • 只能发生在没有调用关系的模块间
    • 程序员须给出模块间的逻辑覆盖结构
    • 发生在运行程序的内部模块间
  • 交换
    • 以进程为单位
    • 以进程为单位
    • 发生在内存进程间

虚拟内存技术目标

  • 只把部分程序放到内存中,从而运行比物理内存大的程序

    由操作系统自动完成,无需程序员的干涉

  • 实现进程在内存与外存之间的交换,从而获得更多的空闲内存空间

    在内存和外存之间只交换进程的部分内容

局部性原理

程序在执行过程中的一个较短时期,所执行的指令地址和指令的操作数地址,分别局限于一定区域

  • 时间局部性

    一条指令的一次执行和下次执行,一个数据的一次访问和下次访问都集中在一个较短时期内

  • 空间局部性

    当前指令和邻近的几条指令,当前访问的数据和邻近的几个数据都集中在一个较小区域内

  • 分支局部性

    一条跳转指令的两次执行,很可能跳到相同的内存位置

局部性原理的意义
从理论上来说,虚拟存储技术是能够实现的,而且可取得满意的效果

虚拟存储概念

将不常用的部分内存块暂存到外存

原理

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

实现方式

  • 虚拟页式存储
    • 在页式存储管理的基础上,增加请求调页和页面置换
    • 当用户程序要装载到内存运行时,只装入部分页面,就启动程序运行
    • 进程在运行中发现有需要的代码或数据不在内存时,则向系统发出缺页异常请求
    • 操作系统在处理缺页异常时,将外存中相应的页面调入内存,使得进程能继续运行
  • 虚拟段式存储

缺页异常

  1. 在内存中有空闲物理页面时,分配一物理页帧 f,转第 5 步
  2. 依据页面置换算法选择将被替换的物理页帧 f,对应逻辑页 q
  3. 如 q 被修改过,则把它写回外存
  4. 修改 q 的页表项中驻留位置为0
  5. 将需要访问的页 p 装入到物理页面 f
  6. 修改p的页表项驻留位为 1 ,物理页帧号为 f
  7. 重新执行产生缺页的指令

虚拟页式存储中的外存管理

在何处保存未被映射的页

  • 应能方便地找到在外存中的页面内容

  • 交换空间(磁盘或者文件)

    采用特殊格式存储未被映射的页面

注:可以用一个文件来存这些未被映射的页

虚拟页式存储中的外存选择

  • 代码段:可执行二进制文件(代码指向相应的可执行文件)
  • 动态加载的共享库程序段:动态调用的库文件(共享库也有相应的目标文件,所以上两项不改)
  • 其它段:交换空间(数据段,堆栈)