ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

计算机组成原理重学指南:从补码到流水线的工程视角

计算机组成原理重学指南:从补码到流水线的工程视角 写这篇文章之前我先交代个背景我是软件工程出身本科阶段对“计算机组成原理”这门课其实是有点抵触的。当时觉得我都写Java、写Python了天天跟Spring、跟框架打交道学这玩意儿干嘛寄存器、指令周期、Cache命中率听起来又老又硬跟我的日常开发八竿子打不着。直到后来做性能优化、排查线上OOM、看JVM源码、琢磨高并发下的内存屏障才意识到自己当年欠下的“底层债”全得加倍还。于是工作几年后我又回头把王道考研的B站计算机组成原理视频完整刷了一遍还买了配套的《计算机组成原理》教材对照着啃。这遍重学很多当年背了又忘、考完就丢的知识点突然就跟实际工作对上了那种“原来如此”的感觉确实挺上头的。如果你也是学软件、做后端、搞云原生、写业务代码的我猜你多多少少也有类似的困惑学计组到底有什么用考研考它期末考它但工作以后好像根本用不上这篇文章我就用过来人的视角结合王道B站视频的学习路径把“计算机组成原理”这门课的核心脉络、高频考点、容易踩坑的地方还有我重学之后在工作里的实际体会一次性讲清楚。不管你是正在期末冲刺的本科生还是准备考研的选手又或者是想补底层课的后端开发这篇文章应该都能给你一些参考。1. 先搞清楚这门课到底在讲什么1.1 学软件的人为什么也要学计算机组成原理我先说结论学软件的人学计组不是为了让你去设计CPU而是为了让你在写代码的时候脑子里能有一张“数据到底怎么跑”的地图。前阵子我调一个接口单次查询耗时120msQPS一上来就扛不住。用Arthas看方法调用链发现池化ObjectMapper每次反序列化都触发一次反射解析然后每次都向堆里new出一大串中间对象触发频繁Minor GC。我第一反应就是这个场景里CPU在做无用功寄存器、Cache、流水线全在空转等内存分配。你如果不理解指令执行是要经过取指、译码、执行的完整流程不理解访存比CPU计算慢几个数量级你就很难对“为什么减少对象创建能显著提升吞吐量”有体感。所以计组这门课本质上是回答一个问题一段高级语言代码经过编译、链接之后到底是怎么在硬件上跑起来的它站在软件和硬件的交界处往左是操作系统往右是数字逻辑电路往下是物理器件往上是编译原理和体系结构。学软件的人不需要把每个门电路都抠透但需要建立起“代码最终会变成指令指令最终会驱动硬件工作”的完整链路。1.2 王道视频这条路线有什么特点王道B站视频本来是面向计算机考研辅导的但我个人觉得它这套课程体系的价值早就超出了应试本身。整套课程以《计算机组成原理王道考研版》教材为基础章节安排非常清晰数据表示与运算、存储系统、指令系统、中央处理器、总线与输入输出系统五个大块。它的讲课风格也很适合自学不是念PPT每个知识点都会先告诉你“这地方考研怎么考”再告诉你“这个地方实际工程里对应什么”。比如讲到Cache的时候老师会反复强调“局部性原理”然后举数据库分页、循环体优化、数组遍历顺序这些场景来辅助理解。虽然是考研向课程但讲法并不枯燥理工科学生跟下来不会觉得难受。我重学的时候是二倍速过第一遍遇到“组间串行进位”“ALU设计”这类重难点会降回原速。配合教材里的课后题基本能把知识骨架搭起来。有一点要提醒王道视频有很多章节是基于考研大纲剪裁的和学校教材比如唐朔飞版、袁春风版的侧重点略有不同所以如果你是期末备考最好以你们老师划的重点为准王道视频当辅助理解用。2. 数据表示与运算所有性能问题的起点2.1 补码、移码和溢出判断别只背结论很多人学计组第一章就是背公式正数的补码等于原码负数的补码是原码取反加一。背完会做题但问他“为什么计算机要用补码”就答不上来了。王道视频里有一句话我印象很深补码的核心作用是把减法统一成加法从而让ALU只需要做加法器简化硬件设计。这个点展开说很有意思。假设我们用4位二进制表示整数如果用原码1 (-1)的结果是0001 1001 1010对应十进制-2这显然是错的。但如果我们用补码0001 1111 1 0000最高位溢出丢掉剩下0000正好是0。硬件不需要识别符号位去决定是做加法还是做减法只需要把减数取补码然后加省掉了一整套减法器逻辑。实话说这个设计思想在工作里经常遇到能用加法解决的事绝不做乘法能用移位解决的事绝不做除法。JDK的HashMap里计算数组下标用的就是(n - 1) hash而不是hash % n本质上就是在用位运算模拟取模因为按位与比除法快一个量级。理解了补码的“让硬件更简单”这个初衷你再看很多底层优化技巧会发现思路完全一致。2.2 组间串行进位到底是怎么一回事“组间串行进位”是王道视频在讲ALU进位方式时的一个重要考点。我当年期末复习的时候这块没少纠结因为它牵扯到两层结构组内并行组间串行。我们先把基础概念捋一下。加法器执行 a b 的时候每一位的进位不仅取决于当前位的两个输入还取决于低位的进位输出这形成了进位链。如果像最原始的串行加法器那样每一位都等着低一位的进位算完再动16位加法最坏情况要等16个门延迟太慢了。于是出现了“并行进位”的思路也就是通过逻辑表达式提前算出进位信号让高位不必等低位的计算结果这就是“先行进位”CLA的思想。但全字长并行进位也有问题位数越多进位逻辑表达式越复杂门电路扇入扇出压力大硬件代价太高。所以工程上折中把16位分成若干组比如4位一组。组内使用并行进位让每一位的进位信号在一个门延迟内就算出来组与组之间则采用串行方式等前一组的“组进位”输出作为后一组的输入。这样一来整体延迟远小于全串行硬件复杂度又低于全并行这就是“组间串行进位”的核心思路。我后来看CPU设计相关的资料发现这种“局部并行 全局串行”的折中策略在系统设计里极其常见。微服务架构里单个服务内部异步并行处理请求服务之间同步RPC调用也是一种类似的分层折中数据库分库分表也是单表内靠索引快速定位跨库查询靠中间件串行聚合。理解了计组里这个进位方式再看工程里的架构取舍会觉得很多设计的底层逻辑是相通的。2.3 数据相关与结构相关从硬件冲突看指令流水线热搜词里同时出现了“数据相关结构相关”这其实是计组CPU章节里的重点而且和软件开发的“数据竞争”概念有一脉相承的味道。先说什么是指令流水线。CPU执行指令可以分成取指、译码、执行、访存、写回几个阶段好比工厂流水线上不同工位各干各的活。理想情况下每过一个时钟周期就能完成一条指令吞吐率大大提高。但流水线有个天然麻烦前后指令之间会相互制约主要有三大类冲突——结构相关、数据相关、控制相关。结构相关是硬件资源不够导致的。比如指令存储器和数据存储器是同一个取指阶段和访存阶段同时要访问这个存储器就会撞车。解决办法很直观哈佛结构把指令和数据分开存储或者让访存阶段对存储器的访问延迟一拍。数据相关是前后指令有数据依赖导致的。典型例子ADD R1, R2, R3 ; R1 R2 R3 SUB R4, R1, R5 ; R4 R1 - R5第二条指令要读R1但第一条指令要等执行阶段结束才把结果写回R1。如果不做处理SUB读到的是旧值。解决思路有几种转发/旁路技术在当前指令执行阶段计算出结果后直接把结果送给下一条指令需要的部件省掉写回再读出的过程插入空操作在两条指令之间插入NOP气泡让流水线等一拍编译优化重排指令在高级语言层面就是编译器调整语句顺序来减少依赖距离。我当时学到这块的时候脑子里立刻想到并发编程里的数据竞争。多线程环境下一个线程写共享变量另一个线程读如果没有正确的同步机制读到的可能是旧值。硬件层面的“转发”解决不了跨核缓存一致性的问题所以才需要MESI协议、内存屏障这些更复杂的机制。理解了CPU流水线里的数据相关再去看volatile、看AtomicInteger的CAS会更有底气。3. 存储系统从寄存器到磁盘的一整条价格/性能链3.1 存储层次结构为什么是金字塔形计组里存储系统这一章核心就是一张金字塔图寄存器在最上面然后是CacheL1/L2/L3、主存DRAM、磁盘SSD/HDD。越往上速度越快、容量越小、成本越高越往下速度越慢、容量越大、成本越低。这个金字塔不是拍脑袋设计的而是被物理规律和成本约束逼出来的CPU太贵又太快不可能全用SRAM做内存磁盘太慢又不能直接跟CPU对接。这个层次结构能成立靠的是局部性原理时间局部性刚刚访问过的数据很可能再次被访问对应循环体变量和空间局部性访问了一个地址周围的地址很可能也会被访问对应数组连续遍历。Cache就是靠这两个特性把CPU最近要用的一块数据提前从内存搬过来让CPU大多数时候能“命中”高速缓存从而跑在接近自身速度的水平上。我做性能调优的时候有一次优化一个循环嵌套的算法测试发现把内层循环从按行遍历改成按列遍历性能差出了四五倍。原因是二维数组在内存里按行连续存储按行遍历时Cache命中率高预取机制也能充分发挥按列遍历时每次访问都跨越整行Cache频繁失效等同于每次循环都去主存搬数据自然就慢了。这就是空间局部性在最真实工作场景里的体现。3.2 Cache的映射方式、替换算法和写策略Cache这一章有三个重难点映射方式、替换算法、写策略考研和期末都喜欢考我也分别说下。映射方式解决的是“主存中的块放到Cache的哪个位置”的问题。直接映射主存块号对Cache行数取模硬件简单但冲突率高全相联映射可以放到任意行冲突率低但比较逻辑复杂组相联映射折中方案先把Cache分成组主存块映射到固定组组内可以任意放。现代CPU的L1 Cache基本都是组相联比如经典的8路组相联实测下来性价比最高。替换算法解决的是“Cache满了该把谁挤出去”的问题。主要有随机、FIFO、LRU、LFU。LRU最近最少使用是理论最优的近似因为它利用了时间局部性——刚刚用过的数据大概率很快还用那最久没用的自然是最可能“死掉”的。现代操作系统页面置换、Redis淘汰策略、数据库Buffer Pool的回收逻辑核心思想全部源于LRU族算法。写策略解决的是“CPU写数据到Cache后什么时候同步到内存”的问题。写直达Write Through简单可靠但慢写回Write Back先只改Cache标记为脏等被替换出去或Cache刷新时才写回内存性能高但一致性风险大。Redis的写回策略就是典型的“延迟落盘”先在内存里改数据后台定期刷盘这在底层思路上和Cache的写回策略是一致的。有个小技巧分享给期末复习的同学这三种策略不要分开死记而是放在“CPU与内存速度差距太大”这个大背景下理解。映射方式解决“怎么找”替换算法解决“放不下”写策略解决“改完了怎么办”三个问题串起来就是Cache的全部工作流程。3.3 虚拟内存与TLB操作系统的底层拼图计组里存储系统的最后一环是虚拟内存这块和操作系统课程高度交叉。CPU发出的地址不是直接对着物理内存的而是经过MMU内存管理单元翻译从虚拟地址变成物理地址再去访存。页面表就是这张翻译地图但页表在内存里如果每条指令都去内存查一次页表性能会崩掉。所以硬件里加了一个小号CacheTLBTranslation Lookaside Buffer专门缓存最近用过的虚拟页到物理页的映射。每次访问内存的步骤变成先去TLB里查映射命中就直接拿到物理地址不命中再去内存查页表同时把结果写进TLB。这套机制我再熟悉不过了因为线上排查高并发内存问题的时候经常会看到“TLB shootdown”相关的性能损耗。在多核CPU上如果你频繁修改进程的页表内核需要让所有核都刷新TLB缓存这个同步过程在高频场景下相当昂贵。对做后端的人而言不用研究TLB细节但至少要建立这个意识虚拟内存不是简单的一层映射它背后有专门的硬件加速结构任何一次地址翻译失败都会带来性能损耗。写代码时大量使用mmap、频繁申请释放大块内存、创建销毁线程都可能引发地址空间变化从而影响TLB命中率。这属于比较进阶的优化话题但值得你在这个阶段就埋下伏笔。4. CPU设计指令是怎么被“执行”出来的4.1 一条指令的一生CPU章节在王道视频里占的篇幅很大其中“指令的执行过程”是无论如何都要掌握的。这里我把一条指令的完整旅程串一遍你会发现其实并不神秘。首先程序编译链接后变成可执行文件里面全是机器指令。CPU上电后有一个程序计数器PC它指向下一条要取的指令地址。取指阶段CPU把PC的值送到指令存储器或Cache取出指令的二进制编码译码阶段控制单元解析操作码和地址码决定这条指令要做什么、操作数在哪执行阶段ALU干活做加减、逻辑运算或者地址计算访存阶段如果需要读内存或写内存在这个阶段完成写回阶段把结果写到目标寄存器。每一拍都需要一个时钟信号来同步就像一个乐队跟着指挥的节拍器前进。串行执行的话一条指令需要多个时钟周期才能走完频度低。后来出现了流水线设计把不同指令的不同阶段重叠起来只要每个阶段硬件独立就可以像工厂流水线一样让多条指令同时处于不同阶段从而大幅提升吞吐率。现代CPU的主频几年不涨性能却在涨很大程度靠的就是更强的流水线、更深的乱序执行、更多的核心。4.2 硬布线控制与微程序控制CPU的控制器设计有两种经典路线硬布线控制和微程序控制。这是一个期末选择题的高频考点但很多人只看结论记不住我讲个容易理解的对照。硬布线控制就像用一堆专门的电路把控制逻辑线焊死。每一条指令对应一组逻辑门电路指令一来电路直接产生对应的控制信号。优点是速度快缺点是灵活性差指令集一改电路就要重做。现在的高性能CPU比如Intel、ARM的高端型号大多采用硬布线控制因为追求极致的指令执行速度。微程序控制则像把控制逻辑变成“查表”。每条机器指令对应一段存储在控制存储器里的微指令序列执行指令时依次读取这些微指令逐条产生控制信号。因为控制逻辑是存在ROM里的所以要扩展指令集只需要改微程序不用动电路。优点是灵活、设计简单缺点是每次执行都要查一次控制存储器速度比硬布线慢。教学用CPU、早期的CISC处理器多用这种方式。有个类比我课堂上给学生讲过硬布线像是定制了一条专属高速路走上去就快但改路线就得拆路重修微程序像在普通道路上开车每到一个路口都要查一下导航灵活但每步都有额外开销。两种方案没有绝对优劣只看你在设计目标里把“速度”和“灵活性”哪个放在前面。4.3 指令流水线的冒险与解决前面提到的数据相关和结构相关其实都属于流水线冒险的范畴。这里我再补充一个控制相关也是流水线设计的第三类敌人。控制相关出现在分支指令上。CPU取指阶段默认顺序取下一条指令但如果当前指令是“如果a b就跳转到xxx”必须等执行阶段算完条件才知道要不要跳转那么流水线里提前取进来的后续指令就全部作废了。分支预测器就是为了解决这个问题而生的提前猜一下跳转方向猜对了流水线不停猜错了要冲刷掉已经取进来的指令重新开始。现代CPU的分支预测准确率一般能达到95%以上性能贡献极大。我举一个工程上的例子如果把高频执行循环里的if条件写得散落各处、随机跳转会导致分支预测器失灵而把高概率路径写成主线代码把异常场景用guard clause抛出去既能提升可读性也能让分支预测更顺。虽然现代编译器会自动优化但理解分支预测的原理后你会更明白“代码写法对性能有影响”这件事绝对不玄学。5. 总线和输入输出系统被忽视但必考的隐藏难点5.1 总线仲裁多设备抢总线谁说了算讲完CPU内部接下来是CPU和外部世界的通信。总线是连接CPU、内存、外设的公共通道。但总线是共享资源同一时刻只允许一个设备在上面发送数据于是就需要总线仲裁来决定谁先用。总线仲裁分集中式和分布式两类。集中式仲裁有一个专门的仲裁器常见的有三种方式链式查询设备像串糖葫芦一样依次传递请求优先级固定、计数器定时查询仲裁器用一个计数器轮流询问设备优先级可变、独立请求每个设备有独立的总线请求线和总线授权线仲裁器集中裁决。分布式仲裁则没有中心节点所有设备通过预定义的优先级逻辑自己竞争。我第一遍学这块的时候总觉得距离软件太远。后来接触消息中间件看到Kafka的分区分配、RocketMQ的消费队列负载均衡以及各种分布式锁的实现发现“多个请求者竞争一个共享资源”这个模型在软件里到处都是。计组里总线的“同一时刻只有一个设备能发送”和数据一致性里的“同时只允许一个写者进入临界区”本质上是一个问题域。理解总线仲裁的优先级划分方式对理解分布式系统的公平性与优先级设计很有帮助。5.2 程序查询、中断、DMA三种I/O方式I/O控制方式有四种王道视频里常考三种程序查询方式、中断驱动方式、DMA方式。我直接对比着讲。程序查询方式最原始CPU不断轮询设备状态寄存器看数据准备好没有准备好了就搬运数据。优点是控制简单缺点是CPU全程被占用一边等一边空转效率极低。这就好比你去餐厅吃饭每隔十秒拉服务员问一遍“菜好了没”服务员本来可以干别的活全被你耽误了。中断驱动方式好一些CPU先发一个I/O命令然后该干嘛干嘛设备准备好了主动发中断信号通知CPUCPU再暂停当前程序去处理数据。这就像服务员先忙别的菜好了喊你一声。但缺点是每传输一个数据都要CPU中断一次中断保护现场、恢复现场也是有开销的。DMA方式再进一步DMA控制器Direct Memory Access接管数据搬运工作CPU只需要在启动时告诉DMA控制器“数据从哪来、到哪去、多少字节”然后DMA控制器可以自己把一大块数据从外设搬到内存搬运完成后再中断通知CPU。整个过程CPU只在开始和结束时刻参与中间完全脱离。这就像你叫了个外卖跑腿下单和收餐是你的事中间配送完全不用你操心。在现代存储系统里NVMe SSD的读写本质上就是DMA模型CPU提交一个IO请求后就能去跑别的任务数据搬运由硬件控制器完成完成后通过中断通知内核。理解了DMA你就能明白为什么高并发场景下IO密集任务的CPU占用率能做到那么低。5.3 中断过程与中断屏蔽中断是I/O系统里的另一大考点。一个完整的中断处理过程包括中断请求、中断判优、中断响应关中断、保护断点、寻找中断服务程序入口、中断服务程序执行、恢复现场、开中断返回。中断判优的原则是硬件故障中断优先级最高然后是DMA请求、外部设备中断内部软件中断比如系统调用通常在比较低的位置。优先级高的中断可以打断优先级低的中断服务程序这叫中断嵌套。中断屏蔽字就是用来控制当前CPU能响应哪些中断、不能响应哪些的机制。写并发程序的时候关中断、开中断对应着临界区的互斥思想进入临界区前“关中断”加锁出临界区后“开中断”解锁确保一段代码在执行过程中不被其他“请求”打扰。理解这个原始模型之后再看Java里的synchronized底层实现、ReentrantLock、CAS会有一种“所有并发原语都在解决同一个古老问题”的通透感。6. 跟着王道B站视频学的完整实操路径6.1 视频怎么看、笔记怎么记、题目怎么刷如果你是零基础或者基础薄弱我的建议是分三轮走不要想着一次就全搞懂。第一轮跟视频搭框架约2-3周。王道B站的计算机组成原理视频总共大概60-70集每集40分钟左右。建议开1.5倍速通看这一遍目标是听懂核心概念不用强求立刻能做题。数据结构里链表、栈、队列还没熟悉的同学建议先补一点基础因为计组里的知识环环相扣前面数据表示没学懂后面CPU和存储系统会很吃力。笔记不要抄PPT用自己的话把每个知识点背后的“为什么”写出来比如“为什么用补码”“为什么分缓存层次”“为什么流水线有冒险”。第二轮对着教材细抠做题约2-3周。王道《计算机组成原理》辅导教材配套习题质量很高尤其是选择题每一道都值得研究。我的习惯是先做题再回看视频题目错了说明这个点的理解有偏差再回去看视频里对应片段印象会特别深。做计算题时比如Cache容量计算、补码加减法、磁盘寻址时间计算一定要动手算不要在脑子里“想当然”。第三轮专题串讲套卷约1周。把知识点串成线给你一条指令从取指到写回每一步发生了什么给你一个地址访问序列手算直接映射和组相联映射下Cache的命中率给你一组数手算补码加减并判断溢出。这些都是王道视频冲刺串讲部分覆盖的核心技能。当时我考前手推这些题目比单纯刷题有用得多。6.2 期末和考研两种目标的备考差异如果你是为了期末考试建议先看老师PPT里反复强调的部分。大多数学校期末考试会重点考数据表示与运算、存储器的扩展与Cache、指令格式与寻址方式。选择题和计算题各占半壁江山。王道视频讲解详细但部分内容超出本科教学大纲备考时要学会自己过滤。如果你是为了考研那王道这套视频就是主粮之一。需要注意王道课程的章节顺序是“数据表示→存储系统→指令系统→CPU→总线与I/O”和很多学校教材的顺序比如唐朔飞版是“总线→存储器→CPU→指令系统”不太一样。考研一轮复习建议直接按王道的顺序走二轮再回到教材对照学校大纲查漏补缺。6.3 学完怎么检验成果检验学习效果的方式其实很简单给你一段C代码你能说出它在机器层面经历的完整流程吗从变量存储位置、类型转换、数组内存布局到编译后可能的指令序列、函数调用栈的压栈出栈、Cache和TLB的影响再到操作系统分配内存、缺页中断、DMA与磁盘IO的交互。如果这些问题你都能有条理地解释清楚那说明计组这门课的基本功已经扎实了。我当时给自己设置的一个“验收项目”是用GDB调试一个递归程序观察调用栈上的栈帧布局和返回地址然后打开objdump看编译出的汇编代码对照着理解CPU取指执行的过程。这一套流程走下来课本上的抽象概念才算真正落地。7. 学习过程中的常见问题与避坑指南7.1 一些常见的理解难点与破解方法我整理了几个我自己和身边同学都容易卡住的点按“症状—原因—解法”列出来方便你有针对性地排查。症状一补码加减法一做就错特别是溢出的判断。原因往往是死记硬背了规则没有明白补码运算的本质。解法回到定义用“双符号位法”判断溢出即最高位进位和次高位进位不同则溢出。做题时养成把符号位和数值位分开看的习惯不要直接套十进制思维。症状二Cache三种映射方式混在一起计算题算不对。原因是只记了定义没有画图。解法拿一张纸画出主存地址的字段划分。直接映射就是“中间取行号”全相联是“直接比标记”组相联是“先分组再比标记”。手动画两遍比背十遍文字有效得多。症状三指令系统里寻址方式太多记不住。原因是把立即数寻址、直接寻址、间接寻址、变址寻址当成孤立的表格背了。解法每种寻址方式的本质就是“如何在指令中表达操作数的位置”把“指令里藏了什么”和“算完地址之后CPU去哪里取数”两件事对齐所有寻址方式都能推理出来不用背。症状四数据相关和结构相关分不清。解法结构相关是“硬件资源不够打架”数据相关是“指令之间有数据依赖顺序”。记一句话结构相关是并发问题数据相关是顺序问题。7.2 一个过来人的学习心态建议计组这门课的学习曲线确实比其他计算机基础课更陡一些因为它的知识点密集又涉及大量“看见但摸不着”的硬件抽象。很多人在学到CPU流水线那一章会有“这到底跟我有什么关系”的困感。我的建议是不要在第一遍就追求完全弄懂千万别因为一道ALU设计题没做出来就否定自己。计组的知识结构是螺旋上升的很多内容在第一遍接触时只能形成模糊印象等你学到后面的章节再回头看前面的知识点会突然“开窍”。我就是学到存储系统之后才真正理解了第一章补码为什么这么设计——因为它们都在服务同一个目标让硬件用最简单的方式完成最核心的计算。另外一个小技巧是学计组的时候可以动手做一个简单实验。最常见的计组实验包括使用Logisim设计一个简单ALU并仿真用MARS模拟器写一段MIPS汇编观察单步执行时寄存器和内存的变化写一个C程序用time命令对比不同遍历顺序下程序的运行耗时。这些实验看起来“原始”但能把教材里的概念变成脑袋里会动的画面效果比纯看视频翻PPT好得多。7.3 学完计组以后下一步应该学什么如果你学完计组觉得“还挺有意思”那恭喜你门算是迈进来了。接下来根据你的方向可以考虑这几门衔接课学操作系统理解进程调度、内存管理、文件系统如何建立在硬件机制之上。计组里的中断机制、DMA、虚拟内存在操作系统课程里都会再次出现但视角更偏软件。学计算机体系结构深入分支预测、乱序执行、多核缓存一致性了解CPU性能到底是怎么被“榨”出来的。学编译原理理解高级语言如何被翻译成汇编、优化器做了什么。汇编里每一个指令在计组里都有对应的硬件执行过程二者互为印证。对大多数非硬件方向的同学学到“能理解、能运用”的层面就够了不用把数字电路和Verilog也补齐。但如果你哪天发现自己对CPU内部设计、流水线优化产生了浓厚兴趣那么往体系结构和芯片设计方向走也是一条很有前景的路。最后分享一个我个人的小经验。我重学计组的时候给自己定了一个规矩每学完一个章节必须写一小段“用软件工程师思维理解这个章节”的笔记不写术语解释只写这个知识点让我想到了工作里的什么场景。坚持下来之后这门课从“考前突击的负担”变成了“理解计算机系统的钥匙”这个转变作用不亚于当年第一次上手写业务代码时的恍然大悟。把这些内容分享出来希望你不要再走我当年“考前背完、考后全忘”的老路。计组不是一门只属于考研党的课它是所有写代码的人理解计算机底层逻辑的一道门。推开这道门你再看自己的代码视角会完全不一样。
返回列表