首页 / 资讯中心 / 文章详情

计算机组成原理习题解析:五大部件、补码溢出与存储总线易错点

计算机组成原理习题解析:五大部件、补码溢出与存储总线易错点 ★ FEATURED ARTICLE
简介《计算机组成原理第六版习题解析》以PDF文档形式呈现面向计算机专业学生、考研复习者及希望夯实硬件基础的读者用于对照教材梳理习题思路、核对答案并归纳核心考点。资源包共1个PDF文件大小约3.93MB体积轻便便于在电脑或移动设备上随时查阅。内容覆盖中央处理器结构、存储器分类、总线结构、指令系统与性能指标等基础章节同时涉及计算机系统的应用场景、发展趋势以及安全性、可靠性、扩展性和能效等议题对典型习题可结合概念辨析与解题过程进行复盘帮助读者建立各知识点之间的联系理解步骤背后的组成原理并可作为课程作业与自测的辅助材料。已有11455人学习下载适合课后练习、章节复习、课堂配套学习与考前查漏补缺时参考。1. 一张知识地图计算机组成原理到底在考什么翻开《计算机组成原理》第六版配套的习题解析多数人的第一反应是题目多、公式杂其实整本书的考点收敛得很紧一条主线是冯·诺依曼结构下五大部件怎么连、怎么协作另一条主线是用时间和容量两类公式把性能算清楚。围绕这两条线铺开的是运算器、控制器、存储器层次、总线与指令系统五个模块每个模块都能出概念题、计算题和简单的分析设计题。这份习题解析的价值不在答案本身而在把推导过程摊开——知道为什么错比知道选什么更重要。它适合已经过了一遍教材、正在刷题的人也适合考前想按模块回炉的人。2. 五大部件与冯·诺依曼结构先把骨架搭稳教材开篇的概念题看着最没有技术含量实际却是丢分重灾区。解析里那些“下列操作由哪个部件完成”的题错的人往往不是没背过而是把部件的职责边界记成了模糊的一团。骨架不稳后面运算器、存储器、总线的题都会连带出错。2.1 五大部件的职责边界计算机系统被拆成输入设备、输出设备、存储器、运算器、控制器五个部分这个划分从早期机器一直沿用到现在的教材体系。要记的不是五个名字而是每个部件的输入输出关系它接收什么、产出什么、听谁指挥。选择题常在这层关系上做手脚比如把“指令译码”安到存储器头上或者让运算器去发控制信号。部件核心职责常见考法运算器算术运算与逻辑运算暂存中间结果判断某运算由谁执行、标志位由谁产生控制器取指、译码、发控制信号协调各部件时序判断控制信号来源、指令执行节拍存储器存放程序和数据按地址读写区分主存/辅存、区分存储单元与存储字输入设备把外部信息转换成机器可处理的形式与 I/O 接口的界限输出设备把处理结果转换成外部可识别的形式与 I/O 接口的界限需要额外强调两点。第一中央处理器等于运算器加控制器这个等式在填空题里出现频率极高但很多人答题时会顺手把存储器也划进 CPU导致整道题连带失分。第二存储器里既放数据也放程序这正是存储程序思想的具体体现凡是把“程序单独存放”当成冯·诺依曼结构特征的选项一律是错的。解题时可以用一个分层判断法先问这件事属于数据加工、时序控制、信息存放还是内外转换。数据加工归运算器时序与控制信号归控制器按地址存取归存储器机器内外形式转换归 I/O 设备与接口。解析里凡是绕来绕去的题用这四问过一遍基本能落位。2.2 冯·诺依曼与哈佛结构的差别冯·诺依曼结构的核心是存储程序程序和数据以二进制形式存放在同一个存储器里按地址访问指令由程序计数器顺序指出。这条设计带来了一个天然限制——取指令和取数据共用一套存储通路在同一时刻只能做一件事所谓“冯·诺依曼瓶颈”说的就是这个。哈佛结构把指令存储器和数据存储器分开两条通路可以并行工作取指和取数能同时进行。教材里讲这个对比通常是为后面流水线和 Cache 的内容埋伏笔。对比项冯·诺依曼结构哈佛结构指令与数据存储共用同一存储器分开存储地址空间统一编址独立编址取指与取数不能同时进行可并行硬件复杂度较低较高典型应用场景通用计算机数字信号处理、嵌入式控制器这一节的易错点集中在绝对化表述上。“哈佛结构一定比冯·诺依曼结构快”是错的速度取决于具体实现、时钟频率和流水线设计结构只决定并行潜力“冯·诺依曼结构不能实现流水线”也是错的现代通用处理器靠指令 Cache 和数据 Cache 分离在片内已经局部实现了哈佛式访问。解析里遇到这类判断题判断标准是结构定义本身而不是拿某台机器的性能去反推。2.3 部件协作题的解题路径数据通路类题目是这一章的难点给出一张部件连接图问某条指令执行到某一拍时哪些部件被激活、哪条总线被占用。这类题不能靠背得按指令执行的阶段一步步推。阶段主要动作涉及部件与总线取指PC 内容送地址总线读主存指令送 IRPC 自增PC、MAR、主存、MDR、IR、地址总线、数据总线译码控制器对 IR 中的操作码译码控制器、IR取操作数按寻址方式算出有效地址并读操作数寄存器组、ALU、MAR、MDR执行运算器完成运算结果暂存ALU、ACC、状态寄存器写回结果写回寄存器或存储器寄存器组或主存、数据总线推这类题有个稳妥顺序先确定这一拍是“送地址”还是“传数据”。送地址必然占用地址总线和 MAR传数据必然占用数据总线和 MDR控制信号由控制器发出不占数据总线。按这个顺序标基本不会漏部件。提示解析中凡是画数据通路的题先标出“这一拍哪些部件被激活”再对照总线是否冲突。总线冲突是分析设计题的常见扣分点。3. 运算器与控制器CPU 内部的两条主线CPU 内部可以粗暴地切成两半一半负责算一半负责指挥。习题解析在这一章的题量最大概念题、计算题、分析题都有而且两类题的错误会互相牵连——补码算错会导致标志位判断错节拍数错会导致执行时间算错。3.1 运算器、补码与标志位运算器的核心是算术逻辑单元配合累加器、通用寄存器组和状态寄存器工作。状态寄存器里的标志位是考试重点零标志 ZF、进位标志 CF、溢出标志 OF、符号标志 SF。概念题常问“哪个标志位由哪类运算影响”计算题则要求根据运算结果写出标志位取值。补码是绕不开的基础。整数在机器里统一用补码表示原因是加减法可以共用一套电路减法转成加负数即可。补码的表示范围比原码多一个负数这一点在填空和选择里反复出现。编码8 位表示范围零的表示加减法是否统一原码-127 ~ 127两种0、-0不统一反码-127 ~ 127两种不统一补码-128 ~ 127唯一统一移码-128 ~ 127唯一常用于阶码溢出判断是这一节的高频失分点。两个同号数相加、结果符号相反就是溢出两个异号数相加不可能溢出。用进位判断的版本是最高位进位与次高位进位异或为 1 时溢出。下面这段代码把两种判断方式放在一起对照方便验算。def add_overflow(a, b, bits8): 用补码做加法并判断溢出输入为有符号整数 mask (1 bits) - 1 ua, ub a mask, b mask # 转成无符号位模式 raw ua ub # 原始和可能超出 bits 位 result raw mask # 截断到 bits 位 # 方式一同号相加结果异号即溢出 sign_a, sign_b ua (bits - 1), ub (bits - 1) sign_r result (bits - 1) overflow_by_sign (sign_a sign_b) and (sign_r ! sign_a) # 方式二最高位进位与次高位进位异或 carry_out (raw bits) 1 carry_into_msb (ua (1 (bits - 1)) and ub (1 (bits - 1))) or \ ((ua (1 (bits - 1)) or ub (1 (bits - 1))) and (raw (1 (bits - 1)))) # 简化写法直接看第 bits-1 位向第 bits 位的进位 carry_into_msb ((ua mask) (ub mask)) (bits - 1) 1 overflow_by_carry carry_out ^ carry_into_msb return result, overflow_by_sign, overflow_by_carry print(add_overflow(100, 100)) # 200 超出 8 位补码范围应判溢出参数说明bits是字长a、b是参与运算的有符号整数函数返回截断后的位模式以及两种溢出判断结果。逻辑说明同号判定法直观适合手算时快速判断进位异或法更贴近硬件实现解析里出现电路图时用这一种。两种方法结果必须一致不一致说明中间某一步的位模式取错了。注意手算补码加法时先确定字长再取模不要拿十进制结果直接看符号这是解析里错误率最高的操作之一。3.2 控制器硬布线与微程序控制器有两种典型实现硬布线控制和微程序控制。硬布线用组合逻辑电路直接产生控制信号速度快但一旦设计定型就不好改微程序把控制信号编成微指令存在控制存储器里修改灵活但执行时要多读一次控制存储器。对比项硬布线控制微程序控制控制信号产生组合逻辑电路读控制存储器中的微指令速度快相对慢灵活性差改动需重新设计电路好改微指令即可典型适用RISC 类简洁指令系统CISC 类复杂指令系统考题形态给逻辑图问信号、比较优缺点问微指令格式、微命令个数微指令格式分水平型和垂直型。水平型一条微指令包含多个可并行的微命令微指令字长、微程序短垂直型一条微指令只控制少数操作字短但微程序长。解析里常给一个微命令数量让算控制存储器的容量算法是微指令条数乘以微指令字长注意单位换算。指令执行的节拍也要分清取指周期取指令间址周期取有效地址执行周期完成操作中断周期保存断点并转中断服务程序。四个周期不是每条指令都全走只有间接寻址才需要间址周期只有响应中断才有中断周期。题目问“某指令至少需要几个机器周期”时按最简路径算别把间址周期默认加上。3.3 指令周期与机器周期的时间计算时间类题目的关键是分清三个层次时钟周期最短是机器的主频倒数机器周期CPU 周期完成一个基本操作指令周期完成一条指令由若干机器周期组成。三者是包含关系不能混用。执行时间的核心公式是程序执行时间等于指令条数乘以平均 CPI 再乘以时钟周期。平均 CPI 要按各类指令的比例加权不能把几种指令的 CPI 直接算术平均。下面这段代码演示加权计算并顺带算 MIPS。def cpu_time(total_instr, mix, cpi_map, freq_hz): total_instr: 指令总条数 mix: {指令类型: 占比}占比之和应为 1 cpi_map: {指令类型: 该类指令的 CPI} freq_hz: 主频单位 Hz avg_cpi sum(mix[k] * cpi_map[k] for k in mix) # 按比例加权 clock 1.0 / freq_hz # 时钟周期单位秒 exec_time total_instr * avg_cpi * clock mips freq_hz / (avg_cpi * 1e6) # 百万条指令每秒 return avg_cpi, exec_time, mips avg, t, mips cpu_time( total_instr1_000_000, mix{算术: 0.5, 访存: 0.3, 转移: 0.2}, cpi_map{算术: 1, 访存: 4, 转移: 2}, freq_hz2e9 ) print(f平均CPI{avg:.2f}, 执行时间{t*1e3:.2f}ms, MIPS{mips:.0f})参数说明mix里各类型占比之和必须为 1否则平均值会被系统性放大或缩小freq_hz用赫兹而不是兆赫兹避免单位换算时多乘或少乘一个 10 的幂。逻辑说明先算加权平均 CPI再乘总条数和时钟周期得到总时间MIPS 用主频除以平均 CPI注意除以 10 的 6 次方是把“每秒”换成“每秒百万条”。解析里常见的坑是题干给出“主频 2GHz”答题时却把时钟周期写成 2 纳秒。主频 2GHz 对应时钟周期 0.5 纳秒这类倒数关系错一次整道大题的分就没了。4. 存储器层次与总线容量题和带宽题的主战场存储器和总线是计算题密度最高的两章。概念本身不难难在单位、编址方式和扩展方式三件事叠在一起稍不留神就错一个数量级。解析里这类题的分值通常不低值得单独拿出来按套路练。4.1 存储器分类与三级层次存储器先按位置分主存和辅存主存是 CPU 能直接按地址访问的存储器辅存是外部存储设备。主存再分随机存取存储器 RAM 和只读存储器 ROMRAM 掉电丢失ROM 掉电保留。辅存常见的有硬盘、固态硬盘、光盘容量大、速度慢、单位成本低。层次典型介质速度容量作用CacheSRAM最快最小缓解 CPU 与主存速度差主存DRAM中等中等存放运行中的程序和数据辅存硬盘、固态硬盘、光盘最慢最大长期保存按块调入主存三级层次背后是局部性原理时间局部性指刚访问过的内容很可能再次被访问空间局部性指相邻地址的内容很可能被一起访问。Cache 命中率题就是围绕这两条性质出的。平均访问时间要看清题目假设同时访问 Cache 和主存时公式是命中率乘 Cache 时间加上未命中率乘主存时间先查 Cache 再查主存时未命中的那部分还要再加一次 Cache 访问时间。两种假设答案不同答题前先在草稿上写明用的是哪一种。提示解析里的命中率题题干一般会写“Cache 与主存同时访问”或“先访问 Cache”这半句话决定公式别跳读。4.2 容量、地址与芯片扩展的计算容量计算的基本关系是存储容量等于存储单元数乘以每个单元的位数。地址线 n 根能寻址 2 的 n 次方个单元数据线 m 根每个单元 m 位。题目给出地址线和数据线直接相乘即可唯一要小心的是单位——按位算出来是 bit要换成字节就除以 8。芯片扩展分两种位扩展增加字长字扩展增加单元数。需要的芯片总数等于字扩展倍数乘以位扩展倍数。下面这段代码把两种扩展一次算清。def chip_count(target_words, target_bits, chip_words, chip_bits): target_words/target_bits: 目标存储器的单元数与每单元位数 chip_words/chip_bits: 单片的单元数与位数 word_expand target_words // chip_words # 字扩展串联片数 bit_expand target_bits // chip_bits # 位扩展并联片数 total word_expand * bit_expand addr_lines (target_words - 1).bit_length() # 地址线根数 return word_expand, bit_expand, total, addr_lines print(chip_count(4 * 1024, 8, 1024, 4)) # 4K×8 位用 1K×4 位芯片参数说明target_words和chip_words都按“字”计target_bits和chip_bits按“位”计两组单位不能交叉。逻辑说明字扩展决定需要多少组芯片串联来覆盖地址空间位扩展决定每组里并联几片来凑够字长地址线根数用目标单元数减一取二进制位数因为地址从 0 开始编号。以上面的调用为例4K 除以 1K 得 4 组8 位除以 4 位得 2 片并联总共 8 片地址线 12 根。解析里类似的题会多加一层比如问“需要多少片选信号”答案就是字扩展倍数也就是 4 组需要 2 根片选译码输入2 的 2 次方等于 4。片选信号的数量和地址线数量是两个概念很多答案错在把两者混为一谈。4.3 总线分类与带宽计算总线按传的信息分三类地址总线传地址单向由 CPU 指向存储器或 I/O数据总线传数据双向控制总线传控制信号方向视具体信号而定。地址总线宽度决定寻址空间数据总线宽度决定一次能传多少位控制总线宽度决定能支持多少种控制信号。总线类型传输内容方向宽度决定什么地址总线存储单元或 I/O 端口地址单向最大寻址空间数据总线指令与数据双向一次传输的位数控制总线读写、中断、时序等信号视信号而定控制功能的种类数带宽计算的核心是单位时间内能传多少数据。若每个总线周期传一次数据带宽等于总线宽度换算成字节乘以总线频率。下面这段代码把常见单位一次换算到位。def bus_bandwidth(width_bits, freq_hz, cycles_per_transfer1): width_bits: 数据总线宽度单位 bit freq_hz: 总线时钟频率单位 Hz cycles_per_transfer: 每次传输占用的总线周期数 bytes_per_transfer width_bits / 8 transfers_per_sec freq_hz / cycles_per_transfer bandwidth bytes_per_transfer * transfers_per_sec # 字节/秒 return bandwidth, bandwidth / 1e6 # MB/s bw, mb bus_bandwidth(64, 100e6, cycles_per_transfer1) print(f带宽{bw/1e6:.0f} MB/s)参数说明width_bits用位freq_hz用赫兹cycles_per_transfer表示传一次数据要几个总线周期题目若说“每个总线周期传送一次”就取 1。逻辑说明先把位宽换成字节再乘每秒传输次数得到字节每秒换成 MB/s 时除以 10 的 6 次方注意这里用的是十进制换算和存储器容量里 1024 进制的换算不是一回事题目问带宽时按十进制处理更稳妥题干有明确说明则以题干为准。5. 易错点集中营这五类题最容易翻车刷解析刷到第三遍会发现错题翻来覆去就是那几类。有的是概念边界没划清有的是单位换算少了一步还有的是审题时漏了半句话。把这几类单独拎出来做一遍比盲目刷新题有效得多。5.1 概念混淆类三个爱设陷阱的地方第一处机器字长、存储字长、指令字长混着用。易漏点在于这三个“字长”指的完全不是一回事机器字长是 CPU 一次能处理的二进制位数通常等于运算器位数和通用寄存器宽度存储字长是一个存储单元存放的位数指令字长是一条指令的位数。为什么容易漏三个词都带“字长”教材又常在同一章里前后出现读者顺手把它们当成同一个量。怎么补遇到字长题先在草稿上写清题目问的是“CPU 处理宽度”“存储单元宽度”还是“指令编码宽度”再代公式。三者可以相等也可以不等比如指令字长可能是存储字长的整数倍采取多字长指令。第二处中断和异常分不清。易漏点在于中断通常指外部设备请求、与当前指令无关的异步事件异常指 CPU 执行指令过程中检测到的同步事件比如除零、缺页、溢出。为什么容易漏两者在教材里常被放在同一节讲处理流程也相似都是保存现场转服务程序读者只记了流程没记来源。怎么补抓住“与当前指令是否相关”这条线相关的算异常不相关的算中断再补一条中断一般发生在一条指令执行结束之后异常可能发生在指令执行过程中。第三处RISC 与 CISC 的绝对化描述。易漏点在于把“指令少、定长、寻址方式少、硬布线控制”当成 RISC 的定义然后推出“RISC 一定更快”“CISC 一定被淘汰”。为什么容易漏教材给的是典型特征考试选项却常写成绝对判断读者凭印象就选了。怎么补记住 RISC 是一组设计取向而不是硬性标准现代处理器普遍是混合形态外围简洁、内部复杂。判断题里出现“一定”“全部”“不能”这类词先怀疑再验证。5.2 计算踩坑类两个必须验算的地方第四处带宽与容量的单位混用。易漏点在于存储器容量按 1024 进制换算总线带宽按 1000 进制换算两个体系在同一道大题里出现时中间步骤很容易差出百分之几。为什么容易漏平时做题习惯用 K、M 简写不写清楚是 bit 还是 Byte也不写清楚是 1024 还是 1000。怎么补草稿上强制写单位容量写成“×1024”带宽写成“×10 的 6 次方”最后一步再统一换。凡是答案和选项差一个 8 倍的基本都是位和字节没换。第五处平均 CPI 直接算术平均。易漏点在于题目给了三类指令各自的 CPI读者把三个数加起来除以三就算完忽略了各类指令在程序里的占比不同。为什么容易漏题干把占比写在括号里或者表格里读题时容易只盯 CPI 数字。怎么补看到“平均”两个字先找权重没有权重就用条数有权重就加权算完回头看结果是否落在各类 CPI 的最小值和最大值之间落在区间外一定是算错了。注意这五类错题建议单独抄在一页纸上考前只看这一页。刷新题的边际收益远低于把已知错点堵死。6. 复习清单把十个知识点收成一张可勾选的表复习到后期最怕的是“感觉都会、一做就错”。下面这张表按模块列出必背结论和自检标准做题卡住时对着勾一遍比从头翻书快。模块必背结论自检标准五大部件CPU 等于运算器加控制器存储器同时存程序和数据能说清每条指令各阶段谁在总线上冯·诺依曼存储程序、统一编址、顺序执行能指出哈佛结构的并行优势来自哪里运算器补码范围多一个负数同号相加异号即溢出手算两位加法并写出四个标志位控制器硬布线快、微程序灵活四类周期按需出现能画出取指阶段的部件激活顺序存储器容量等于单元数乘位数扩展倍数等于字扩展乘位扩展给地址线和数据线能直接算出容量Cache局部性原理平均访问时间看题干假设能区分同时访问与先查后访两种公式总线地址单向、数据双向、控制视信号而定带宽算完能检查单位是 Byte 还是 bit指令系统RISC 简洁定长、CISC 复杂变长均为取向非标准判断题里看到绝对化表述能警觉性能指标时间等于条数乘平均 CPI 乘时钟周期加权 CPI 落在各类 CPI 区间内I/O 与中断中断异步、异常同步响应发生在指令边界能举出至少两个异常的例子使用方法很直接每做完一套解析里的题把错题按上表归到某一模块同一模块连续错两次就回到对应小节重读概念而不是继续刷下一套。计算题错在单位就把单位换算单独抄十遍概念题错在边界就把两个概念的差别写成一句话对照。我自己的教训是早期只对答案不看解析过程结果同一类补码溢出的题连错三次直到把两种判断方法都手写推导一遍才彻底记住。从那以后我每刷完一章的习题解析都强制走一遍“错题归模块、模块回概念、概念再手算”的流程哪怕当天只做十道题也不省略。这份按章节编排的习题解析正好适合这么用放在手边对着刷比零散找题省事。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站