操作系统虚拟内存管理

虚拟内存简介

虚拟内存概念

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存,而实际上该内存通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。在程序执行过程中,当所访问的信息不在内存时,由操作系统负责将所需信息从外存调入内存,然后继续执行程序。若内存空间不够,由操作系统负责将内存中暂时用不到的信息换出到外存。

虚拟内存的容量

虚拟内存的最大容量是由计算机的地址结构(cpu寻址范围)确定的,虚拟内存的实际容量=min(内存和外存容量之和,cpu寻址范围)。

虚拟内存的优点

  1. 可以处理比实际内存更大的文件或者数据。
  2. 可以让系统运行更多的程序实例,从而实现更加高效的内存利用。

虚拟内存的缺点

  1. 加大了对硬盘的读写,如果内存严重不足,会频繁引起内存和磁盘进行swap,从而降低系统性能。
  2. 虚拟内存本质上是充分了磁盘空间,但同时提供用户使用的实际磁盘空间也会变小。

如何实现虚拟内存(请求分页、请求分段、请求段页式)

虚拟内存的实现需要建立在离散分配的内存管理方式基础上。回忆一下传统的离散分配存储管理方式:基本分页存储、基本分段存储管理、基本段页式存储管理。

其对应虚拟内存的实现就是:请求分页存储管理、请求分段存储管理、请求段页式存储管理。

虚拟内存的实现与离散分配存储管理方式的主要区别在于虚拟内存多了以下三个步骤:

  1. 在程序执行过程中,当所访问的信息不在内存时,需要由操作系统负责将所需信息从外存调入内存,然后继续执行程序。(即操作系统要提供请求调页功能)
  2. 若内存空间不够,需要由操作系统负责将内存中暂时用不到的信息换带外存。(即操作系统要提高页面置换功能)
  3. 在请求调页和页面置换后,除了对慢表和快表进行修改外,还要对请求页表中新增的表项进行修改。

请求分页存储管理方式

请求分页管理的具体实现可以分为三部分:页表机制、缺页中断机构、地址变换机构。

页表机制

当所访问的信息不在内存时,为了实现“请求调页”,操作系统需要知道每个页面是否已经调入内存;如果还没调入那么也需要知道该页面在外存中存放的位置。

当内存空间不够时,要实现“页面置换”,操作系统需要通过某些指标来决定到底换出哪个页面;有的页面没有被修改过,就不用再浪费时间写回内存中。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要记录各个页面是否被修改的信息。

因此,请求分页所用的地址结构在基本分页的基础上增加了几个表项:

  • 状态位:表示页面是否在内存中。
  • 访问字段:记录最近被访问次数,或记录上次访问的时间,供置换算法选择出页面时参考。
  • 修改位:表示页面调入内存后是否被修改过,只有修改过的页面才需要在置换时写回外存。
  • 外存地址:页面在外存中存放位置。

基本页表分配管理方式与请求分页的管理方式的页表区别如下:
在这里插入图片描述

缺页中断机构

在请求分页系统中,每当所要访问的页面不在内存时,便产生一缺页中断,请求OS将所缺之页调入内存。

缺页中断是内中断(即异常),要经历诸如保护CPU环境、分析中断原因、转入缺页中断处理程序进行处理、恢复CPU环境等几个步骤。
缺页中断与一般的中断相比有着明显的差别,主要体现在以下两个方面:

  1. 在指令运行期间产生和处理中断信号。通常,CPU都是在一条指令运行完后,才检查是否有中断请求到达。若有,便去响应,否则,继续运行下一条指令。然而,缺页中断是在指令运行期间,发现所要访问的指令或数据不在内存时所产生和处理的。
  2. 一条指令在运行期间,可能产生多次缺页中断。在下图中示出了一个样例,在运行一条指令COPY A TO B时,可能要产生6次缺页中断,当中指令本身跨了两个页面,A和B又分别各是一个数据块,也都跨了两个页面。基于这些特征,系统中的硬件机构应能保存多次中断时的状态,并保证最后能返回到中断前产生缺页中断的指令处继续运行。
    在这里插入图片描述

地址变换机构

请求分页系统中的地址变换机构用于逻辑地址到物理地址的变换。其在基本分页系统地址变换机构的基础上,为实现虚拟内存而添加了某些功能而形成的,如产生和处理缺页中断,以及从内存中换出一页的功能等等。

下图表示出了请求分页系统中的地址变换过程:

  1. 程序请求访问一页(给出了逻辑地址(页号,页内偏移量))。
  2. 页号<=页表长度,否则越界中断。
  3. CPU查询快表。
  4. 快表命中,则修改访问位和修改位(修改位不一定要改),形成物理地址(注意的是:只有"写指令”才需要修改“修改位”。并且,一般来说只需要修改快表中的数据,只有要将快表项删除时才需要写回内存中的慢表,这样可以减少访问次数,值得一说的是删除快表中的页表项,一般会发生在内存页表被换出内存时)。
  5. 如果快表未命中,则访问慢表,命中,则修改访问位和修改位(注意),形成物理地址。
  6. 如果慢表未命中(状态位为0),则产生缺页中断,请求调页。
  7. 保留CPU现场,并从外存中找到缺页。
  8. 此时判断内存是否是满的,如果满了,就选择一页换出,选择页面如果被修改过,就将该页面写回外存,如果没有修改过,就进行下一步;如果内存未满,操作系统命令CPU从外存读缺页。
  9. 启动I/O硬件(此操作需要启动慢速的I/O操作,可见换入换出操作太频繁,会有很大的开销)。
  10. 将一页从外存换入内存并,修改页表(页面调入内存后,需要修改慢表,同时也需要将表项复制到快表)。

在这里插入图片描述

请求分页存储管理的整体流程图

在这里插入图片描述

请求分段存储管理方式(虚拟内存的实现)

在请求分段存储管理方式中,作业运行之前,只要求将当前需要的若干个分段装入内存,便可启动作业运行。在作业运行过程中,如果要访问的分段不在内存中,则通过调段功能将其调入,同时还可以通过置换功能将暂时不用的分段换出到外存,以便腾出内存空间。

为实现请求分段系统,系统应该配置段表机制、缺段中断机构、地址变换机构。

段表机制

在请求分段式管理中所需的主要数据结构是段表。由于在应用程序的许多段中,只有一部分段装入内存,其余的一些段仍留在外存上,故除了段名(号)、段长、段在内存中的起始地址外,段表中还增加了以下诸项:

  • 存取方式:用于标识本分段的存取属性是只执行、只读,还是允许读/写。
  • 访问字段A:其含义与请求分页的相应字段相同,用于记录该段被访问的频繁程度。
  • 修改位M:用于表示该页在进入内存后是否已被修改过,供置换页面时参考。
  • 存在位P:指示本段是否已调入内存,供程序访问时参考。
  • 增补位:这是请求分段式管理中所特有的字段,用于表示本段在运行过程中是否做过动态增长。
  • 外存始址:指示本段在外存中的起始地址,即起始盘块号。
    在这里插入图片描述

缺段中断机构

缺段中断机构与缺页中断机构类似,它同样需要在一条指令执行期间,产生和处理中断,以及一条指令执行期间可能产生多此缺段中断。由于分段是信息的逻辑单元,因而不可能出现一条指令被分割在两个分段中和一个信息被分割在两个分段中的情况。缺段中断的处理过程如图:
在这里插入图片描述

地址变换机构

请求分段系统中的地址变换机构是在基本分段系统地址变换机构的基础上形成的。因为被访问的段并非全在内存,所以在地址变换时,若发现所要访问的段不在内存,必须先将所缺的段调入内存,并修改段表,然后才能再利用段表进行地址变换。为此,在地址变换机构中又增加了缺段中断的请求及处理等功能,如下图所示:
在这里插入图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值