ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

软件设计师硬件基础考点精讲:补码、Cache与流水线计算

软件设计师硬件基础考点精讲:补码、Cache与流水线计算 1. 从一道指令周期题说起硬件基础到底在考什么很多人第一次翻开软件设计师的备考资料看到计算机硬件基础这一章第一反应是跳过。理由也很充分我是来做软件设计的凭什么要懂什么总线、什么Cache、什么流水线我当初也是这么想的直到做了一套真题被一道指令周期的计算题卡了整整二十分钟才意识到这一章的分值虽然不算最高但它是整张试卷里性价比最稳的一块——概念清晰、公式固定、题型重复率高属于投入两小时就能稳稳拿分的类型。软件设计师考试里的硬件基础和大学里计算机组成原理那门课完全不是一个难度层级。它不要求你会画时序图也不要求你推导浮点运算的舍入误差它考的是你对计算机这个黑盒子的运行逻辑有没有一个清晰的框架认知。指令怎么取、怎么译码、怎么执行数据在CPU、内存、Cache之间怎么流动总线带宽怎么算流水线为什么能提速、提速的上限在哪里。这些东西说白了就是一句话你得知道程序跑起来的时候机器内部发生了什么。这篇文章面向的是正在备考软件设计师、或者想系统梳理硬件基础知识的人。我会把这一章的核心考点拆成几个模块每个模块讲清楚三件事这个概念为什么存在、考试怎么考、以及我在做题时踩过哪些坑。文中涉及的计算题我都会给出完整的推导过程涉及的概念我都会用生活化的类比帮你建立直觉。你不需要任何硬件背景跟着走一遍就能把这一章吃透。需要先说明的是软件设计师的硬件部分有个很明显的特征它考的不是深度而是广度和准确度。广度意味着你要知道的东西不少从数制转换到存储体系到总线到流水线覆盖面很宽准确度意味着很多题目就卡在一个细节上比如Cache命中率的公式里到底是命中次数还是命中率比如流水线的周期到底取哪一级的最大值。这些细节教材上往往一笔带过但考试偏偏就考这些。2. 数据的表示为什么补码能统治整个计算机2.1 原码、反码、补码的来龙去脉计算机里所有的数据归根结底都是0和1。但0和1怎么表示负数这件事在历史上折腾了很久。最早用的是原码最高位当符号位0表示正1表示负剩下的位表示绝对值。这个方案最直观人一看就懂但它有两个致命问题。第一个问题是正零和负零。8位原码里00000000表示010000000表示-0。同一个零有两种表示这在逻辑上就很别扭硬件做比较的时候还得额外判断。第二个问题更严重减法没法直接用加法器实现。你用原码做1(-1)硬件得先判断符号、再决定是做加法还是减法、最后还要处理符号位电路设计会变得非常复杂。于是有了反码正数的反码和原码一样负数的反码是符号位不变、其余位取反。反码解决了减法的问题但正负零的问题还在——00000000是011111111是-0。最终的赢家是补码。补码的规则是正数的补码等于原码负数的补码等于反码加一。这个加一看起来简单效果却非常漂亮它把-0的那个编码挤掉了让8位能表示的范围从-127到127变成了-128到127多表示了一个数。更重要的是补码让减法彻底变成了加法——A减去B直接算A加上B的补码就行符号位一起参与运算不需要任何特殊处理。记忆技巧求负数的补码从右往左找到第一个1这个1和它右边的0都不动左边的所有位全部取反。比如-6的8位补码6是00000110从右往左第一个1在倒数第二位保留这个1和右边的0左边取反得到11111010。这个方法比取反加一快得多考场上能省不少时间。考试里最常见的考法是给你一个十进制数让你写出它的补码或者反过来给你一个补码让你还原成十进制。还有一种进阶考法是补码的符号扩展把一个8位补码扩展成16位正数高位补0负数高位补1。这个点在涉及数据类型转换的题目里经常出现。2.2 浮点数的表示与IEEE 754的考试套路浮点数在考试里的出现频率比定点数低但一旦出现就是送分题或者送命题。送分的情况是考你IEEE 754的基本结构符号位1位、阶码8位用移码表示、尾数23位用原码表示且隐含最高位的1。送命的情况是考你阶码的偏移量到底是多少、隐含位什么时候加什么时候不加。我用一个具体例子把整个流程走一遍。把十进制数-12.5转成IEEE 754单精度格式第一步转成二进制12.5 1100.1。第二步规格化把小数点移到第一个1后面得到1.1001乘以2的3次方。第三步确定符号位负数为1。第四步算阶码指数是3移码的偏移量是127所以阶码 3 127 130转成二进制是10000010。第五步确定尾数规格化后小数点后面的部分是1001补足23位得到10010000000000000000000。拼起来就是1 10000010 10010000000000000000000。注意阶码用移码而不是补码原因是移码做比较运算更方便——移码的无符号比较结果和带符号比较结果一致硬件实现更简单。这个为什么考试不考但理解了能帮你记住偏移量是127而不是128。浮点数这块还有一个常考的对比单精度和双精度的区别。单精度是1823双精度是11152。双精度的阶码偏移量是1023。考试有时候会给你一个双精度的十六进制表示让你解析套路和单精度完全一样只是位数变了。2.3 校验码奇偶校验、海明码和CRC的分工校验码这一块三种码各有各的适用场景考试喜欢考它们的区别和计算。奇偶校验最简单就是在数据后面加一位使得整个编码中1的个数是奇数奇校验或偶数偶校验。它能检测出奇数个位出错但检测不出偶数个位出错而且完全不能纠错。考试一般就考你能不能检错能不能纠错这两个判断。海明码是考试的重点。它的核心思想是在数据的特定位置插入校验位每个校验位负责校验一组特定的数据位。校验位的位置是2的幂次方第1、2、4、8、16位。每个数据位的位置编号可以拆成若干个校验位位置的和它就被那几个校验位共同校验。举个例子8位数据需要几位校验位公式是2的k次方大于等于nk1其中n是数据位数k是校验位数。n8时k4因为2的4次方168411316大于等于13。所以8位数据需要4位校验位总共12位。海明码的纠错能力是检二纠一可以检测出两位错误或者纠正一位错误。考试经常考这个结论以及校验位位数的计算。CRC码循环冗余校验在考试里主要考概念它是用多项式除法产生的检错能力强但同样不能纠错。CRC在通信和存储领域用得非常多考试有时候会结合数据传输的场景来考你选哪种校验方式。校验方式检错能力纠错能力典型应用场景奇偶校验奇数位错误无简单数据传输海明码两位错误一位错误内存校验CRC码多位错误无网络通信、磁盘存储3. 存储体系从寄存器到硬盘的速度阶梯3.1 存储器的层次结构为什么长这样计算机的存储体系是一个金字塔越往上速度越快、容量越小、价格越贵越往下速度越慢、容量越大、价格越便宜。这个结构不是人为设计的而是被物理规律逼出来的——速度快的存储介质比如SRAM成本高、集成度低速度慢的介质比如磁盘成本低、容量大。如果全部用最快的机器贵得没人买得起如果全部用最慢的机器慢得没法用。所以只能分层用Cache把常用的数据放在离CPU近的地方。这个层次结构里考试最关注的是Cache和主存之间的交互。Cache的存在基于一个叫局部性原理的假设程序在一段时间内倾向于访问同一块内存区域空间局部性以及重复访问同一块内存区域时间局部性。因为有了局部性把最近用过的数据放在Cache里下次访问就能直接命中不用去慢速的主存里取。3.2 Cache命中率与平均访问时间的计算这是硬件部分最高频的计算题没有之一。公式本身不复杂但考试喜欢在细节上做文章。基本公式是平均访问时间 命中率 × Cache访问时间 未命中率 × 主存访问时间。但这里有个坑有些题目里未命中时的访问时间不是单纯的主存访问时间而是先访问Cache发现没命中再去访问主存的总时间也就是Cache访问时间加上主存访问时间。这两种理解会导致完全不同的答案。我拿一道典型题来说明。假设Cache访问时间是1ns主存访问时间是10ns命中率是95%。如果按第一种理解平均时间 0.95×1 0.05×10 0.95 0.5 1.45ns。如果按第二种理解平均时间 0.95×1 0.05×(110) 0.95 0.55 1.5ns。做题时一定要看清楚题目怎么描述未命中的过程。如果题目说未命中时需要访问主存通常指的是第二种如果说未命中时直接访问主存可能是第一种。这个细节每年都能坑掉一批人。还有一种进阶考法是多级Cache。比如L1和L2两级CacheL1命中率90%L2命中率80%在L1未命中的情况下。这时候的计算要分步先算L1未命中的概率是10%这10%里又有80%在L2命中所以L2的全局命中率是10%×80%8%剩下2%才去访问主存。平均时间 0.9×L1时间 0.08×L2时间 0.02×主存时间。3.3 主存容量计算与地址编址主存容量的计算题通常和地址总线、数据总线结合在一起考。核心关系是存储容量 存储单元个数 × 每个存储单元的位数。如果题目告诉你地址总线是20位数据总线是8位那么存储单元个数是2的20次方每个单元8位总容量就是2的20次方×8位 1M×8位 1MB。这里有个容易混淆的点按字节编址和按字编址。按字节编址时每个地址对应一个字节8位按字编址时每个地址对应一个字字长可能是16位、32位等。如果题目说按字编址字长为32位地址总线24位那么容量 2的24次方×32位 16M×32位 64MB。考试还喜欢考内存芯片的扩展。比如用若干片小容量芯片拼成大容量内存需要多少片。这个计算分两步先看位扩展数据位数不够需要并联再看字扩展存储单元个数不够需要串联。比如用1K×4位的芯片组成4K×8位的内存需要(4K/1K)×(8/4) 4×2 8片。4. 指令系统与流水线CPU内部的装配线4.1 指令的格式与寻址方式一条指令通常由操作码和操作数两部分组成。操作码告诉CPU要做什么加、减、跳转等操作数告诉CPU对谁做。操作码的位数决定了指令的种类数如果操作码有4位最多支持16种指令。寻址方式是考试的高频考点核心是搞清楚操作数在哪里。常见的寻址方式有立即寻址操作数直接写在指令里取指令的时候顺便就取到了速度最快但操作数大小受指令长度限制。直接寻址指令里给的是操作数的内存地址需要再访问一次内存才能拿到操作数。间接寻址指令里给的是一个地址这个地址里存的才是操作数的地址需要访问两次内存。寄存器寻址操作数在寄存器里不需要访问内存速度快。寄存器间接寻址指令里给的是寄存器编号寄存器里存的是操作数的内存地址需要访问一次内存。考试常考的是哪种寻址方式需要访问几次内存。记住一个规律操作数在指令里立即寻址是0次操作数在寄存器里寄存器寻址是0次操作数在内存里直接寻址是1次操作数的地址在内存里间接寻址是2次。4.2 流水线的基本原理与执行时间计算流水线的思想来自工厂的装配线把一条指令的执行拆成多个阶段每个阶段由独立的硬件负责不同指令的不同阶段可以重叠执行。这样虽然单条指令的执行时间没变但整体的吞吐率提高了。经典的流水线分五个阶段取指IF、译码ID、执行EX、访存MEM、写回WB。在理想情况下每个时钟周期都有一条指令完成流水线的吞吐率是每个周期一条指令。流水线的执行时间计算公式是第一条指令的完整执行时间 (指令条数 - 1) × 流水线周期。其中流水线周期是所有阶段中耗时最长的那个阶段的时间。举个例子某流水线分4个阶段各阶段时间分别是2ns、3ns、2ns、1ns执行100条指令。流水线周期取最大值3ns。第一条指令需要23218ns剩下的99条每条需要一个周期3ns总时间 8 99×3 305ns。如果不使用流水线每条指令都需要8ns100条就是800ns。加速比 800/305 ≈ 2.62。这里有个关键点流水线的加速比有上限上限等于流水线的级数。因为理想情况下流水线的吞吐率是串行的k倍k是级数但实际中由于各阶段时间不均衡、存在数据冲突等原因加速比会低于k。考试如果问你加速比能否超过流水线级数答案是不能。4.3 流水线的冲突与冒险流水线不是完美的它会遇到三种冲突结构冲突是指多条指令同时争用同一个硬件资源。比如取指阶段和访存阶段都要访问内存如果只有一个内存端口就会冲突。解决办法是增加硬件资源比如分开的指令Cache和数据Cache。数据冲突是指后面的指令需要用到前面指令还没写回的结果。比如指令A要算R1R2存到R3指令B紧接着要用R3。解决办法有 forwarding旁路技术把计算结果直接传给下一条指令不用等写回或者插入气泡stall让流水线等一等。控制冲突是指遇到跳转指令时流水线不知道下一条该取哪条指令。解决办法有分支预测猜一个方向先取着猜错了再回滚。考试里数据冲突考得最多通常给你一段指令序列问你哪里会发生冲突、需要插入几个气泡。判断方法是看相邻指令之间有没有写后读的关系。5. 总线与I/O系统数据的高速公路与出入口5.1 总线带宽的计算总线是连接CPU、内存、外设的公共通道。总线的性能指标主要有两个宽度和频率。宽度是指一次能传多少位数据频率是指每秒能传多少次。总线带宽的计算公式是带宽 总线宽度 × 总线频率 / 8除以8是把位转换成字节。比如总线宽度32位频率100MHz带宽 32×100M/8 400MB/s。考试有时候会考总线复用地址线和数据线共用一组线先传地址再传数据。这样做的好处是减少引脚数降低成本缺点是降低了传输效率因为地址和数据不能同时传。还有一种考法是总线的仲裁多个设备同时请求使用总线时怎么决定谁先用。常见的仲裁方式有链式查询、计数器定时查询、独立请求。链式查询最简单但优先级固定离控制器近的设备优先级高独立请求最灵活但需要的线最多。5.2 I/O控制方式的演进I/O控制方式经历了从CPU全程参与到CPU几乎不参与的演进考试喜欢考这几种方式的区别。程序查询方式CPU不断查询外设的状态直到外设准备好才进行数据传输。这种方式CPU利用率极低因为大部分时间都在空转等待。中断方式外设准备好之后主动通知CPUCPU暂停当前程序去处理数据传输。这种方式比查询方式效率高但每次数据传输都需要CPU介入对于大量数据传输来说开销还是太大。DMA方式直接内存访问由一个专门的DMA控制器负责数据搬运CPU只需要在开始的时候告诉DMA从哪搬到哪、搬多少然后就可以去干别的事了。DMA搬完之后发一个中断通知CPU。这种方式适合大量数据的快速传输比如磁盘读写。通道方式比DMA更高级通道本身就是一个小的处理器可以执行通道程序控制多台外设。这种方式在大中型机里用得多软件设计师考试里一般只考概念。I/O方式CPU参与程度适用场景数据传输单位程序查询全程参与简单外设字节/字中断每次传输都参与键盘、鼠标字节/字DMA仅开始和结束参与磁盘、网卡数据块通道几乎不参与大型机多外设一组数据块5.3 中断处理的全过程中断是考试的重点尤其是中断响应的时间点和中断处理的步骤。中断响应的时机是一条指令执行完毕之后而不是在指令执行过程中。这是因为指令执行到一半被打断的话现场很难保存和恢复。所以CPU会在每条指令结束时检查有没有中断请求有的话就响应。中断处理的完整步骤是保护现场把当前程序的断点和寄存器内容压栈、识别中断源找到是哪个设备发出的中断、执行中断服务程序、恢复现场、返回断点。考试常考的一个细节是中断屏蔽高优先级的中断可以屏蔽低优先级的中断但低优先级不能屏蔽高优先级。还有中断嵌套高优先级的中断可以打断正在执行的低优先级中断服务程序。有个容易混淆的点中断和异常不是一回事。中断是外部事件引起的比如键盘按下异常是内部事件引起的比如除零、缺页。考试有时候会用内部中断和外部中断来区分内部中断就是异常。6. 备考实操我是怎么把这一章从弱项变成送分题的6.1 建立知识框架比刷题更重要我一开始备考的时候上来就刷题结果发现硬件部分的题目错得五花八门有时候是公式记混了有时候是概念理解偏了有时候是题目里的某个词没注意到。后来我停下来花了一个下午把这一章的框架画了一遍数据表示、存储体系、指令系统、流水线、总线、I/O六大块每块下面列出核心概念和公式。画完之后再刷题正确率明显上来了。框架的作用是让你知道这道题考的是哪一块然后从那一块的知识库里调取对应的公式和方法。没有框架的话每道题都是新的刷再多也形不成积累。6.2 计算题要动手算不能只看硬件部分的计算题看答案觉得哦原来是这样和自己动手算一遍完全是两回事。我踩过的坑是看答案的时候觉得流水线周期取最大值这个规则很简单结果做题的时候遇到各阶段时间有零有整的一紧张就取错了。我的建议是每类计算题至少动手算十道算到不用想就能写出公式为止。尤其是Cache命中率、流水线执行时间、总线带宽、主存容量这四类几乎每年都考必须练到条件反射。6.3 易混淆概念要对比着记硬件部分有很多成对出现的概念单独记很容易混对比着记就清楚多了。比如原码 vs 补码原码直观但有正负零补码统一但需要转换Cache vs 内存Cache快但小且贵内存慢但大且便宜中断 vs DMA中断每次传输都要CPU参与DMA只在开始和结束参与流水线周期 vs 指令执行时间周期取最慢阶段执行时间是各阶段之和我当时的做法是拿一张A4纸左边写概念A右边写概念B中间写区别。考前翻一遍比翻教材快得多。6.4 考试当天的做题策略硬件部分的题目在试卷里通常是前几道这时候脑子最清醒适合做计算题。我的策略是先扫一遍所有硬件题把纯概念题比如以下哪种寻址方式需要访问内存两次快速做掉把计算题标记出来等概念题做完再集中算。这样避免在一道计算题上卡太久影响后面的节奏。还有一点硬件部分的题目如果算了两次答案不一样不要慌回去检查单位有没有统一ns和μs、MB和Mb检查公式有没有用错命中率有没有搞反检查题目有没有额外的条件比如不考虑Cache访问时间。大部分错误都是这些细节引起的。6.5 这一章值得投入多少时间我的判断是硬件基础这一章投入总备考时间的10%到15%比较合理。它不像数据结构那样需要大量练习也不像操作系统那样概念繁多它的知识点是有限的、封闭的把框架建起来、把公式练熟、把易混点对比清楚就能拿到大部分分数。如果你时间紧张优先保证这几块补码转换、Cache命中率计算、流水线执行时间计算、总线带宽计算。这四块几乎每年都考而且题型固定投入产出比最高。海明码、CRC、中断嵌套这些考的频率稍低但概念不难考前过一遍就行。最后说一个我自己的体会硬件基础这一章学的时候觉得枯燥但学完之后回头看它其实是整个软件设计师知识体系里最实在的一块。你写的每一行代码最终都要变成指令在CPU里跑都要经过Cache和内存都要通过总线跟外设交互。理解了这些你对程序性能的理解会完全不一样——你知道为什么数组遍历比链表快空间局部性好Cache命中率高你知道为什么减少函数调用能提速减少流水线冲突你知道为什么批量读写比逐条读写快DMA vs 中断。这些直觉是光看软件层面的书得不到的。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表