当前位置:   article > 正文

一文搞懂操作系统虚拟内存管理

虚拟内存管理

目录

一.知识总览

二.覆盖技术

2.1覆盖技术简介

2.2覆盖技术基本思想

三.交换技术

3.1交换技术的基本思想

 3.2交换技术的实现

3.3覆盖与交换的区别

四.虚拟存储技术

4.1虚拟内存的重要性

4.2虚拟内存的定义和特征

 4.3虚拟内存的实现

4.3.1请求分页的虚拟内存中的页表机制

4.3.2请求分页中处理缺页的步骤

4.3.3请求缺页中完整的页表结构

4.3.4虚拟内存空间的大小


一.知识总览

前文我们已经讲完了内存的分配与回收部分,我们今天来进入内存空间的扩充部分。

二.覆盖技术

2.1覆盖技术简介

早期的计算机系统中,主存容量很小,虽然主存中仅存放一道用户程序,但是存储空间放不下用户进程的现象也经常发生。比如 IBM 推出的第一台PC机最大只支持 1MB 大小的内存。因此经常会出现内存大小不够的情况。后来人们引入了覆盖技术,用来解决“程序大小超过物理内存总和”的问题。

2.2覆盖技术基本思想

其基本思想:由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成一个固定区和若干个覆盖区

经常活跃的部分放在固定区,调入后就不再调出(除非运行结束,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。

举例:

1961年,英国曼切斯特研究人员提出一种自动执行overlay的方式。程序员自己管理主存,通过分解程序为小的覆盖区的方式执行程序。把地址空间和主存容量的概念区分开来。程序员在地址空间里编写程序,而程序则在真正的内存中运行。由一个专门的机制实现地址空间和实际主存之间的映射。

对于上述示例问题,将地址空间划分成4K大小的区间,装入内存的总是其中的一个区间;执行到某个区间时,把该区间的地址自动映射到0~4095之间,例如:4096→0, 4097 →1, ……, 8191 →4095。程序员在0~65535范围内写程序,完全不用管在多大的主存空间上执行,所以,这种方式对程序员来说,是透明的!

这个可寻址的地址空间是一种虚拟内存

覆盖技术的特点是打破了必须将一个进程的全部信息装入主存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行。

当前这种技术已经过时。

三.交换技术

3.1交换技术的基本思想

交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时 换出 外存,把外存中
某些已具备运行条件的进程 换入 内存(进程在内存与磁盘间动态调度)
  • 暂时换出外存等待的进程状态为挂起状态(挂起态,suspend
  • 挂起态又可以进一步细分为就绪挂起阻塞挂起两种状态

 进程的七态模型:

 3.2交换技术的实现

实现交换技术需要清楚怎么解决下面的问题:
1. 应该在外存(磁盘)的什么位置保存被换出的进程?

2. 什么时候应该交换?

3. 应该换出哪些进程?
我们来依次解决下面的问题:
 
1. 具有对换功能的操作系统中,通常把磁盘空间分为 文件区 对换区 两部分。 文件区 主要用于存放文件, 主要追求存储空间的利用率 ,因此对文件区空间的管理 采用离散分配方式 对换区 空间只占磁盘空间的小部分, 被换出的进程数据就存放在对换区 。由于对换的速度直接影响到系统的整体速度,因此对换区空间的管理 主要追求换入换出速度 ,因此通常对换区 采用连续分配方式 。总之, 对换区的 I/O 速度比文件区的更快
2. 交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。
3. 可优先换出阻塞进程;可换出优先级低的进程;为了防止优先级低的进程在被调入内存后很快又被换出,有的系统还会考虑进程在内存的驻留时间…

3.3覆盖与交换的区别


四.虚拟存储技术

4.1虚拟内存的重要性

无论是从增加多道程序的度,还是可能是程序员编写的进程太大而无法放入内存,都引出内存的大小限制了进程的执行。

通过实际程序的研究会发现,在许多情况下并不需要将整个程序置于内存中:程序通常具有处理异常错误条件的代码。由于这些错误很少实际发生,所以这些代码几乎从不执行。数组、列表和表等所分配的内存量通常多于实际需要值。按100×100个元素来声明的数组,可能实际很少用到大于10×10个的元素。程序的某些选项和功能可能很少使用。例如,程序的初始化操作。

执行只有部分处于内存的程序,可以带来许多好处:

程序不再受物理内存的可用量所限制。用户可以为一个巨大的虚拟地址空间(virtual-address space)编写程序,从而简化了编程任务。

由于每个用户程序可占用较少的物理内存,因此可以同时运行更多的程序,进而增加CPU利用率和吞吐量,但没有增加响应时间或周转时间。

将部分程序加载或交换到内存所需的I/O会更少,用户程序会运行得更快。

4.2虚拟内存的定义和特征

基于局部性原理,在程序装入时,可以将程序中 很快会用到的部分装入内存,暂时用不到的部分留在外存 , 就可以让程序开始执行。在程序执行过程中,当所访问的 信息不在内存时 ,由 操作系统负责将所需信息从外存调入内存 ,然后继续执行程序。 若内存空间不够,由 操作系统负责 将内存中 暂时用不 到的信息换出到外存。 在操作系统的管理下,在用户看来似乎有一个比实际内存大得多的内存,这就是 虚拟内存
局部性原理:
时间局部性 :如果执行了程序中的某条指令,那么不久后这条指令很有可能再次执行;如果某个数据被访问过,不久之后该数据很可能再次被访问。(因为程序中存在大量的循环)
空间局部性 :一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。 (因为很多数据在内存中都是连续存放的,并且程序的指令也是顺序地在内存中存放的)

 4.3虚拟内存的实现

虚拟内存技术,允许一个作业分多次调入内存。如果采用连续分配方式,会不方便实现。因此,虚拟内存的实现需要建立在 离散分配 的内存管理方式基础上。
如何从辅助存储器加载可执行程序到内存?一种方案是在程序执行时将整个程序加载到物理内存。但问题是最初可能不需要整个程序都处于内存。另一种方案是仅在需要时才加载页面。这种技术被称为demand paging( 请求分页 ,按需调页)。
对于 请求分页的虚拟内存 ,页面只有在程序执行期间被请求时才被加载。从未访问的那些页从不加载到物理内存中。那么如何区分哪些页面在内存中,哪些页面在辅助存储中?

4.3.1请求分页的虚拟内存中的页表机制

页表中的有效-无效位方案

当该位被设置为“有效”时,相关联的页面是合法的,并且在内存中。当该位被设置为“无效”时,页面无效(即不在进程的逻辑地址空间中),或有效但只在辅助存储上。

对于已调入内存的页面,它的页表项是照常设置的;但是对于不在内存的页面,它的页表项可简单标记为无效。(请注意,如果进程从不尝试访问该页面,则将页面标记为无效并没有什么影响。)

其中逻辑内存中的第0块放在了物理内存中的4块,所以是有效的,有效位设置为有效。而逻辑地址中的第一块没有调入内存,所以可以简单的标记为无效。

而针对上图的问题,如果一个进程试图访问一个没有被带入内存的页面时,对标记为无效的页面访问会产生缺页错误(page fault)。分页硬件在通过页表转换地址时会注意到无效位被设置,从而陷入操作系统。这种陷阱是由于操作系统未能将所需的页面调入内存引起的。处理这种缺页错误的程序很简单。 

4.3.2请求分页中处理缺页的步骤

1. 检查这个进程的内部表(通常与PCB (Process Control Block,进程控制块)一起保存),以确定该引用是有效的还是无效的内存访问。

2. 如果引用无效,那么终止进程。如果引用有效但是尚未调入页面,那么现在就应调入。

3. 找到一个空闲页框(例如,从空闲页框列表上得到一个)。

4. 调度一个辅助存储操作,以将所需页面读到刚分配的页框。

5. 当存储读取完成时,修改进程的内部表和页表,以指示该页现在处于内存中。

6. 重新启动被陷阱中断的指令。该进程现在能访问所需的页面,就好像它总是在内存中。

4.3.3请求缺页中完整的页表结构

在4.3.1中,我们了解到请求缺页的虚拟内存中,相对于基本分页管理多了一个有效位。 但是我们还会面临以下问题:

与基本分页管理相比,请求分页管理中,为了实现“请求调页”,操作系统需要知道每个页面 是否已经调入内存 ;如果还没调入,那么也需要知道该 页面在外存中存放的位置
当内存空间不够时,要实现“页面置换”,操作系统需要通过 某些指标来决定到底换出哪个页面 ;有的页面没有被修改过,就不用再浪费时间写回外存。有的页面修改过,就需要将外存中的旧数据覆盖,因此,操作系统也需要 记录各个页面是否被修改的信息

所以页表项中包含的数据项有页号,物理块号,状态位P,访问字段A,修改位M和外存地址

  • 其中物理块号记录在内存中的位置
  • 状态位记录是否已经调入内存
  • 访问字段记录本页在一段时间内的访问次数
  • 修改位记录本页内容是否被修改过
  • 外存地址记录本页在外存的地址 

 根据完整的页表结构,我们再次分析缺页中断的处理:

 

 

在请求分页系统中,每当要访问的 页面不在内存 时,便产生一个 缺页中断 ,然后由操作系统的缺页 中断处理程序处理中断 。此时 缺页的进程阻塞 ,放入阻塞队列,调页 完成后再将其唤醒 ,放回就绪队列。
如果内存中 有空闲块 ,则为进程 分配一个空闲块 ,将所缺页面装入该块,并修改页表中相应的页表项。
如果内存中 没有空闲块 ,则 页面置换算法 选择一个页面淘汰 ,若该页面在内存期间 被修改过 ,则要将其 写回外存 。未修改过的页面不用写回外存。
根据上述步骤分析上述例题:
  1. 观察所要访问的逻辑地址是否在内存中
  2. 不在内存中,就要从外存中调入内存
  3. 内存中有空闲a,所以直接调入

4.3.4虚拟内存空间的大小

例如:

如:某计算机地址结构为 32 位,按字节编址,内存大小为 512MB ,外存大小为 2GB
则虚拟内存的 最大容量 2 32 B = 4GB
虚拟内存的 实际容量 = min (2 32 B, 512MB+2GB) = 2GB+512MB

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/163508?site
推荐阅读
相关标签
  

闽ICP备14008679号