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

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

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

虚拟地址空间:在32位的i386 CPU的地址总线的是32位的,也就是说可以寻找到4G的地址空间。我们的程序被CPU执行,就是在0x00000000到0xFFFFFFFF这一段地址中。高1G的空间为内核空间,由操作系统调用,低3G的空间为用户空间,由用户使用。这样是为了解决物理内存稀缺性问题。

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,并给这块骗人的地方起了一个好名字,虚拟内存。这就是我的理解中的虚拟内存空间和虚拟内存的概念。

原文出处:https://blog.csdn.net/u014379540/article/details/52263114

虚拟地址与虚拟内存的理解相关推荐

  1. 虚拟地址、虚拟内存、物理地址、物理内存

    虚拟地址.虚拟内存.物理地址.物理内存 物理内存和虚拟内存 虚拟地址.物理地址 物理内存和虚拟内存 物理内存 物理内存时有限的,当有多个进程要执行的时候,假设都要给4G内存,很显然你内存小一点,这很快 ...

  2. 1虚拟地址,虚拟内存映射,系统调用本质,进程运行状态

     1操作系统会为每个进程分配0到4G的虚拟地址 2.关于虚拟内存和物理内存之间的关系 总结: A程序管理内存的最小单位是page(4096Byte),如果需要的内存不够4096字节,实际上开辟的也 ...

  3. 逻辑地址、物理地址、虚拟地址、虚拟内存

    1.逻辑地址 是上层程序员可以操作的地址,和段相关的偏移地址部分,也就是变址寄存器中存储的32位偏移地址,而其他寄存器上的地址往往对于上层程序员来说是不可更改甚至是不可见的. 只有在实模式下,逻辑地址 ...

  4. 自己对win10虚拟内存的理解,不一定对

    这个相当于swap空间,也就是用硬盘假扮内存免得机器炸了. 通常情况下,打开系统属性--性能选项--高级 这里显示的 所有驱动器总分页文件大小 就是当前硬盘上已经用来做假内存的空间大小. 然后点击更改 ...

  5. 虚拟地址 虚拟内存 物理地址

    物理内存和虚拟内存 我们先来了解一下,什么是物理内存,什么又是虚拟内存? 1.物理内存:指通过物理内存条而获得的内存空间,主要作用是在计算机运行时为操作系统和各种程序提供临时储存. 2.虚拟内存:对内 ...

  6. 我理解的物理地址、虚拟地址、逻辑地址

    文章目录 一. 物理地址 1. 基本概念 2. 说明 二. 逻辑地址 1. 基本概念 2. 说明 三. 虚拟地址 1. 为什么有虚拟地址(个人理解) 2. 基本概念 3. 说明 四.小结 一. 物理地 ...

  7. 彻底搞懂虚拟内存,虚拟地址,虚拟地址空间

    程序经过编译后,变成了可执行的文件,可执行文件主要包括代码和数据两部分,代码是只读的,数据则是可读可写的. 可执行文件由操作系统加载到内存中,交由CPU去执行,现在问题来了,CPU怎么去访问代码和数据 ...

  8. 从虚拟内存的角度理解一段汇编

    文章由个人翻译和整理自Holbert School的系列文章与CS301.Brown University的x64 Register教程,链接位于文末 文章目录 虚拟内存布局 理解一段简单的汇编 更深 ...

  9. Unix系统编程()虚拟内存管理

    在之前学到过进程的内存布局中忽略了一个事实:这一布局存在于虚拟文件中. 因为对虚拟内存的理解将有助于后续对fork系统调用.共享内存和映射文件之类的主题阐述,这里还要学习一下有关虚拟内存的详细内容. ...

  10. 地址空间和虚拟内存(转载)http://topic.csdn.net/u/20090619/10/4c62a13b-536b-4b0a-af09-2271c6a104e1.html...

    我对于虚拟地址空间和虚拟内存的理解:32位的CPU中,一个进程都有个4G的虚拟地址空间:虚拟内存是存在于硬盘上的页交换文件. 前段时间听了一个报告,报告人竟然一再强调说MMU管理的是虚拟内存,个人认为 ...

最新文章

  1. 第二章:3、BP神经网络
  2. python 正则的使用 —— 编写一个简易的计算器
  3. asp服务器_200行代码,7个对象——让你了解ASP.NET Core框架的本质「3.x版」
  4. 摄像头poe供电原理_什么是POE供电,这种POE套装有什么优势呢?
  5. “象征界”的奇观:刘天怜花鸟工笔作品印象
  6. MATLAB数据分析2
  7. 干货福利:AI人工智能学习资料教程包.zip
  8. 在台湾当程序员是一种什么样的体验?
  9. Winform中用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity
  10. 全国计算机一级12月考试答案,12月到12月全国高校计算机等级考试(广西考区)一级笔试真题及答案...
  11. js des加密 java_java JS DES互相加密解密 通用!!!
  12. 视频监控市场发展潜力大 六个阻碍待突破
  13. error: statement with no effect [-Werror=unused-value]
  14. 爱加密:APP安全防护 靠技术实力说爱你
  15. 测试职业发展前景之职业发展方向
  16. 恒讯科技分析:香港服务器有效防止DDos攻击的3种方法
  17. mongo配置项说明
  18. 基础快读(新手入门)(C++实现)
  19. 程序员:如何优雅的写出好代码?
  20. 腾讯云服务器入门使用流程 新手必看教程

热门文章

  1. 神舟战神笔记本重做系统
  2. excel如何自动填充123456……
  3. 【第七篇】Flowable核心内容之任务分配
  4. meltdown linux 补丁,宋宝华: ARM64 Linux meltdown修复补丁KPTI的最重要3个patch
  5. 2021,排名前 15 的 Vue 后台管理模板
  6. jQuery第5章上机练习3(使用jQuery变换网页效果)
  7. python数据可视化第三章图表辅助元素的定制
  8. 测试u盘真假的手机软件,U盘真假怎么检测|教你检测U盘真假的方法
  9. restore和recover区别
  10. 统计学第一类错误和第二类错误