1.《带你深挖计算机底层逻辑,打通你计算机基础知识的任督二脉》
2.《深度学习计算机底层原理,深度剖析存储器》
3.《基于内存全面理解高速缓冲存储器》
4.《深度学习计算机指令系统,彻底搞懂指令十大寻址方式》
5.《降维打击,带你深度学习CPU(上)》
6.《深度学习CPU(番外篇)——虚拟内存》
7.《深度学习CPU(番外篇)——虚拟内存》
8.《操作系统——内存连续分配管理方式》
9.《操作系统——内存基本分页存储管理》
10.《I/O方式——程序中断》
11.《操作系统——虚拟内存管理》
这个系列的文章我将从以下四个方面的问题来为大家进行讲解,为什么要引入虚拟内存,虚拟内存的空间大小是由什么来决定的,虚拟内存是怎么解决问题的?会带来什么问题?这个系列我将会用两篇文章来为大家彻底讲解清楚。
我们在之前讨论过的各种内存管理策略都是为了同时将多个进程保存在内存当中,以便允许多道程序设计,他们都具有以下两个方面的特征。
要真正的理解虚拟内存技术的思想,首先必须了解著名的局部性原理,从广义上来讲,快表、页高速缓存、以及虚拟内存技术都属于高速缓存技术,这个技术所依赖的就是局部性原理,局部性原理既适用于程序结构有适用于数据结构,局部性原理主要体现在以下两个方面:
基于局部性原理,在程序装入的时候,仅需将程序当前要运行的少数页面或者段装入内存即可,而将其余的部分暂时留在外存上,从而腾出空间存放将要调入内存的信息,等当下的页面运行结束以后,再将其余需要运行的页面或者段装入内存即可,这样子系统好像为用户提供了一个比实际内存容量大得多的存储器,称为虚拟存储器。
之所以将其称为虚拟存储器,是因为存储器实际上并不存在,只是由于系统提供了部分装入,请求调入、页面置换功能以后(这些功能对用户是透明的),给用户的感觉就是存在一个比实际物理内存大得多的存储器,但是容量大只是一种错觉,虚拟存储器主要又以下三个特征:
虚拟内存技术允许将一个作业分多次调入内存,采用连续分配方式的时候,会使得相当一部分的内存空间都处于暂时甚至“永久”空闲的状态,造成内存资源的严重浪费,而且也无法从逻辑上扩充内存容量,因此虚拟内存的实现需要建立在离散分配方式的内存管理方式的基础上。
虚拟内存的实现又以下三种方式:
这三种方式的成功实现都需要一定程度上的硬件支持
请求分页系统建立在基本分页式存储管理方式之上,是为了支持虚拟存储器功能而增加了请求分页管理功能和页面置换功能,请求分页管理方式是目前最常用的一种实现虚拟存储器的方式。
在请求分页管理方式当中,只需要将当前需要的一小部分页面调入内存即可,便可以启动作业运行,在作业的执行过程当中,当所需要访问的内存不在内存中的时候,在通过页面调入功能将其调入。同时还可以通过置换功能将暂时不用的页面换出大外存上,以腾出足够的内存空间。
为了实现请求分页管理方式,系统必须提供一定的硬件支持,除了需要一定容量的内存和外存意外,还要有页表机制、中断机构和地址变换机构。
请求分页管理方式不同于基本分页式存储管理方式,请求分页系统在一个作业运行之前不要求不要求将其页面全部调入内存,因此在作业运行的过程当中必然会出现一些需要访问的页面不在内存当中的情况,如何发现这种情况并且及时地解决才是最重要的问题。为此在请求分页管理方式当中对于页表项增加了四个字段,如图所示:
| 页号 | 物理块号 | 状态位P | 访问字段A | 修改位M | 外存地址 |
增加的四个状态字说明如下:
在请求分页管理方式中,每当要访问的页面不在内存中的时候,便产生一个缺页中断,请求操作系统将所缺的页面调入内存,此时就会将缺页的进程阻塞,将所缺的页面调入内存的时候再将其唤醒,若内存有空闲块,则分配一个块,将要调入的内存装入该块,并修改页表中相应的页表项,但若是内存中没有空闲块的话则需要根据一定的算法将内存中已有的页面淘汰一部分。如果这个页面被修改过则必须将其写入外存。
这个写入外存的道理其实很简单,因为这些页面本身就是从外存当中调入进来的,你在内存当中修改以后,就说明内存需要的数据已经发生了改变,将其写入外存以后下次内存再次调用的时候,还是新数据,如果不写入外存,将旧数据再次调入内存的话,内存还需要对其再次修改,这样就太麻烦了。
缺页中断作为中断,同样要经历诸如保护CPU环境、分析中断原因,转入缺页中断处理程序,恢复CPU环境等几个步骤,但是与一般的中断相比,他有着两个明显的区别:

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