虚拟内存

什么是虚拟内存(Virtual Memory)?

虚拟内存让程序拥有超过系统物理内存大小的可用内存空间。另外,虚拟内存为每个进程提供了一个连续的、私有的地址空间,它让每一个进程产生了一种自己在独享内存的错觉(每个进程拥有一片连续完整的内存空间)。这样会更加有效地管理内存并减少出错。

虚拟内存是计算机系统内存管理地一种技术。虚拟内存地重要意义是它定义了一个连续地虚拟地址空间,并且把内存扩展到硬盘空间。

虚拟内存 使得应用程序认为它拥有连续地可用的内存,而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。与没有虚拟内存技术的系统相比,使用这种技术使得大型程序的编写变得更容易,对真正的物理内存的使用也更有效率。

局部性原理

局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。

局部性原理表现在两个方面:

  1. 时间局部性:如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能被再次访问。这是因为程序中存在着大量的循环操作。
  2. 空间局部性:一旦程序访问了某个存储单元,在不久以后,其附近的存储单元也被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这时因为指令通常是顺序存放,顺序执行的,数据也一般是以向量、数组、表等形式聚簇存储的。

虚拟内存的技术实现

虚拟内存的实现需要建立在离散分配的内存管理方式的基础上。

  1. 请求分页存储管理:建立在分页管理之上,为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟内存的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。
  2. 请求分段存储管理:建立在分段存储管理之上,增加了请求调段功能、分段置换功能。请求分段存储管理方式就如同请求分页存储管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。
  3. 请求段页式管理

请求分页与分页存储管理的区别

请求分页存储管理建立在分页管理之上。它们的根本区别是是否将程序的全部地址空间都装入主存,这也是请求分页存储管理可以提供虚拟内存的原因。

不管是上面哪种实现方式,我们一般都要:

  1. 一定容量的内存和外存:在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了。
  2. 缺页中断:如果需执行的指令或访问的数据不在内存(缺页或缺段),则有处理器通知操作系统将相应的页面或短调入到内存,然后继续执行程序;
  3. 虚拟地址空间:逻辑地址到物理地址的变换。

页面置换算法

虚拟内存管理很重要的一个概念就是页面置换算法。那你说一下页面置换算法的作用?常见的页面置换算法有哪些?

地址映射过程中,若在页面中发现所要访问的页面不在内存中,则发生缺页中断。

缺页中断就是要访问的页不在主存,需要操作系统将其调入主存后再进行访问。在这个时候,被内存映射的文件实际上成了一个分页交换文件。

当发生缺页中断时,如果当前内存中并没有空闲的页面,操作系统就必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间。用来选择淘汰哪一页的规则叫做页面置换算法,我们可以把页面置换算法看成是淘汰页面的规则。

  • OPT页面置换算法(最佳页面置换算法):最佳(Optimal,OPT)置换算法所选择的被淘汰页面将是以后永不使用的,或者是在最长时间内不再被访问的页面,这样可以保证获得最低的缺页率。但由于人们目前无法预知进程在内存下的若干页面中哪个是未来最长时间内不再被访问的,因此该算法无法实现。一般作为衡量其他置换算法的方法。
  • FIFO(First In First Out)页面置换算法(先进先出页面置换算法):总是淘汰最先进入内存的页面,及选择在内存中驻留时间最久的页面进行淘汰。
  • LRU(Least Recentley Used)页面置换算法(最近最久未使用页面置换算法):LRU算法赋予每个页面一个访问字段,用来记录一个页面上次被访问以来所经历的时间T,当必须淘汰一个页面时,选择现有页面中其T值最大的,即最近最久未使用的页面予以淘汰。
  • LFU(Least Frequently Used)页面置换算法(最少使用页面置换算法):该置换算法选择之前时期使用最少的页面作为淘汰页。