技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> Linux --> 内存学习――为什么需要虚拟内存

内存学习――为什么需要虚拟内存

浏览:4454次  出处信息

    关于虚拟内存,物理内存,我有蛮多概念都是很模糊的,今天下午看了一下虚拟内存,也算是有了一点小收获,本文就针对为什么需要有虚拟内存的理解写下来。

    同时,我也希望自己能够陆续学习linux内存管理的知识,并且写出一些文章,来记录自己的一些理解。

     如果您觉得有任何问题,可以留下评论,我们一起讨论,毕竟越辩越明。

为什么要使用虚拟内存

    之前的计算机系统,是使用物理地址来使用内存的,这样,CPU就根据某个寄存器中相应的值,直接到物理内存去取值了。

     这样的好处就是非常直接,非常容易理解。

    而缺点是,我们需要知道物理地址的值,每次程序开始执行,也就是执行程序从磁盘被load到物理内存中之后,我们必须告诉CPU,程序是从哪一个地址开始执行的(即PC寄存器的值);还有一个致命的缺点是:程序使用的内存会被物理内存所限制,比如我们的机器上只有512M内存,那我们的程序就不能使用需占1G内存的程序了。这点或许是催生虚拟内存产生的最主要原因。

虚拟内存的概念

    为了解决上面的的问题,就产生了虚拟内存的概念。那什么是虚拟内存呢?这里我先说说自己对存储器层次结构的理解。

    计算机中有一种存储器层次的原则。我的理解是,CPU使用的数据都是基于寄存器的,如果我们的寄存器足够的大和多并且足够便宜,那么也就没有后来那么多的东西产生了。而问题就是寄存器足够快,但其造价却非常昂贵,因此,考虑到成本,就有了之后的CPU高速缓存,主存(就是我们常说的内存)和硬盘,甚至磁带等存储器了。

    那么,计算机是如何让这些速度快慢不一、容量大小不一的存储器在一起工作的呢?一个方案就是存储器层次结构

    对于这个存储器层次结构,我的理解是:CPU是和寄存器打交道的,但寄存器的容量毕竟有限,因此就需要高速缓存存储器来作为寄存器的缓存,当有些数据在寄存器中找不到时,CPU就可以去寻找高速缓存这个存储器中的内容,如果告诉缓存器还没有这个数据,那我就去主存中再去寻找这个数据,如果主存中也还没有,那就去磁盘中找吧。

    这也是我对存储器层次结构的一个理解。

    以上说了一通,但都没有提到虚拟内存,那虚拟内存究竟是什么?他在这个层次中处于哪个位置呢?

    实际上,按照这种模型去思考的话,就可以这样理解:虚拟内存就是去解决主存到磁盘这个层次的方案

    没错,我认为虚拟内存就是一种方案,而且他是非常重要的,为什么呢?众所周知,CPU的速度很快,内存就是作为匹配CPU和磁盘之间速度的一个中间层,高速缓存其实也是这样一个缓存的角色,但问题是,如果高速缓存失效,那么CPU会去访问内存,这样的速度只是降低了十倍的数量级;而如果是内存失效,让CPU去访问磁盘的话,这样的速度却是降低了十万倍到百万倍的数量级。

    可见,在寄存器、高速缓存和主存之间缓存的失效,结果还是可以让人接受的(想想java的volatile关键字),但主存和磁盘之间缓存的失效,就会给程序造成比较大的性能影响了,所以我们应该努力避免主存的失效,这也是虚拟内存所必须要解决和面对的问题之一。

总结

    其实可以认为,程序使用的内存,都是用的虚拟内存,因此也就没有了物理内存的限制(但还是限制于计算机的寻址位数,比如32位和64位,因为虚拟内存系统需要使用到物理内存)。他可以把自己的一部分放在物理内存中,还有一部分当做缓存放到磁盘中。另外,虚拟内存有相应的虚拟地址,因此,他就可以做到对于每一个程序来说,使用的都是相同的虚拟地址,这些虚拟地址,则可以映射到不同的物理地址,也就是说每个程序都可以把自己想象成自己拥有整台机器的内存。

建议继续学习:

  1. Linux内存点滴 用户进程内存空间    (阅读:11598)
  2. ps - 按进程消耗内存多少排序    (阅读:11356)
  3. Linux Used内存到底哪里去了?    (阅读:10021)
  4. Linux操作系统的内存使用方法详细解析    (阅读:8921)
  5. linux内核研究笔记(一)内存管理 – page介绍    (阅读:8766)
  6. 几个内存相关面试题(c/c++)    (阅读:8073)
  7. 内存越界的概念和调试方法    (阅读:6342)
  8. 必看!linux系统如何查看内存使用情况    (阅读:6203)
  9. Innodb分表太多或者表分区太多,会导致内存耗尽而宕机    (阅读:6202)
  10. 如何查看Linux 硬件配置信息    (阅读:5925)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1