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