
写这篇专栏前我先说句实话计算机系统基础知识是很多人考系统架构设计师、转架构师岗位时最容易轻视的一章。大家都觉得CPU、内存、硬盘谁不知道啊可真到做题或者设计高并发系统遇到瓶颈时才发现自己连Cache命中率怎么算、DMA和中断有什么区别都没搞明白。我当年复习这一章最深的感触是这不是背概念的章节而是后面学操作系统、网络协议、分布式系统时反复回查的字典。只有把计算机的骨骼和血管摸清楚你才能理解为什么一个系统架构设计成那样、为什么某个瓶颈出现在那里、为什么换一种存储方案后性能差别巨大。这篇是【架构专栏】第2章的第1部分我打算把范围集中在计算机硬件组成、CPU工作原理、存储层次结构这三块最核心的内容上操作系统层面的进程调度、文件系统之类放到2/3和3/3去讲。无论你是备考系统架构设计师软考还是带领团队做架构设计需要补硬件基础这篇文章都会避开教科书式的说教按我实际复习和工作中验证过的思路把每个考点拆开揉碎讲给你。1. 先搞清楚这一章在架构知识体系里的真实位置1.1 为什么架构师反而要抠最底层的细节我见过不少朋友做架构设计时有这样一个错觉架构师嘛画架构图、选中间件、定微服务边界跟底层计算机硬件有什么关系这个想法坑了不少人。系统架构设计师考试官方教程里计算机系统基础知识摆在第一章第二章这种靠前位置不是编纂者偷懒而是后面所有章节——操作系统、数据库、网络、嵌入式、系统配置与性能评价——都默认你已经掌握这些底层逻辑。举个最直观的例子你在设计一个大数据处理平台时需要评估单机能扛多少并发、吞吐量受什么限制。如果不知道CPU的指令流水线概念你就无法理解为什么CPU主频提升带来的性能收益是递减的如果不懂存储层次寄存器、Cache、主存、磁盘你就无法解释为什么同一个接口有时1毫秒返回、有时需要100毫秒。这些为什么全都扎根在本章的基础知识里。架构师的判断力说白了就是用基础概念去解释系统现象的能力所以这部分不仅是为了应试更是为了以后画每一张架构图时心里有数。1.2 本篇1/3的边界划分与后续内容预告把计算机系统基础知识拆成三篇是因为这一章信息密度非常大如果一篇硬塞进去读起来非常劝退。我按照自己梳理出的认知顺序做了切分1/3本篇计算机硬件组成、CPU工作原理、存储体系与Cache、总线与I/O控制方式。聚焦计算机在物理上是怎么工作的理科基础薄弱也能跟上。2/3操作系统的基本原理包括进程与线程、处理机调度、存储管理、文件管理、设备管理。主要回答操作系统如何把硬件资源抽象成服务。3/3数据库系统基础、计算机语言与开发基础、多媒体与网络基础、安全性基础。主要补全应试中零零散散但必考的边缘考点。这样切分的好处是1/3解决机器怎么跑2/3解决资源怎么管3/3解决对外怎么服务层层递进符合我们理解陌生系统时由内向外、由物理到逻辑的习惯。建议读者不要跳过本篇直接看2/3因为操作系统的很多策略比如页面置换、中断调度、DMA底层正是本届要讲的硬件机制先有硬件的因才能理解软件的果。2. 计算机结构这关过不去后面全白搭2.1 冯·诺依曼模型一台一直在取指-执行循环里的机器所有计算机系统基础课程都绕不开冯·诺依曼结构。它给计算机定义了五大部件运算器、控制器、存储器、输入设备、输出设备。这五个词看起来简单但你得抓住它真正厉害的地方——存储程序的概念指令和数据以同等地位放在存储器里机器按地址访问由程序计数器PC决定下一步执行哪条指令。也就是说计算机本质上是一台循环读取指令、解释并执行指令的机器。现代计算机早就不是教科书里那种单总线简单结构了但冯·诺依曼的框架没变。真正变了的是围绕取指-执行效率做的各种优化CPU里加缓存、指令预取、分支预测、乱序执行、多核并行……这些优化手段后面章节会逐步展开。你在复习时记住一句话所有计算机体系结构的演进本质上都是在和CPU太快、存储太慢这个矛盾作斗争。用这个视角去理解后面学Cache、学流水线、学DMA都会觉得顺理成章。2.2 CPU内部拆解运算器与控制器各管哪摊事CPU由运算器和控制器两大部分组成。运算器负责算术逻辑运算核心部件是ALU算术逻辑单元它内部还有累加器、程序状态字寄存器PSW等。控制器负责指挥协调核心是程序计数器PC、指令寄存器IR、指令译码器和时序发生器。通俗地说控制器是领导决定每一步干什么运算器是员工具体干活。考试和面试中爱考的一个点是PC和IR的区别。我给你一个特别容易记的口诀PC指向未来IR握住当下。PC中存放的是下一条将要执行指令的地址取指完成后PC自动加1这里的1是指一条指令占用的存储单元数不是简单的字节1IR存放的是当前正在执行的指令内容包括操作码和地址码。理解这个区别后你再看指令的执行过程就不会乱了。另外要关注的是CPU的寄存器。通用寄存器如数据寄存器DR、地址寄存器AR用于暂存数据和地址对程序员可见而MAR存储器地址寄存器、MBR存储器数据寄存器虽然是寄存器但属于CPU与主存接口的专属部件。做计算题时如果题目说CPU内寄存器有32个指的是通用寄存器跟MAR、MBR那种机械性寄存器要区分开。这类细节最容易被混在一起我在真题里就吃过这个亏。2.3 指令流水线主频之外的性能真相指令周期可以简单分成取指、分析、执行三个阶段。如果一条指令老老实实执行完再取下一条那CPU利用率非常低——因为取指令时ALU闲着运算时总线闲着。于是计算机体系结构引入了流水线技术就像工厂流水线每个环节同时处理不同产品的不同步骤理想情况下每周期都能完成一条指令的取指-分析-执行中的一个阶段。流水线有几个高频考点。第一个是执行时间计算。假设取指、分析、执行各需要1个时钟周期连续执行n条指令总耗时公式为第一条指令耗时 (n-1) × 最慢阶段耗时。为什么是最慢阶段因为流水线中相邻阶段必须同步瓶颈阶段的用时决定了整个流水线的节奏。比如三阶段各为1周期、2周期、1周期执行100条指令总时间为(121) (100-1)×2。这个公式务必亲手推一遍。第二个高频考点是流水线吞吐率即单位时间内完成的指令数量。理想情况n条指令的吞吐率 n / 总耗时而最大吞吐率则接近流水线最慢阶段周期的倒数。背公式容易忘不如理解瓶颈决定了上限流水线再长也绕不开最慢的那个环节。第三个考点是流水线冒险包括结构冒险资源冲突、数据冒险下一条指令需要上一条的结果、控制冒险分支跳转导致取错指令。我在真题里能在案例分析里见到数据冒险的变种回答要点就是需要在硬件上插入停顿气泡或通过转发技术解决。2.4 CISC与RISC指令集架构的两种哲学指令集架构是CPU和软件之间的契约。你写的高级语言最终会被编译成指令集中的二进制指令因此指令集的设计直接影响CPU的硬件复杂度和编译器的优化空间。主流分两大流派对比维度CISC复杂指令集计算机RISC精简指令集计算机指令特点指令数量多、格式复杂、长度可变指令数量少、格式规整、长度固定寻址方式多一条指令可完成复杂操作少访存只能通过load/store通用寄存器较少依赖内存操作较多大量使用寄存器控制器实现微程序控制为主硬件复杂度高硬布线控制为主电路精简代表x86家族ARM、MIPS、RISC-V背这张表不难难的是理解背后的权衡。CISC的思路是让硬件代替软件干活一条指令完成很多事情编译器简单但CPU复杂RISC的思路是把复杂留给编译器硬件只做最简操作CPU频率容易做高、功耗容易做低。这就能解释为什么移动端的ARM、服务器端也开始出现的ARM架构能在功耗和性能之间取得很好的平衡也能解释x86在服务器市场长期根深蒂固的原因——指令集兼容和生态积累实在太重要了。我特别建议你关注现代CPU的CISC外壳、RISC核心现象x86 CPU内部其实也会把复杂指令翻译成类RISC的微操作。这说明两大流派并非完全对立而是在不同层级上各取所长。这个观察在架构设计里也适用没有绝对最优的路线只看约束条件下的取舍。3. 存储体系性能瓶颈都在这里等着你3.1 为什么不能只用一种存储器如果有一种存储器又快、又大、又便宜整个存储体系章节可以删掉。可惜现实是SRAM快但贵DRAM便宜一些但速度不如SRAM磁盘/SSD容量大但慢好几个数量级所以计算机采用了金字塔式的存储层次寄存器、Cache、主存、外存由快到慢、由小到大。这套层次结构之所以能成立依赖的是程序的局部性原理时间局部性刚访问的数据很快还会再用和空间局部性访问了某个地址附近的地址很可能也会被访问。你可以把这种层次想象成办公桌-文件柜-档案室的关系频繁用的资料放桌上寄存器/Cache常用的放文件柜主存冷门资料移交档案室磁盘。每次从档案室调资料都要跑一趟成本高昂所以存储体系设计的核心目标就是尽量让CPU访问的数据停留在最快的那一层。理解这个目标后Cache的所有机制就都好背了。3.2 Cache的三种映射方式别硬背公式要懂映射逻辑Cache是CPU和主存之间的高速小容量存储器按一定规则把主存块复制到Cache中。核心考点是三种映射方式的地址结构直接映射每个主存块只能映射到Cache中唯一的一个行。主存地址被划分成标记行号块内地址三段。优点是硬件简单、判断快缺点是不灵活多个主存块争抢同一行容易频繁冲突。全相联映射主存任意块可以放入Cache任意一行。地址段是标记块内地址查找时需要并行比较所有行。冲突最少但比较电路复杂成本高。组相联映射介于两者之间Cache分成若干组主存块可以映射到指定组内任意一行。地址段是标记组号块内地址。这是现代CPU用的最多的一种兼顾了冲突率和硬件成本。做题时地址字段划分是最常出的题。我给你一个我自己的做题流程先确定块内地址位数由块大小决定比如64B的块块内地址就是6位再确定Cache行数或组数如果每组n路组相联组数Cache行数/n主存地址减去这两部分剩下的就是标记位。记住一个极端情况方便核对组相联的组数等于行数时就是全相联组数等于1时就是直接映射。3.3 平均访问时间计算一道手算题帮你彻底搞定几乎每年考试里都会出现Cache命中率访存时间的计算。典型题目Cache的访问时间是5ns主存访问时间是50nsCache命中率为95%求平均访问时间。这里要特别注意层次结构怎么理解Cache未命中时需要先访问Cache发现未命中再去访问主存。有的教材按未命中时访问时间为Cache时间主存时间计算有的直接按主存时间计算不同教材口径不同。我以教程口径为例平均访问时间 命中率 × Cache访问时间 (1-命中率) × 主存访问时间代入数值0.95 × 5 0.05 × 50 4.75 2.5 7.25ns如果你按未命中时先花5ns查Cache再花50ns取数据结果就是0.95×5 0.05×55 7.5ns两种口径差一点点。考试以官方教程为准做题时看清题目问的是CPU访问存储系统的平均时间还是未命中后还需多少时间。我建议你把两种口径都掌握遇到题目时先画一条时间线把查Cache→未命中→查主存的顺序画出来就不会张冠李戴。另一个常考的是主存容量与地址线位数计算主存容量为4GB按字节编址需要的地址线位数是32因为2^324G如果CPU字长32位、按字编址那么4GB主存有1G字4GB/4B地址线需要30根。这类小题考查的就是容量/编址单位单元数再取对数的熟练度平时用十进制算完记得换算成2的幂次。3.4 虚拟内存与局部性原理给进程一个内存够用的错觉主存容量再大也装不下所有进程同时运行的全部需求。操作系统用虚拟内存技术解决这个矛盾程序看到的是一个很大的连续逻辑地址空间实际数据按页或段分散在主存和磁盘之间。当CPU访问的页面不在主存中就会发生缺页中断操作系统将所需页面从磁盘调入如果主存已满还要按页面置换算法踢出一个页。这里你必须理解一个容易混淆的点缺页中断和普通中断不一样。缺页中断是在指令执行期间检测到虚拟地址对应的页不在内存时触发的而且缺页处理完成后会重新执行那条被中断的指令而不是接着下一条。因为被中断的那条指令本身没有成功完成。这是操作系统的经典考点也是搞懂虚拟内存的关键。页面置换算法里FIFO先进先出有Belady异常——分配物理块数增多缺页次数反而可能增加而LRU最近最久未使用是理论最优近似基于时间局部性淘汰最久没用的页。我在实际项目中调优数据库缓存时用的正是LRU思想的变体如LRU-K理解了它你再看Redis、Memcached、CPU TLB的实现都会觉得很亲切。虚拟内存和Cache在机制上很像都是按块搬运命中判断替换策略差异在于Cache由硬件管理对软件透明而虚拟内存由软件和硬件协作完成操作系统深度参与。4. 总线、中断与I/O控制方式CPU的对外协作方式4.1 总线结构与带宽计算数据搬运的动脉系统CPU、内存和外设之间必须有一条物理通路来传数据这就是总线。总线按功能分为三类数据总线DB双向传输数据、地址总线AB单向CPU输出地址、控制总线CB双向传输控制信号。地址总线宽度决定CPU可寻址的最大空间这是一个高频考点地址总线宽度为32根最大寻址空间是2^324GB数据总线宽度决定一次并行传输多少位数据。二者的关系经常合在一起考总线带宽。总线带宽数据传输率 数据总线宽度 × 总线时钟频率若是DDR技术记得×2。举个例子总线宽度64位频率133MHz带宽 64bit × 133MHz 8512Mbit/s ≈ 1064MB/s。做这类题唯一要小心的是单位换算8bit1ByteMHz是每秒百万次。还有个变体是双倍速率DDR比如DDR4-3200实际数据传输速率是3200MT/s。你只要记住带宽表示单位时间内传输的数据量就不会被厂家宣传带偏。总线还有仲裁多个部件争用总线时谁先使用的问题分散式和集中式仲裁是常考概念。不过在我看来更重要的是总线带来的通信瓶颈早期共享总线架构下所有设备抢同一根总线设备一多就冲突严重所以现代系统逐渐演化为分层总线如PCIe的树形交换结构每个设备有独立通道。这个演进思路和我们在微服务治理中把共享数据库拆成独立服务是一个道理——消除共享是减少竞争的根本手段。4.2 中断机制CPU响应外部事件的完整链路程序查询方式下CPU必须轮流询问外设你有活干吗效率极低。中断机制的引入让外设可以在需要CPU的时候主动举手示意。完整的中断过程可以拆成五个环节中断请求、中断判优、中断响应、中断处理、中断返回。中断请求由外设发出中断判优解决多个设备同时请求时先响应谁硬件优先级或软件查询中断响应发生在CPU的指令周期末端此时CPU会保存断点PC内容与现场寄存器状态关中断防止嵌套打乱现场转入中断服务程序中断处理执行具体服务最后恢复现场、开中断、返回到断点继续执行。这个保存现场-处理-恢复现场的思想在后面前后端架构里也非常常见——比如请求处理链路中要记录入参、校验身份、执行业务、日志回写。模板就是一套中断服务程序。还有一个高频辨析题中断响应不是中断处理。响应是CPU的动作保存现场、转入口处理是执行具体中断服务程序代码。两者混在一起案例分析题就答砸了。另一个点是中断向量表每个中断源对应一个中断向量里面存放的是该中断服务程序的入口地址CPU收到0号中断就查0号向量找到入口跳转。整个机制非常表驱动这也是后面学操作系统的系统调用时要回查的基础。4.3 I/O控制方式的演进从程序查询到DMA到通道按CPU介入程度由高到低I/O控制方式依次是程序直接查询方式、中断驱动方式、DMA方式、I/O通道方式。程序查询最落后CPU一直等中断驱动好一些外设完成后再通知CPU但每次传输1个字节或一个字都要中断一次高频I/O会让CPU疲于奔命DMA直接存储器存取则让数据在内存和外设之间直接搬运只有开始和结束需要CPU干预搬运过程由DMA控制器负责这就是你常听到的零拷贝思想的硬件基础。DMA工作流程要会背CPU先对DMA控制器编程设置源地址、目的地址、传输字节数、方向然后DMA控制器接管总线把数据从外设搬到内存或反向整块数据传完后DMA控制器发一个中断通知CPU。注意DMA在传输过程中会窃取或借用总线周期所以CPU会暂停一小段时间这是系统设计时评估DMA对大并发可能带来的影响时需要注意的点。通道方式比DMA更进一步通道本身就是一台小型处理器可以执行通道程序管理多台外设的I/O操作。我给你的记忆线查询是靠人盯中断是被动等通知DMA是专职搬运工通道是外包经理。这条线串下来以后看存储引擎的写入路径很多设计选择你会瞬间理解。4.4 硬件基础在真实系统架构中的映射学了上面这些如果只用来考试那太亏了。我在复盘实际生产系统时发现很多架构决策都能从本节找到根因。比如Kafka用页缓存和顺序写来提升吞吐其实是在利用操作系统对文件Cache的局部性管理RocketMQ的零拷贝用mmap和sendfile本质就是减少内核缓冲→用户缓冲→内核socket的无谓拷贝对应到本节就是“DMA搬运数据”大规模分布式存储选择大页内存HugePages是因为TLBCache性质页面表缓存命中率在连续大内存下有明显提升这就是Cache映射思想的直接实践。还有为什么我们的系统在做性能压测时Redis单线程模型反而能扛每秒十万级请求因为它避开了并发加锁的开销把计算都绑在CPU流水线上顺序执行。不是它比其他方案高级而是在特定的硬件访问模型下做了取舍。这类用基础概念解释系统设计的能力恰恰是架构师面试里从画图画得好到讲道理讲得透的分水岭。5. 备考与自学建议这部分我替你踩过坑5.1 高频题型与解题套路怎么把知识落成分数根据我和身边考友的复盘第2章1/3部分考试出题非常稳定基本集中在四类题地址计算类主存容量、地址线、Cache的地址字段划分。套路就三步定字节/字编址、算单元数、换算2的幂次。流水线时间类总时间 第一条全量耗时 (指令数-1)×流水线周期。注意有没有最慢阶段的坑。Cache平均访问时间类先按教材口径列公式再代入数值。千万别忘了写单位。概念辨析类I/O方式、CISC/RISC、中断相关最适合用我们在2.1、4.2里建立的那种生活类比硬件本义的方法去记。我建议你刷题时专门建一个错题本按计算失误、公式记混、概念不清三类打标签。你会发现真正让你失分的往往不是知识点没学而是概念之间相似度高导致记串。比如程序计数器PC和程序状态字PSW我见过至少三次被考到每次都是靠PC管位置、PSW管状态这个区分度掰回来的。5.2 学习顺序与资料搭配别一上来就死磕教材我自己的经验是先搭框架再填细节最后刷真题。第一遍不要抱着教材从第一页啃起先花一小时把本篇提到的知识树画出来计算机组成→CPU→存储体系→I/O与总线每个分支标上3到5个核心概念。第二遍再逐块深入配合手算例题。第三遍开始做真题刷完必须回头在知识树上标记这个考点是从哪个知识点延伸出来的。参考书方面软考指定教程是主线《深入理解计算机系统》CSAPP作为补充非常好用——它的前三章讲的数据表示、汇编、存储层次正好覆盖本篇核心而且讲得比教程深。如果你时间紧张CSAPP的Cache章节和异常控制流章节是必看的剩下的可以先扫读。网络课程我有次看《深圳大学计算机系统3》这类课程列表挂在热搜里说明很多学校已经把CSAPP体系纳入课程了有资源的直接跟着视频学效果比自己啃书好很多。提示一点这一章不同于新技术框架没有版本迭代问题学到的每一条今天不过时。你唯一需要担心的不是资料不够而是自己花太少时间在基础概念上等学操作系统时再回头补成本翻倍。我个人的体会是基础章节值得花笨功夫宁可慢一点也要把每条知识点练到能徒手讲解再往后推进。这本字典越厚后面翻起来越从容。