分享

虚拟地址与虚拟内存

 求真我 2014-04-20

    学生不才,这个虚拟地址与虚拟内存的问题困惑的我很长的时间,现在写一下最近看过一些资料后的理解吧,肯定存在不完整或者不正确的地方,希望大家可以纠正,如果能给你带来一些新知识,或者帮您复习了一下旧知识,我感到非常荣幸,下面开始,以32位的i386 CPU看。

    首先先来看看我一直以来认识的错误的地方。

    在最开始看书的时候,我知道程序在运行时,不是全部加入内存当中的,当然,这个现在依旧正确,在有了虚拟地址空间这个概念以后,我一直认为是在硬盘中划分出一块虚拟内存出来,然后给每个程序4G的硬盘空间,作为这个程序的虚拟内存,然后就需要运行哪一块然后哪一块装入内存当中。后来发现这个是错误的。大家可以在我错误的地方来看看自己的理解,纠正自己的问题。

    首先,虚拟地址空间是不等于虚拟内存的(我的一本Linux教材上写的是这两个概念一致的,我认为是错误的)。我们来看一下这几个概念:

    虚拟内存:虚拟内存是一种逻辑上扩充物理内存的技术。基本思想是用软、硬件技术把内存与外存这两级存储器当做一级存储器来用。虚拟内存技术的实现利用了自动覆盖和交换技术。简单的说就是将硬盘的一部分作为内存来使用。

    虚拟地址空间:在32位的i386 CPU的地址总线的是32位的,也就是说可以寻找到4G的地址空间。我们的程序被CPU执行,就是在0x00000000到0xFFFFFFFF这一段地址中。高2G的空间为内核空间,由操作系统调用,低2G的空间为用户空间,由用户使用。

    CPU在寻址的时候,是按照虚拟地址来寻址,然后通过MMU(内存管理单元)将虚拟地址转换为物理地址。因为只有程序的一部分加入到内存中,所以会出现所寻找的地址不在内存中的情况(CPU产生缺页异常),如果在内存不足的情况下,就会通过页面调度算法来将内存中的页面置换出来,然后将在外存中的页面加入到内存中,使程序继续正常运行。

虚拟地址与虚拟内存

    可以看出,虚拟地址空间和虚拟内存的一个关键的因素是MMU(内存管理单元)。

    现在一个程序的执行现在可以分为3部分:

    1:CPU需要执行的语句的虚拟地址。

    2:程序装入内存的部分

    3:程序再外存中的部分

    因为CPU是通过时间片轮转的方法使不同的程序并发执行的。所以在某一时刻只有一个程序占据CPU资源,CPU的最大的寻址空间为4G,所以说可以将每个程序可以看做独立占据4G的内存(只是可以看成,但是它并没有占据实际的4G内存)。而CPU是将虚拟地址空间里面的代码执行,如果在内存中寻找不到所需要的页面,就需要到外存中寻找,外存的这一部分,我们可以当成内存来使用,这也就是虚拟内存。虚拟地址空间不等于虚拟内存。虚拟地址空间是一个空间,不是真正存在的,只是通过CPU的寻址虚拟出来的一个范围。而虚拟内存是实实在在的硬盘的空间。

    我看到了一个比较形象的比喻,假设4G个门牌号(4G的虚拟地址空间,并将这4G的虚拟空间进行分页),但是房子的数量(内存)少于门牌号的数量(4G的虚拟空间),那样就先把每个房子(内存)上挂一个门牌号(页),如果你要找一个门牌号(页),就需要查找每个房子(内存),如果这个门牌号没有挂(页还没有被加入到内存中),那么就将一个房子的门牌号(页面置换到外存)摘下来,把你找的那个门牌号挂上(将外存的页加入内存),这样就找到了需要的门牌号(页)。

    这是我将这个比喻综合了一下。CPU只需要说找哪一个页面,MMU就将这个页面翻译成物理地址,再通过页面调度机制来讲不在内存中的页加入到内存中。

    我认为计算机使用的是一种各司其职的方法。

    CPU老大只需要要虚拟地址中的一页,范围在0x00000000到0xFFFFFFFF,因为他的地址总线是32位,4G是他最大的能力,然后他就把任务分配给他的手下,CPU不需要知道他的手下是如何找到这一页,他只负责去要这一页和执行这些代码,然后他就和他的手下说“有招想去,没招死去”,他的手下必须要能找到这一页,然后内存非常有限,而CPU不管这个,只需要你能找到这一页让我执行就好,所以CPU的手下就将硬盘中的一部分当做内存,然后拿来骗CPU说,“这是我从内存中找到的”,然后CPU就去运行。如果访问的地方实在是不能找到,或者是没有权限,那么这个程序就真死了。程序员在开发的时候,因为程序员所编写的代码最终是要让CPU去执行,所以程序员也理所应当认为我有4G的内存空间,程序员把程序交给CPU,CPU就交给他手下。

    所以说,他们每一层都不需要管对方是如何办到的,他们在乎的只有结果。他们各司其职,CPU认为我有4G内存空间的原因是因为CPU的地址总线为32位,最大的寻址能力是4G,而内存没有这个大,所以它想出来的办法是将硬盘的一部分拿来骗CPU,并给这块骗人的地方起了一个好名字,虚拟内存。这就是我的理解中的虚拟内存空间和虚拟内存的概念。

    自身水平有限,希望大家矫正,谢谢!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多