以前我一直以为程序运行时只有物理内存(RAM),自从看了虚拟内存,才发现我想太简单了。

一、概念

我们平常写的程序,大多数都有两种访问局部性特征,即空间局部性和时间局部性;

空间局部性是指程序倾向访问最近访问过的内存附近的内存,这是由于指令是顺序执行的;时间即部性是指程序倾向于在不久的将来再次访问刚访问过的内存,这是由于循环。

正是由于访问局部性特征,使程序即便仅有部分(地址空间)存在于RAM中,依然可能得以执行,由此为了更加有效地管理内存,现代系统提供了一种对主存的抽象概念,称为虚拟内存。虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的、私有的地址空间。

主存被组织成一个由M个连续的字节大小的单元组成的数组。每个单元都有一个唯一的物理地址。CPU访问内存的最自然的方式就是使用物理地址——物理寻址;与之相对应就是使用虚拟地址访问,称为虚拟寻址。物理寻址和虚拟寻址系统如下图所示:

虚拟内存之所以有效(虚拟内存简介)(1)

虚拟内存之所以有效(虚拟内存简介)(2)

虚拟内存的规划之一是将每个程序使用的内存分成小的、固定大小的页单元。相应的,RAM(物理内存或主存)也划分成一系列与虚存页尺寸相同的页(页帧)。任一时刻,每个程序仅有部分页需要驻留在物理内存页中,这些页构成了所谓驻留集(resident set)。程序未使用的页拷贝保存在交换区(swap area)内,交换区是保留在磁盘空间中,作为RAM的补充,仅在需要时才会载入RAM中。若进程欲访问的页面并未驻留在RAM中,将会发生页面错误,这时内核会挂起进程的执行,同时从磁盘中将该页面载入内存。在磁盘和内存之间传送页的活动叫做交换或者页面调度。

为了支持这个机制,内核需要为每个进程维护一张页表,页表描述了每个虚拟页面是缓存在RAM中,还是驻留在磁盘中。如下所示:

虚拟内存之所以有效(虚拟内存简介)(3)

虚拟内存概览

二、特性

1、由于使用虚拟内存导致每个进程使用的RAM减少了,所以RAM可以同时容纳更多进程,就间接导致CPU的利用率被提高了。

2、由于内核能够为进程分配与释放页,所以进程的有效虚拟地址在进程生命周期中可以发生变化。

3、由于虚拟内存的管理,所以会把进程的虚拟地址控间与RAM物理地址空间隔离开来。

4、由于可能存在大段的虚拟地址空间并未使用,因此不是所有虚拟地址空间都有相应的页表条目。若进程试图访问的地址并无页表条目与之对应,将收到一个SIGSEGV信号;

三、实践

可以在linux终端上输入cat /proc/pid/status即可以看到相应进程状态 (pid为相应进程号);其中以Vm开头是关于虚拟内存的参数,比如VmSize是虚拟内存大小,VmRSS是进程驻留集(物理内存)大小;VmSwap是进程交换区大小;

四、总结

本文对虚拟内存只是起个抛砖引玉,如果有什么不对地方,请大家多多包涵,欢迎指出,如果觉得有用,欢迎点个赞。

文中图片来自互联网,如果有侵权,可以留言删除。

,