虚拟存储管理(一)


虚拟存储的需求

前面的物理内存管理都基于一个基本要求:执行指令必须在物理内存中。这使得程序的大小被限制在物理内存的大小以内。实际上,在程序中,并不是需要将整个程序放到内存中,比如:程序中处理异常和错误条件的代码;数组、链表和表通常分配比实际所需要分更多的内存;程序的某些功能可能会很少使用。

即使在需要完整程序时,也不是同时需要所有的程序模块。

因此,虚拟存储提出的背景就是:计算机的物理内存经常不够。

通常可以采用三种方法解决此问题:

  • 覆盖:应用程序手动把需要的指令和数据保存在内存中,实现比较复杂
  • 交换:操作系统自动把暂时不能执行的程序保存到外存中,交换单位是整个进程,开销比较大
  • 虚拟存储:在有限容量的内存中,以页为单位自动装入更多更大的程序

交换和覆盖

覆盖技术

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

方法

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

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

缺点

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

交换技术

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

注意:交换技术与覆盖技术的应用情况并不相同。

覆盖技术的应用场景是整个内存空间都无法满足一个程序的内存要求,此时通过覆盖技术使内存空间可以满足这个程序的运行要求。

而交换技术的前提是内存空间能够装下这个程序,但由于多道程序的原因,此时这个程序的内存空间被另一个程序占用,导致这个程序的内存不够。

实现方法

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

问题

  • 交换时机:只当内存空间不够或者有不够的可能时换出
  • 交换区大小:存放所有用户进程的所有内存映象的拷贝
  • 程序换入时的重定位:采用动态地址映射的方法

覆盖和交换的比较

覆盖

  • 只能发生在没有调用关系的模块间
  • 程序员必须给出模块间的逻辑覆盖结构
  • 发生在运行程序的内部模块间
  • 很难让操作系统来实现

交换

  • 以进程为单位
  • 不需要模块间的逻辑覆盖结构
  • 发生在内存进程间
  • 可以由操作系统实现

局部性原理

虚拟存储技术的目标

  • 只把部分程序放到内存中,从而运行比物理内存大的程序,此操作由操作系统自动完成,无需程序员的干涉(对比覆盖技术)
  • 实现进程在内存与外存之间的交换,从而获得更多的空闲内存空间,在内存和外存之间只交换进程的部分内容(对比交换技术)

虚拟存储的局部性原理

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

  • 时间局部性

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

  • 空间局部性

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

  • 分支局部性

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

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

虚拟存储

思路:将不常用的内存块暂存到外存

原理

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

实现方式:虚拟页式存储和虚拟段式存储

虚拟存储的特征

  • 不连续性:

    物理内存分配非连续

    虚拟地址空间使用非连续

  • 大用户空间:可以提供给用户的虚拟内存可大于实际的物理内存

  • 部分交换:虚拟存储只对部分虚拟地址空间进行换入和换出

第二和第三个特征就是对覆盖和交换技术的改进

支持技术

  • 硬件:页式或段式存储中的地址转换机制
  • 操作系统:管理内存和外存间页面或段的换入和换出

虚拟页式存储

在页式存储管理的基础上,增加请求调用页和页面置换

思路

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

页表项结构

与连续内存管理的页式存储相比较,页表项中多了几个标志位,分别是访问位、修改位、保护位和驻留位。

驻留位:表示该页是否在内存中

  • 1表示该页位于内存中,该页表项是有效的,可以使用
  • 0表示该页当前在外存中,访问该页表项将导致缺页异常

修改位:表示在内存中的该页是否被修改过

  • 回收该物理页面时,据此判断是否要把它的内存写回外存

访问位:表示该页面是否被访问过(读或写)

  • 访问过是1,没访问过是0
  • 用于页面置换算法

保护位:表示该页的允许访问方式,只读、可读可写、可执行等

缺页异常

处理流程

虚拟内存管理3

对于第4步页面换入,实际上有两种情况,一是物理内存中有空闲页帧,直接调入就可以了,二是物理内存已满,此时需要将不用的页面换出,换入需要的页面。具体流程如下:

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

虚拟页式存储的外存管理

1.在何处保存未被映射的页?

  • 应能方便地找到在外存中的页面内容
  • 交换空间(磁盘或文件),采用特殊格式存储未被映射的页面,比如Linux/Unix中的swap分区

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

  • 代码段:可执行二进制文件
  • 动态加载的共享库程序段:动态调用的库文件
  • 堆栈、数据等其他段:交换空间

虚拟页式存储管理的性能

有效存储访问时间:

EAT = 访存时间 * (1 - p) + 缺页处理异常时间 * 缺页率p


文章作者: likai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 likai !
评论
 上一篇
下一篇 
数据结构之树 数据结构之树
前面提到的列表,队列,栈和链表都是线性的数据结构,数据元素之间都是一对一的关系,比如除了首尾元素外,内部的元素都有唯一的前驱和唯一的后缀。 除了线性结构外,另外一类数据结构是非线性结构,代表性的就是树,在非线性结构中,数据元素之间是一对多的
2020-08-02
  目录