2026/2/10 11:56:20
网站建设
项目流程
php网站开发实战视频,深圳便宜网站建设,淮南轩恒网络科技有限公司,青岛网站建设找润商【计算的脉络#xff1a;从硅片逻辑到高并发抽象】
第 3 篇#xff1a;内存层次#xff1a;为什么寄存器到内存的距离像北京到上海#xff1f;
1. 速度的悖论#xff1a;被“抛弃”的内存
在过去的几十年里#xff0c;CPU 的主频和计算效率呈指数级增长#xff0c;但内存…【计算的脉络从硅片逻辑到高并发抽象】第 3 篇内存层次为什么寄存器到内存的距离像北京到上海1. 速度的悖论被“抛弃”的内存在过去的几十年里CPU 的主频和计算效率呈指数级增长但内存DRAM访问延迟的改善却极其缓慢。如果我们把 CPU 执行一条指令的时间比作1 秒那么读取寄存器大约耗时0.5 ~ 1 秒触手可及。读取 L1 Cache大约耗时4 ~ 10 秒在房间另一头取物。读取 L2 Cache大约耗时30 ~ 60 秒下楼拿个快递。读取 L3 Cache大约耗时2 ~ 5 分钟去小区门口买个菜。读取主存 (DRAM)大约耗时2 ~ 4 小时从北京坐高铁去上海。这种跨越量级的速度差就是著名的**“内存墙Memory Wall”**。如果 CPU 每次都要去内存取数它绝大部分时间将处于“发呆”状态。为了解决这个问题硬件工程师在 CPU 内部编织了一张复杂的缓存网。2. 局部性原理缓存存在的哲学基石缓存之所以有效是因为计算机程序运行遵循两个核心规律时间局部性 (Temporal Locality)如果一个数据被访问了那么在不久的将来它很可能再次被访问例如循环变量。空间局部性 (Spatial Locality)如果一个数据被访问了那么它邻近的数据很可能也会被访问例如数组遍历、顺序执行的代码指令。3. 多级缓存架构以空间换时间现代 CPU 设计了一套阶梯状的存储结构每一级都是上一级的“快照”。3.1 L1/L2 Cache核心的“私产”L1 Cache分为指令缓存i-Cache和数据缓存d-Cache通常每个核心几十 KB。它的访问速度必须跟上 CPU 的时钟周期。L2 Cache容量稍大几百 KB 到几 MB同样是每个核心独有的。3.2 L3 Cache全家的“粮仓”共享性L3 通常由同一个 CPU Socket 上的所有核心共享。中转站它是核心间通信的物理桥梁也是减少主存访问的最后一道防线。4. 缓存命中与失效性能的分水岭当 CPU 需要一个数据时它会逐级查找Hit命中在 Cache 中找到数据CPU 欢快地继续工作。Miss失效在 Cache 中没找到。此时 CPU 必须发出昂贵的外部总线请求去 DRAM 甚至磁盘里捞数据。注意当发生 Miss 时CPU 并不是只取回你需要的那几个字节而是会一次性搬运一整块连续的数据——这就是我们下一篇要重点讲的Cache Line缓存行。5. 软件开发的视角如何避免“长途旅行”理解了内存层次你会发现很多所谓的高性能编程技巧本质上都是在**“取悦缓存”**为什么数组Array比链表LinkedList快数组在内存中是连续分布的能完美触发空间局部性一次预取全家受惠而链表的节点四散在内存各处每次跳转都可能导致一次“去上海”的内存访问。Data-Oriented Design (DOD)在游戏开发和高性能计算中将对象的属性拆分成多个数组而不是一个大对象的数组是为了让 CPU 在处理某一属性时缓存里全是该属性的连续数据。6. 本篇小结内存层次结构是硬件设计者对物理极限的妥协。寄存器是极速但稀缺的“指尖办公”。Cache是折中但精妙的“桌面堆栈”。内存是海量但迟钝的“远程仓库”。作为程序员你的目标应该是尽量让代码在“桌面”上完成而不是频繁地发起“跨城物流”。下一篇预告【计算的脉络从硅片逻辑到高并发抽象】第 4 篇Cache Line 深度解密为什么 64 字节决定了性能我们将深入探讨缓存搬运的最小单位以及它如何引发隐形的“性能车祸”。本篇揭示了“内存墙”的残酷。您准备好进入下一篇聊聊那个神秘的“64 字节”魔数了吗