【操作系统——虚拟内存管理】

系列文章目录

1.《带你深挖计算机底层逻辑,打通你计算机基础知识的任督二脉》
2.《深度学习计算机底层原理,深度剖析存储器》
3.《基于内存全面理解高速缓冲存储器》
4.《深度学习计算机指令系统,彻底搞懂指令十大寻址方式》
5.《降维打击,带你深度学习CPU(上)》
6.《深度学习CPU(番外篇)——虚拟内存》
7.《深度学习CPU(番外篇)——虚拟内存》
8.《操作系统——内存连续分配管理方式》
9.《操作系统——内存基本分页存储管理》
10.《I/O方式——程序中断》
11.《操作系统——虚拟内存管理》



前言

        这个系列的文章我将从以下四个方面的问题来为大家进行讲解,为什么要引入虚拟内存,虚拟内存的空间大小是由什么来决定的,虚拟内存是怎么解决问题的?会带来什么问题?这个系列我将会用两篇文章来为大家彻底讲解清楚。


一、虚拟内存的基本概念

1.传统存储器管理方式的特点

        我们在之前讨论过的各种内存管理策略都是为了同时将多个进程保存在内存当中,以便允许多道程序设计,他们都具有以下两个方面的特征。

  • 一次性:作业必须一次性全部装入内存当中,才能开始运行,这回导致两种情况,当程序很大的而不能全部装入内存的时候,这个程序是无法运行的,第二点当大量作业要求运行的时候,由于内存不能容纳所有的作业的时候,只能少数作业先运行,导致多道程序运行效率下降。
  • 驻留性:作业被装入内存以后,就一直驻留在内存当中,其任何部分都不会被换出,直至作业运行结束,进程才会被换出内存,运行中的进程会因为等待I/O而被阻塞,可能处于长期等待的状态。
  • 由以上分析可知,许多进程在运行中不用或者暂时不适用的程序占据了大量的内存空间,而且一些需要运行的作业又无法装入内存当中运行,显然浪费了宝贵的内存资源。

2.局部性原理

        要真正的理解虚拟内存技术的思想,首先必须了解著名的局部性原理,从广义上来讲,快表、页高速缓存、以及虚拟内存技术都属于高速缓存技术,这个技术所依赖的就是局部性原理,局部性原理既适用于程序结构有适用于数据结构,局部性原理主要体现在以下两个方面:

  • 时间局部性原理:程序中的某条指令一旦执行,不久以后该条指令可能会再次执行,某数据被访问过后,不久以后很有可能会被再次访问,之所以会这样是因为程序当中存在着大量的循环操作。
  • 空间局部性原理:一旦程序访问了某个存储单元,在不久以后,这个存储单元附近的存储单元也会被访问,也就是说程序在一段时间之内所访问的地址,可能集中在一定的范围之内。因为指令通常是顺序执行的,数据也一般是以向量、数组、表等形式聚集存储的。
  • 时间局部性原理通常将近来使用的指令和数据保存到高速缓存当中,并且使用高速缓存当中的层次结构实现,空间局部性原理通常使用较大的高速缓存,并且将预取机制集成到高速缓存控制逻辑当中实现,虚拟内存技术实际上建立了内存——外存的两级存储结构,并且利用局部性原理实现高速缓存。

3.虚拟存储器的定义和特性

        基于局部性原理,在程序装入的时候,仅需将程序当前要运行的少数页面或者段装入内存即可,而将其余的部分暂时留在外存上,从而腾出空间存放将要调入内存的信息,等当下的页面运行结束以后,再将其余需要运行的页面或者段装入内存即可,这样子系统好像为用户提供了一个比实际内存容量大得多的存储器,称为虚拟存储器。

        之所以将其称为虚拟存储器,是因为存储器实际上并不存在,只是由于系统提供了部分装入,请求调入、页面置换功能以后(这些功能对用户是透明的),给用户的感觉就是存在一个比实际物理内存大得多的存储器,但是容量大只是一种错觉,虚拟存储器主要又以下三个特征:

  • 多次性:是指无须在作业运行时一次性地全部装入内存,而允许被分成多次调入内存运行,也就是说只需要将运行的那部分程序和数据装入内存即可开始运行,以后每当要运行到尚调入到内存当中的那部分程序的时候,再将其调入,多次性是虚拟内存当中最重要的特征。
  • 对换性:是指无需再作业运行的时候一直常驻内存,在进程运行期间允许将那些暂时不适用的程序和数据从内存调入外存的对换区(换出),等到以后需要他们的时候再将其从外存调至内存(换进),正是由于对换性才得以让虚拟存储器正常运行。
  • 虚拟性:是指从逻辑上扩充内存的容量,使用户所看到的内存容量远大于实际的内存容量,这就是虚拟存储器所表现出的最大的特性,也是实现虚拟存储器的最重要的目标。

4.虚拟内存技术的实现 

        虚拟内存技术允许将一个作业分多次调入内存,采用连续分配方式的时候,会使得相当一部分的内存空间都处于暂时甚至“永久”空闲的状态,造成内存资源的严重浪费,而且也无法从逻辑上扩充内存容量,因此虚拟内存的实现需要建立在离散分配方式的内存管理方式的基础上。

虚拟内存的实现又以下三种方式:

  • 请求分页存储管理方式
  • 请求分段存储管理方式
  • 请求段页式存储管理方式

这三种方式的成功实现都需要一定程度上的硬件支持

  • 一定容量的内存和外存
  • 页表机制或者段表机制作为主要的数据结构
  • 中断机构,当用户所需要的部分程序或者数据尚未调入内存的时候,要产生中断,也就是缺页中断
  • 地址变换机构:从逻辑地址到物理地址的转变

二、请求分页管理方式

1.概述

        请求分页系统建立在基本分页式存储管理方式之上,是为了支持虚拟存储器功能而增加了请求分页管理功能和页面置换功能,请求分页管理方式是目前最常用的一种实现虚拟存储器的方式。

        在请求分页管理方式当中,只需要将当前需要的一小部分页面调入内存即可,便可以启动作业运行,在作业的执行过程当中,当所需要访问的内存不在内存中的时候,在通过页面调入功能将其调入。同时还可以通过置换功能将暂时不用的页面换出大外存上,以腾出足够的内存空间。

        为了实现请求分页管理方式,系统必须提供一定的硬件支持,除了需要一定容量的内存和外存意外,还要有页表机制、中断机构和地址变换机构。

2.页表机制

        请求分页管理方式不同于基本分页式存储管理方式,请求分页系统在一个作业运行之前不要求不要求将其页面全部调入内存,因此在作业运行的过程当中必然会出现一些需要访问的页面不在内存当中的情况,如何发现这种情况并且及时地解决才是最重要的问题。为此在请求分页管理方式当中对于页表项增加了四个字段,如图所示:

页号物理块号状态位P访问字段A修改位M外存地址

增加的四个状态字说明如下:

  • 状态位P:用于指示该页是否已经掉入了内存,供程序访问的时候参考
  • 访问字段A:用于记录本页在一段时间内被访问的次数,或者记录本页最近已有多长时间未访问,供置换算法出页面时参考
  • 修改位M:标识该页面在调入内存后是否被修改过,以确定页面置换是否写回外存
  • 外存地址:用于指出该页在外存上的地址,通常是物理块号,供调入页面时参考

3.缺页中断机制 

        在请求分页管理方式中,每当要访问的页面不在内存中的时候,便产生一个缺页中断,请求操作系统将所缺的页面调入内存,此时就会将缺页的进程阻塞,将所缺的页面调入内存的时候再将其唤醒,若内存有空闲块,则分配一个块,将要调入的内存装入该块,并修改页表中相应的页表项,但若是内存中没有空闲块的话则需要根据一定的算法将内存中已有的页面淘汰一部分。如果这个页面被修改过则必须将其写入外存。

        这个写入外存的道理其实很简单,因为这些页面本身就是从外存当中调入进来的,你在内存当中修改以后,就说明内存需要的数据已经发生了改变,将其写入外存以后下次内存再次调用的时候,还是新数据,如果不写入外存,将旧数据再次调入内存的话,内存还需要对其再次修改,这样就太麻烦了。

        缺页中断作为中断,同样要经历诸如保护CPU环境、分析中断原因,转入缺页中断处理程序,恢复CPU环境等几个步骤,但是与一般的中断相比,他有着两个明显的区别:

  • 在指令执行期间产生中断信号,属于内部异常,而普通中断一般是一条指令执行完成以后才产生的中断信号。
  • 一条指令在执行期间可能产生多次缺页中断。

4.地址变换机构

  1. 首先程序请求访问某一页,并且判断页号与页表长度的大小关系,判断是否发生越界,如果越界的话则产生越界中断。
  2. CPU检索快表(放在高速缓冲存储器当中的页表),首先查看相应的页表项是否在快表当中,也就是说在这个快表当中有没有我需要的页面和相应的物理块号的对应关系这一页表项(页表当中的某一项),如果在快表当中的话,修改访问位和修改位,并且形成物理地址,这样子就完成了从虚拟地址向物理地址准换的过程。
  3. 那么如果页表项不在快表当中呢?那么就要访问内存,从内存当中将所需的虚拟地址与物理地址的对应关系找出以后写入快表即可。
  4. 那么问题又来了,万一内存当中也没有这一个页面与相应的物理地址的对应关系该怎么办呢?这个时候就会产生缺页中断,首先保留CPU现场。
  5. 再从外存当中找到所缺的页面,将其调入内存即可。
  6. 那么万一内存中没有空闲块怎么办呢?这个时候就要根据一定的算法将其中的一页换出。
  7. 不过在换出之前首先要判断这一页是否被修改过,如果被修改过必须将这一页再写回外存。
  8. 写回外存以后将这一页面换出。
  9. 操作系统命令CPU从外存当中读取相应的页面,并且启动I/O硬件,将所缺的页面换入内存。
  10. 最后还要修改页表。


总结

        虚拟内存管理技术就已经为大家介绍了一半了,明天将继续为大家介绍有关页框分配、驻留集和抖动的相关概念,届时整个操作系统的内存管理部分就彻底为大家讲解结束,希望各位小伙伴能够从我的文章当中有所收获。


你的支持就是我最大的动力,请问你学会了吗

  • 9
    点赞
  • 9
    收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:猿与汪的秘密 设计师:我叫白小胖 返回首页
评论 7

打赏作者

清灵白羽 漾情天殇

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值