IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

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

说者无意 2011-10-17 22:10:34 累计浏览 5,130 次
本机暂存

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

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

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

为什么要使用虚拟内存

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

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

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

虚拟内存的概念

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

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

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

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

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

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

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

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

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

总结

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

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 关于linux内存free的一些事情 (累计阅读 12,867)
  2. linux内核研究笔记(一)内存管理 – page介绍 (累计阅读 10,487)
  3. Linux上进程的表示以及入门 (累计阅读 7,741)
  4. 缓存设计的一些思考 (累计阅读 6,998)
  5. malloc()之后,内核发生了什么? (累计阅读 6,403)
  6. 如何实现一个malloc (累计阅读 6,145)
  7. MongoDB与内存 (累计阅读 6,122)
  8. iOS内存暴增问题追查与使用陷阱 (累计阅读 5,838)
  9. 简单理解Memcached的Slab Allocation (累计阅读 5,521)
  10. Memcached内存管理机制浅析 (累计阅读 5,219)