编程高手必学的内存知识
海纳
华为编译器高级专家,原 Huawei JDK 团队负责人
20674 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
编程高手必学的内存知识
15
15
1.0x
00:00/00:00
登录|注册

01|虚拟内存:为什么可用内存会远超物理内存?

你好,我是海纳。
今天是我们的第 1 节课,我想用一个比较有趣的、很多人都遇到过的问题作为我们这门课的开场,带你正式迈入计算机内存的学习课堂。
我不知道在你刚接触计算机的时候,有没有这么一个疑问:“为什么我的机器上只有两个 G 的物理内存,但我却可以使用比这大得多的内存,比如 256T?”
反正我当时还是挺疑惑的,不过现在我可以来告诉你这个答案了。这个问题背后的机制是十分复杂的,但它的核心是计算机中物理内存和虚拟内存的关系,尤其是虚拟内存的运行原理。只要你搞懂了它们,这个问题也就迎刃而解了。
不止如此,虚拟内存的运行原理还是打开计算机底层知识大门的钥匙,只有掌握好它,我们才能继续学习更多的底层原理。我们整个课程的目的,就是让你在遇到进程崩溃、内存访问错误、SIGSEGV、double free、内存泄漏等与内存相关的错误时,可以有的放矢,把握分析问题的方向。而今天的第一课就是把打开这扇门的钥匙交到你手上。
在回答虚拟内存的相关问题之前,我们需要先看看物理内存的含义。

物理内存

计算机的物理内存,简单说就是那根内存条,你的内存条是 1G 的,那计算机可用的物理内存就是 1G。这个内存条加电以后就可以存储数据了,CPU 运算的数据都是存储在主存里的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

虚拟内存是计算机系统中的重要概念,通过将物理内存和磁盘空间结合起来,使得可用内存远超过物理内存的大小。虚拟内存的运行原理基于程序的局部性原理,使得每个进程实际需要的物理内存很少。虚拟内存的实现原理是通过将虚拟地址映射到物理地址,实现了内存地址空间的隔离和扩展。了解虚拟内存的原理有助于程序员更好地理解计算机底层知识,提高对内存相关错误的分析能力。页面映射的过程由CPU的内存管理单元自动完成,但依赖于操作系统设置的页表。页面的换入换出涉及页面换入换出的调度问题,需要精心设计页面的调度算法。 虚拟内存是软硬件一体化设计的典型代表,解决了直接操作物理内存的系统无法支持多进程的问题。其核心特点包括每个进程有自己的页表,实现了进程间地址空间的隔离,以及PTE中的标记属性比特提供更好的内存访问安全性。此外,虚拟内存还充分利用CPU提供的机制完成重要任务,如fork借用写保护实现写时复制。X86架构的CPU将这种工作模式称为保护模式,与实模式形成对比。Linux操作系统为每个进程在/proc目录下创建一个目录,通过查看该目录下的文件可以了解进程的内存使用情况。 总之,虚拟内存在计算机系统中扮演着重要角色,为多进程环境下的内存管理提供了解决方案,同时也为程序员提供了更深入的底层知识理解和错误分析能力。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《编程高手必学的内存知识》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(56)

  • 最新
  • 精选
  • niucheng
    后面的面试题目中,服务程序内部使用的数据存储格式,尽可能使用数组类型、或者压缩列表这类内存紧凑的数据结构,因为数组对CPU告诉缓存支持更友好,缓存命中率会更高,这样会提高数据访问速度?如果使用链式或者树形的数据结构来存储数据,会不会更容易触发缺页中断?

    作者回复: 不能一概而论哈。数据结构的时间复杂度的损失不是缺页中断能够弥补的。举个例子,使用二叉搜索树查找数据,假设数据总量是1’000’000,时间复杂度是O(log n),所以查找的效率是平均20次查找。但数组从0开始向后找,时间复杂度是O(n),所以查找次数的平均值是500'000。虽然二叉树大概率每次访问子结点都会出现缓存不命中的情况,但这种损失与时间复杂度的优势相比,完全微不足道。所以讨论缓存应该是在算法和数据结构已经做到最优的情况下,再去扣它。而不是为了缓存命中而使用更差的数据结构。

    2021-11-07
    2
    21
  • 郑童文
    请问老师,每个进程的页表是保存在操作系统所占的内存地址空间还是该进程自己的地址空间?进程切换将对页表产生什么影响?关于每个进程的堆和栈的起始和终止地址又是保存在哪儿的呢? 谢谢!

    作者回复: 你思考得非常深入! 1. 所有进程的页表都是关键数据,只有内核才有权限修改,所以页表都是存在内核空间的。每个进程的管理结构里(也在内核空间)都会记录自己的页表。 2. 进程切换时会把目标进程的页表起始地址送进cr3寄存器,这样目标进程页表就可以起作用了。显然这个也只能在内核里才能做。 3. 我们后面的课程会详细地回答这个问题。

    2021-10-27
    5
    21
  • 压根就是咯
    为什么虚拟内存远超物理内存,却能正常映射存储,没太看懂?

    作者回复: 举一个形象点的例子:你把物理内存页看成酒店房间,把虚拟内存页看成旅客。虽然旅客人数远多于酒店房间,但是因为旅客不是同一天入住。所以我们就可以通过调度来实现旅客和房间的动态映射了。从外界看起来,就是酒店用了100个房间在100天里满足了一万个旅客入住。

    2021-11-02
    2
    19
  • MetMan
    海老师,请教既然有虚拟内存机制,为何程序仍然可能出现out of memory运行错误,是因为物理内存不够了,但能利用局部性原理在物理内存中只放入一定数据不超出限制吗

    作者回复: 因为虚拟地址也有耗尽的可能呀。物理内存不够了,可以把不活跃页面往磁盘的swap区域放,但swap区域也有不够用的可能,这就是物理内存耗尽的情况。3G的用户空间,一次性要申请4G的空间,虚拟地址就不够用了。所以说,虚拟地址只是编织了一个很大地址的假象,其物理空间该耗尽的还是会耗尽。所以要记住不管什么时候,能释放的内存尽量释放总是一个好习惯。

    2021-10-26
    9
  • dog_brother
    老师好,每个进程都有页目录表和页表,每个 CPU 都有一个页目录基址寄存器。我的问题是,页目录基址寄存器可以保存多少个页目录基址呀?

    作者回复: 是的。每个进程都有自己的页表。进程有自己的进程控制块,这是一个结构体,它里面记录了进程的页目录表的地址。当进程切换的时候,就会把目标进程的页目录表送到cr3寄存器。所以在任一时刻,只有一个进程页表是活跃的。

    2021-12-03
    8
  • 牧野
    <无论一个进程占用的内存资源有多大,在任一时刻,它需要的物理内存都是很少的> 这句话没看懂,进程程序本身不就在内存中吗

    作者回复: 不是,程序是按需加载的。尚未用到的和已经用不到了的,就会被换出去。虚拟内存可以帮你做出一个假象:你感觉虚拟内存空间随时可以访问,但真实数据可能不在物理内存里,你需要的时候才重新做虚拟内存到物理内存的映射。

    2021-10-26
    2
    6
  • Linuxer
    有两个问题请教: 1. 不同进程页表起始地址存哪呢? 2. 一个物理页面分配给了一个进程,另一个进程怎么掌握这个信息呢?

    作者回复: 1. 每个进程都有一个管理结构,在linux中就是task_struct,它会记录页表的起始地址:pgdir,然后每次进程切换时都会把目标的页表起始地址送入CR3寄存器。 2. 进程自己是不知道的,但是内核知道。内核管理着全部的物理内存,哪一块分配给谁,它是非常清楚的。用于管理物理内存的结构叫做mem_map,如果有兴趣的话可以自己查一下。

    2021-11-02
    2
    5
  • 虚拟地址空间往往与机器字宽有关系 ----------------- 为什么要有这一层关系呢?

    作者回复: 因为虚拟地址是程序员要打交道的地址。程序员操作寄存器,寄存器的位宽能放32位的指针,这就表示能表示的范围是0到4G。也就是32位机器上,最大能表示的地址是4G。这不就是位宽决定了空间大小么?

    2021-10-28
    2
    5
  • D
    “CPU 运算的数据都是存储在主存里的。”, 这句话不是太准确啊,CPU 不是直接从主存拿数据啊,中间还有寄存器,高速缓存啊。

    作者回复: 你说得非常对。我们会在第14课详细地介绍存储体系结构,就把这个问题说清楚了。在这之前,我们不会引入这些概念,是为了让大家关注虚拟地址这个概念就好了,过多的概念会给大家造成困扰。在必要的时刻我们肯定会细化修正概念的,就像从相对论的角度看,牛顿力学的表述也有很多不严谨的地方。学习的过程就是从不全面到全面的过程。非常感谢!

    2021-10-27
    4
    4
  • 小北
    语速稍微快了点

    作者回复: 后边的已经在慢慢调整了:)

    2021-10-26
    2
    4
收起评论
显示
设置
留言
56
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部