编程高手必学的内存知识

编程高手必学的内存知识 / 学好内存,掌握系统开发诀窍

海纳

华为编译器高级专家,原Huawei JDK团队负责人

  • 课程目录
  • 课程介绍
  • 开篇词|为什么你要系统学习计算机的内存知识?

    如果从这些庞大的知识体系中选择一条脉络的话,我还是会推荐以内存管理为线索去进行学习。

  • 导学(一)| 拆解CPU的基本结构和运行原理

    CPU做为计算机的总司令官,它管理着计算机的所有资源。它有两个主要的作用,分别是计算和控制。

  • 导学(二)| 汇编语言是怎么一回事?

    在编程语言发展过程中,人们按照编程语言中所暴露的硬件细节的多少,将编程语言划分为高级语言和低级语言。

  • 导学(三)| 一个CPU是怎么寻址的?

    CPU的设计思路大致分为两个流派,一个是复杂指令集,另一个是精简指令集,前者的代表是X86,后者的代表是Arm和RISC-V。

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

    任何虚拟内存最终都要映射到物理内存,但虚拟内存的大小又远超真实的物理内存的大小。

  • 02|聊聊x86体系架构中的实模式和保护模式

    在实模式下,程序员是不能通过内存管理单元(Memory Management Unit, MMU)访问地址的,程序必须直接访问物理内存。

  • 03 | 内存布局:应用程序是如何安排数据的?

    一个进程的内存可以分为内核区域和用户区域。

  • 04 | 深入理解栈:从CPU和函数的视角看栈的管理

    栈帧本质上是一个函数的活动记录。

  • 05 | 栈的魔法:从栈切换的角度理解进程和协程

    栈切换的核心就是栈指针rsp寄存器的切换,只要我们想办法把rsp切换了就相当于换了执行单元的上下文环境。

  • 06 | 静态链接:变量与内存地址是如何映射的?

    链接器需要对编译器生成的多个目标(.o)文件进行合并,一般采取的策略是相似段的合并,最终生成共享文件(.so)或者可执行文件。

  • 07 | 动态链接(上):地址无关代码是如何生成的?

    我们知道,深入地掌握动态链接库是开发底层基础设施必备的技能之一,如果你想要透彻地理解动态链接机制,就必须掌握地址无关代码技术。

  • 08 | 动态链接(下):延迟绑定与动态链接器是什么?

    我们这节课来看看,如何通过延迟绑定技术,来解决性能下降的问题。

  • 09 | 深入理解堆:malloc和内存池是怎么回事?

    内存的精细化管理,我们要考虑两个因素,一是分配和回收的效率,二是内存区域的有效利用率。

  • 10 | 页中断:fork、mmap背后的保护神

    页中断有两类重要的类型:写保护中断和缺页中断。正是这两类中断在整个系统的后台默默地工作着,就像守护神一样支撑着内存系统正常工作。

  • 11 | 即时编译:高性能JVM的核心秘密

    这节课,我们就围绕着Java是怎么运行起来的这个问题逐层展开,在这个过程中,我会教你如何阅读和分析字节码,以及猜测它的JIT结果。

  • 12 | 内存虚拟化:云原生时代的奠基者

    这节课,我将带你从内存入手来学习虚拟化技术。

  • 13 | 存储电路:计算机存储芯片的电路结构是怎样的?

    从这一节课开始,我们把注意力转向内存的硬件实现。掌握硬件篇的知识,是你学习计算机组成原理和体系结构的基础。

  • 14 | CPU Cache:访存速度是如何大幅提升的?

    被替换出的数据块应该是将来最晚会被访问的块。

  • 15 | MESI协议:多核CPU是如何同步高速缓存的?

    今天我们就来介绍在多核体系结构下,如何解决缓存一致性问题。

  • 16 | 内存模型:有了MESI为什么还需要内存屏障?

    发起写请求的CPU中的缓存状态可能是Exclusive、Modified和Share,每个状态下的处理是不一样的。

  • 17 | NUMA:非均匀访存带来了哪些提升与挑战?

    大型服务器的物理内存是由很多部分组成的,主要包含外设所使用的内存和主存。

  • 18 | Java内存模型:Java中的volatile有什么用?

    Java中的volatile有什么用?如何正确地使用它?

  • 19 | 垃圾回收:如何避免内存泄露?

    对于C++/C程序员来说,内存错误是一个非常头疼的问题,常见的错误有内存泄露、悬空指针等。

  • 20 | Scavenge:基于copy的垃圾回收算法

    基于copy的算法要将堆空间分成两部分:一部分是From空间,一部分是To空间。不管什么时刻,总有一半空间是空闲的。

  • 21 | 分代算法:基于生命周期的内存管理

    由于业务线程停顿的时候,整个Java进程都不能再响应请求,人们把这种情况形象地称为“世界停止”(Stop The World,STW)。

  • 22 | G1 GC:分区回收算法说的是什么?

    上一节课介绍了解决漏标问题的两种方法,分别是“往前走”和“往后退一步”。今天这节课,我们就来介绍第三种解法。

  • 23 | Pauseless GC:挑战无暂停的垃圾回收

    如果说CMS代表的是过去式,而G1是一种过渡(尽管这个过渡期会很长),那么ZGC无疑就是JVM自动内存管理器的未来。

  • 24 | GC实例:Python和Go的内存管理机制是怎样的?

    Python语言的分配过程与第9节课所讲的malloc的实现非常相似,所以我们重点看它的垃圾回收过程。Go语言的垃圾回收过程就是简单的CMS,所以我们重点分析它的分配过程。

  • 不定期福利第一期 | 海纳:我是如何学习计算机知识的?

    请找到你自己热爱的方向,然后把有限的精力投入到最有价值的地方。

  • 不定期福利第二期 | 软件篇答疑

    决定一块内存区域的性质的,不是它的地址,而是它的作用。

  • 期末测试 | 来赴一场满分之约吧!

    为了帮助你检验自己的学习效果,我特别给你准备了一套结课测试题,快来挑战一下吧。

  • 结束语 | 自主基础软件开发的那片星辰大海

    当我们在做选择的时候,还是选择有益于生态的方向,不能与生态对抗;要抓住平台切换的机遇,这是弯道超车的机会;还要考虑一个行业在技术上是否已经到顶。

【开通会员,解锁百门好课】

购买极客时间超级会员年卡,解锁 190+ 体系课。 *本专栏暂未加入会员,可单独订阅,永久学习。

你将获得

  • 一条通往系统级程序员的学习路径
  • 全面深入拆解计算机内存系统
  • 吊打面试官的N个小技巧
  • 从内存贯穿全局,全面提升底层硬实力

讲师介绍

海纳,华为资深编译器专家,原Huawei JDK团队负责人。著有《自己动手写Python虚拟机》,并长期维护知乎专栏《进击的Java新人》,他的《从零开始写Linux内核》也即将面市。

海纳的工作涉及数据库、操作系统、编译器和图像处理,以及计算机视觉等方面,他在这些领域积累了大量的一线实战经验。同时,他也是开源社区的积级贡献者,发起了Railgun虚拟机和海浪编程语言等项目。

课程介绍

作为程序员,我们每天都在跟计算机内存系统打交道。无论你是做移动端、服务端,还是全栈开发,难免遇到些复杂问题,诸如:

  • 如何解决缓冲区溢出带来的安全问题?
  • 如何利用好CPU Cache优化程序的性能?
  • 如何在大型系统里设计适合自己业务的内存池?
  • 设计高性能的并发库时,要考虑哪些与内存相关的因素?

对于这些问题,你只有深入到计算机内存中,才能找出最佳的解决方案。而且,现在企业愈加青睐于擅长处理复杂问题、能进行底层开发的系统级程序员,这也是为什么,计算机内存相关的话题几乎是大厂面试的必考内容。

内存相关的知识如此重要,但学起来并不是一件简单的事情。这是因为,内存知识太过庞杂,涉及到CPU硬件设计、操作系统、编译器,以及编程语言库、虚拟机等众多领域,需要你有大量的知识储备。

更何况,内存相关的知识能够串联起计算机软、硬件的全局脉络,提高你的底层实力,是你从普通程序员向前精进,突破职业生涯瓶颈的不二选择。

所以,这次我们请来了华为资深编译器专家、原Huawei JDK负责人海纳老师。海纳老师会用自己十余年的编程经验,带你全面拆解计算机内存系统,给你一条从内存出发,通往系统级程序员的高效学习路径。同时,我们在每节课课后都设置了“吊打面试官”小卡片,涉及各大厂高频面试真题,让你全方位提升自己在内存上的实战能力。

课程模块设计

本课程一共分为三个部分。

第一模块:软件篇。

我们知道,操作系统是软硬件设计的核心,它管理着所有的硬件资源,同时又为各种运行在它上面的应用程序提供服务。因此,在软件篇,老师会以操作系统为核心,把进程和内存的关系给你彻底讲清楚,让你对操作系统、编译器,以及应用程序的运行原理有深入的理解。这样,当你遇到进程crash时,分析coredump、查看内存映射等都能游刃有余。

第二模块:硬件篇。

在硬件篇,老师将会带你学习与内存相关的计算机体系架构,包括多核CPU内存模型、存储体系结构和存储器电路。

通过这一模块的学习,你可以快速掌握缓存原理、多核CPU通信的核心知识,让你最大限度地使用好缓存,写出正确而高效的代码。同时,我们课程里对硬件知识的讲解,还可以让你掌握CPU设计一些简单原理,并且在此基础上,可以深入地学习RISC-V等开源CPU的实现。

第三模块:自动内存管理篇。

学习内存管理算法,能够让我们正确地使用各种不同的语言,比如在Python和Swift中要注意解循环引用等。而且,你还可以通过学习原理处理各种应用层面的问题,例如Java程序的STW问题,等等。

因此,在你掌握好计算机软硬件相关的内存基础后,老师会带你深入学习内存管理算法,逐一攻克C++和Java语言内存模型(JMM)、垃圾回收算法等相关知识,同时帮你熟练运用它们,解决开发中的各种疑难杂症。

课程目录

特别放送

免费领取福利

限时活动推荐

订阅须知

相关教程

Learnfk - Python机器学习教程

Learnfk - Meteor教程

Learnfk - Haskell教程

Learnfk - Scala教程

Learnfk - ES6教程

Learnfk - R教程

随机推荐

晨光M&G文具0.5mm黑色中性笔巨能写笔杆笔芯一体化签字笔坑不坑人...

京东京造超声波清洗机优缺点分析测评,使用良心测评分享。

优普爱婴儿口手无香湿巾深度剖析功能区别,要注意哪些质量细节!

英氏儿童零食儿童夹心米饼评测解读该怎么选,质量值得入手吗

攀升AMD多少钱?可以入手吗?

鑫谷额定500WGP600G黑金版电源使用感受,评测质量好吗