八股文 / 组成原理速查

计算机组成原理面试速查题库

本页用于复习与表达。第一次学习请从 计算机组成原理系统课 开始。

一、数据与指令

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、上下文切换和硬件计数器。

复习方式

每道题至少继续问两层:

  1. 机制内部维护什么状态?
  2. 出现 miss、冲突或预测错误后怎样恢复?
  3. 能用什么工具或指标观察?
  4. 与操作系统的页表、锁和 I/O 有什么连接?

返回计算机基础系统课 进入操作系统速查 进入网络速查