八股文 / 组成原理速查
计算机组成原理面试速查题库
本页用于复习与表达。第一次学习请从 计算机组成原理系统课 开始。
一、数据与指令
Q1:为什么计算机使用补码表示有符号整数?
30 秒回答: 补码让正负数能共用同一套加法电路,减法可转成加法,并且只有一种零。n 位补码范围是 -2^(n-1) 到 2^(n-1)-1,因此负数范围多一个。
继续追问: 固定位宽溢出会丢弃高位;语言是否定义溢出行为要分别回答,不能用 Python 大整数推断所有语言。
Q2:浮点数为什么有精度误差?
30 秒回答: IEEE 754 用有限位表示符号、指数和尾数,许多十进制小数在二进制中无限循环,只能取近似值,所以 0.1 + 0.2 不一定精确等于 0.3。
继续追问: 比较使用误差或 isclose;金额常转整数最小单位;NaN 与自身也不相等。
Q3:大端和小端有什么区别?
30 秒回答: 它们规定多字节数值在内存中的字节顺序。大端把最高有效字节放低地址,小端相反。网络字节序传统上是大端,跨机器序列化必须明确约定。
易错点: 字节序不等于 bit 在字节内倒序,也不改变一个独立字节。
Q4:ISA 和微架构有什么区别?
30 秒回答: ISA 是软件可见的指令、寄存器、寻址和特权接口;微架构是 CPU 怎样实现这套接口,例如流水线深度、执行单元和 Cache。不同 CPU 可实现同一 ISA,但性能功耗不同。
Q5:源码怎样变成正在运行的程序?
30 秒回答: 编译/汇编生成目标指令,链接解析符号和依赖形成可执行文件;操作系统装载时建立进程地址空间、映射代码和库、设置栈与入口,CPU 从入口地址执行。解释型/JIT 语言路径不同,但最终仍执行机器指令。
二、CPU 与性能
Q6:CPU 主频更高为什么不一定更快?
30 秒回答: CPU 时间近似等于指令数 × CPI / 主频。算法、编译器、流水线、分支、Cache miss 和内存等待都会改变指令数与 CPI;功耗和降频也会影响持续性能。
Q7:流水线提高的是延迟还是吞吐?
30 秒回答: 主要提高吞吐。不同指令重叠占用取指、译码、执行、访存和写回阶段,填满后可更频繁完成指令,但单条指令经过全部阶段的延迟不一定更短。
Q8:流水线冒险有哪些?
- 结构冒险:争用同一硬件资源。
- 数据冒险:后续指令依赖尚未就绪的结果。
- 控制冒险:分支目标未确定。
解决包括增加资源、转发、停顿、指令调度、分支预测和乱序执行。
Q9:分支预测失败会发生什么?
30 秒回答: CPU 已沿预测路径取指甚至执行,发现错误后要丢弃错误路径结果,恢复正确状态和 PC,重新填充流水线。流水线越深,错误预测代价通常越高。
Q10:乱序执行会破坏程序顺序吗?
30 秒回答: CPU 内部可让无依赖的指令先执行以隐藏等待,但通过重排序缓冲区等机制按架构规则提交,对单线程保持 ISA 规定的可见语义。多线程仍需遵守语言内存模型并使用同步。
三、Cache 与内存层次
Q11:为什么需要多级 Cache?
30 秒回答: CPU 与 DRAM 延迟差距大,单一存储无法同时满足速度、容量和成本。L1 小而快,L2/L3 更大更慢,利用时间和空间局部性减少访问主存。
Q12:Cache line 是什么?
30 秒回答: Cache 以固定大小的内存块为传输和一致性单位,而不是只加载一个变量。顺序数组可一次带入多个元素;不同变量落在同一行也可能产生 false sharing。
Q13:直接映射、全相联和组相联怎样区别?
- 直接映射:内存块只能放一个位置,简单但冲突多。
- 全相联:可放任意位置,查找硬件复杂。
- 组相联:固定到一组,在组内多路选择,是常见折中。
Q14:Cache miss 有哪些原因?
- Compulsory:第一次访问。
- Capacity:工作集超过容量。
- Conflict:多个块竞争同一组。
- 多核一致性还可能使缓存行失效。
Q15:write-through 与 write-back 如何权衡?
30 秒回答: write-through 每次写同时更新下一层,状态简单但写流量大;write-back 只改缓存并标 dirty,淘汰时写回,减少流量但一致性与恢复更复杂。
Q16:TLB 与 CPU Cache 有什么区别?
30 秒回答: TLB 缓存虚拟页到物理页的地址翻译;CPU Cache 缓存物理内存中的指令和数据。一次访问可能先经历 TLB,再查数据 Cache。TLB miss 不等于 Page Fault。
四、I/O 与多核
Q17:中断、异常和系统调用有什么区别?
- 中断通常来自外部设备,是异步事件。
- 异常由当前指令同步触发,如缺页、除零。
- 系统调用由应用主动执行陷入指令。
三者都可能进入内核高特权处理,但来源和返回语义不同。
Q18:DMA 为什么能提高 I/O 效率?
30 秒回答: CPU/驱动配置传输描述符后,DMA 控制器负责设备与内存间批量传输,完成后通知 CPU,避免 CPU 逐字节搬运。但 CPU 仍负责提交、内存管理、完成处理和错误恢复。
Q19:缓存一致性解决什么问题?
30 秒回答: 多核各自缓存同一内存块时,写入必须让其他核心旧副本失效或更新。MESI 等协议管理缓存行状态和所有权,使各核心对单个位置的读写满足一致性规则。
易错点: 缓存一致性不自动消除数据竞争,也不等于所有操作按源码顺序可见。
Q20:什么是 false sharing?
30 秒回答: 两线程修改不同变量,但变量位于同一缓存行,缓存一致性按整行转移所有权,导致缓存行在核心间反复失效和迁移。可用线程局部累积、分离热点写字段等方式缓解。
Q21:CAS 为什么是原子的?
30 秒回答: CAS 由硬件原子读改写能力支持,只有内存值仍等于 expected 时才写 new,并返回成功与否。它可构建锁和无锁结构,但高竞争会反复失败,还需处理 ABA、内存顺序和回收问题。
综合追问
Q22:为什么数组通常比链表快?
数组连续,能利用缓存行、预取和较少的地址依赖;链表节点可能分散,每次先取得 next 才知道下一地址,容易产生 Cache/TLB miss。复杂度都为 O(n),微架构成本不同。
Q23:多线程为什么不一定加速?
受 Amdahl 定律的串行部分、锁竞争、调度、Cache 一致性、false sharing、内存带宽和任务粒度影响。应同时测量吞吐、延迟、CPU、上下文切换和硬件计数器。
复习方式
每道题至少继续问两层:
- 机制内部维护什么状态?
- 出现 miss、冲突或预测错误后怎样恢复?
- 能用什么工具或指标观察?
- 与操作系统的页表、锁和 I/O 有什么连接?
| 返回计算机基础系统课 | 进入操作系统速查 | 进入网络速查 |