http://www.zavakid.com/2011/10/16/why_virtual_memory/
关于虚拟内存,物理内存,我有蛮多概念都是很模糊的,今天下午看了一下虚拟内存,也算是有了一点小收获,本文就针对为什么需要有虚拟内存的理解写下来。
同时,我也希望自己能够陆续学习linux内存管理的知识,并且写出一些文章,来记录自己的一些理解。如果您觉得有任何问题,可以留下评论,我们一起讨论,毕竟越辩越明。
为什么要使用虚拟内存
之前的计算机系统,是使用物理地址来使用内存的,这样,CPU就根据某个寄存器中相应的值,直接到物理内存去取值了。这样的好处就是非常直接,非常容易理解。
而缺点是,我们需要知道物理地址的值,每次程序开始执行,也就是执行程序从磁盘被load到物理内存中之后,我们必须告诉CPU,程序是从哪一个地址开始执行的(即PC寄存器的值);还有一个致命的缺点是:程序使用的内存会被物理内存所限制,比如我们的机器上只有512M内存,那我们的程序就不能使用需占1G内存的程序了。这点或许是催生虚拟内存产生的最主要原因。
虚拟内存的概念
为了解决上面的的问题,就产生了虚拟内存的概念。那什么是虚拟内存呢?这里我先说说自己对存储器层次结构的理解。
计算机中有一种存储器层次的原则。我的理解是,CPU使用的数据都是基于寄存器的,如果我们的寄存器足够的大和多并且足够便宜,那么也就没有后来那么多的东西产生了。而问题就是寄存器足够快,但其造价却非常昂贵,因此,考虑到成本,就有了之后的CPU高速缓存,主存(就是我们常说的内存)和硬盘,甚至磁带等存储器了。
那么,计算机是如何让这些速度快慢不一、容量大小不一的存储器在一起工作的呢?一个方案就是存储器层次结构。
对于这个存储器层次结构,我的理解是:CPU是和寄存器打交道的,但寄存器的容量毕竟有限,因此就需要高速缓存存储器来作为寄存器的缓存,当有些数据在寄存器中找不到时,CPU就可以去寻找高速缓存这个存储器中的内容,如果告诉缓存器还没有这个数据,那我就去主存中再去寻找这个数据,如果主存中也还没有,那就去磁盘中找吧。
这也是我对存储器层次结构的一个理解。
以上说了一通,但都没有提到虚拟内存,那虚拟内存究竟是什么?他在这个层次中处于哪个位置呢?
实际上,按照这种模型去思考的话,就可以这样理解:虚拟内存就是去解决主存到磁盘这个层次的方案。
没错,我认为虚拟内存就是一种方案,而且他是非常重要的,为什么呢?众所周知,CPU的速度很快,内存就是作为匹配CPU和磁盘之间速度的一个中间层,高速缓存其实也是这样一个缓存的角色,但问题是,如果高速缓存失效,那么CPU会去访问内存,这样的速度只是降低了十倍的数量级;而如果是内存失效,让CPU去访问磁盘的话,这样的速度却是降低了十万倍到百万倍的数量级。
可见,在寄存器、高速缓存和主存之间缓存的失效,结果还是可以让人接受的(想想java的volatile关键字),但主存和磁盘之间缓存的失效,就会给程序造成比较大的性能影响了,所以我们应该努力避免主存的失效,这也是虚拟内存所必须要解决和面对的问题之一。
总结
其实可以认为,程序使用的内存,都是用的虚拟内存,因此也就没有了物理内存的限制(但还是限制于计算机的寻址位数,比如32位和64位,因为虚拟内存系统需要使用到物理内存)。他可以把自己的一部分放在物理内存中,还有一部分当做缓存放到磁盘中。另外,虚拟内存有相应的虚拟地址,因此,他就可以做到对于每一个程序来说,使用的都是相同的虚拟地址,这些虚拟地址,则可以映射到不同的物理地址,也就是说每个程序都可以把自己想象成自己拥有整台机器的内存。