【总结】虚拟内存
本文档为面试精华版,如果是初学者,建议从专栏学习:操作系统专栏
1. 什么是虚拟内存(Virtual Memory)?
这个在我们平时使用电脑特别是Windows 系统的时候太常见了。很多时候我们使用点开了很多占内存的软件,这些软件占用的内存可能已经远远超出了我们电脑本身具有的物理内存。为什么可以这样呢?正是因为虚拟内存的存在,通过虚拟内存可以让程序可以拥有超过系统物理内存大小的可用内存空间。
另外,虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉(每个进程拥有一片连续完整的内存空间)。 这样会更加有效地管理内存并减少出错。
总结而言就是:
- 可以将内存扩展到外部磁盘存储器上,使得程序可以拥有超过物理内存的的空间大小
- 让程序有一种错觉,认为自己获得了连续的可⽤的内存,而实际上这些内存分散在物理内存上甚至存放在外部磁盘上
2. 局部性原理
局部性原理是虚拟内存技术的基础,正是因为程序运⾏具有局部性原理,才可以只装⼊部分程序到内存就开始运行。
局部性原理表现在以下两个方面:
- 时间局部性 :如果程序中的某条指令⼀旦执⾏,不久以后该指令可能再次执⾏;如果某数据被访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着⼤量的循环操作。
- 空间局部性 :⼀旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、顺序执⾏的,数据也⼀般是以向量、数组、表等形式簇聚存储的。
时间局部性是通过将近来使⽤的指令和数据保存到⾼速缓存存储器中,并使⽤⾼速缓存的层次结构实现。空间局部性通常是使⽤较⼤的⾼速缓存,并将预取机制集成到⾼速缓存控制逻辑中实现。虚拟内存技术实际上就是建⽴了 “内存⼀外存”的两级存储器的结构,
3. 虚拟存储器
基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其他部分留在外存,就可以启动程序执行。由于外存往往比内存大很多,所以我们运行的软件的内存大小实际上是可以比计算机系统实际的内存大小大的。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序。另一方面,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。这样,计算机好像为用户提供了一个比实际内存大的多的存储器一虚拟存储器。
实际上,我觉得虚拟内存同样是一种时间换空间的策略,你用CPU 的计算时间,页的调入调出花费的时间,换来了一个虚拟的更大的空间来支持程序的运行。
4. 虚拟内存的技术实现
虚拟内存的实现需要建立在离散分配的内存管理方式的基础上,虚拟内存的实现有以下三种方式:
- 请求分页存储管理:建立在分页管理之上,
为了支持虚拟存储器功能而增加了请求调页功能和页面置换功能。
请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分段即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。 - 请求分段存储管理:建立在分段存储管理之.上,
增加了请求调段功能、分段置换功能。
请求分段储存管理方式就如同请求分页储存管理方式一样,在作业开始运行之前,仅装入当前要执行的部分段即可运行;在执行过程中,可使用请求调入中断动态装入要访问但又不在内存的程序段;当内存空间已满,而又需要装入新的段时,根据置换功能适当调出某个段,以便腾出空间而装入新的段。 - 请求段页式存储管理
5. 请求分页与分页存储管理的不同?
根本区别在于,是否要求将程序所需全部的地址空间都装入内存,分页存储是这样要求的,所以无法提供虚拟内存
6. 常见的页面置换算法有哪些?
在程序运行过程中,如果要访问的页面不在内存中,就发生缺页中断从而将该页调入内存中。此时如果内存已无空闲空间,系统必须从内存中调出一个页面到磁盘对换区中来腾出空间。
页面置换算法和缓存淘汰策略类似,可以将内存看成磁盘的缓存。在缓存系统中,缓存的大小有限,当有新的缓存到达时,需要淘汰一部分已经存在的缓存,这样才有空间存放新的缓存数据。
页面置换算法的主要目标是使页面置换频率最低(也可以说缺页率最低)。
-
最佳置换算法(OPT):理论上最好的算法,每次置换选择的将是最久不会被访问的页面
-
最近最久未使用(LRU): 记录的是页面上次的访问时间,实现方式有栈或者寄存器两种,对于栈每次置换栈顶元素,每次访问都会将页面置于栈底;寄存器保存的是访问时间,每次置换掉访问时间离现在最晚的的
-
最少使用(LFU):该置换算法选择在之前时期使⽤最少的⻚⾯作为淘汰页,记录的是一段时间内的使用频率。
-
先进先出(FIFO):每次置换的将是最先进来的页面
-
第二次机会算法 :由于先进先出可能会将经常使用的页面置换出去,所以增加了一个访问位,当页面被访问时,将该位置成1,当发生缺页中断时,会将该位置成0,会给该页面一次机会。
-
最近未使用(NRU):每个页面都有两个状态位:R 与 M,当页面被访问时设置页面的 R=1,当页面被修改时设置 M=1。其中 R 位会定时被清零。当发生缺页中断时,最先置换00,最后置换11的页面,至于中间的两个分类,NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)