README · computer-organization
计算机组成原理
计算机组成原理研究的是:计算机硬件如何表示数据、执行指令、搬运数据,并把这些能力组合成可运行程序的基础。
对 CS 学生来说,它帮助你理解 CPU、缓存、内存、二进制、编码、浮点误差、IO 性能、并发共享为什么会影响程序。
本模块适合写成的博客问题
| 问题 | 对应章节 |
|---|---|
| 为什么计算机里所有东西最终都是 bit,但意义完全不同? | 01 二进制、数据表示与存储单位 |
| 为什么两个正数相加会变成负数? | 02 整数、补码与溢出 |
| 为什么小数计算会出现微小误差? | 03 浮点数 |
| 一条指令从哪里来,又在哪里完成? | 04 CPU 与指令执行 |
| 为什么顺序访问比随机访问快很多? | 06-07 存储层次结构与 Cache |
| 为什么 IO 慢时 CPU 可能并不忙? | 08-09 总线、外设、IO、中断与 DMA |
学习路线
| 顺序 | 章节 | 核心问题 |
|---|---|---|
| 00 | 从 0 开始理解计算机组成原理 | 计算机如何从电路执行到程序 |
| 01 | 二进制、数据表示与存储单位 | 数字、字符、地址在机器里怎么表示 |
| 02 | 整数、补码与溢出 | 为什么整数会溢出,补码为什么好用 |
| 03 | 浮点数 | 为什么 0.1 + 0.2 不精确 |
| 04 | CPU 与指令执行 | 取指、译码、执行、访存、写回如何组成一次执行 |
| 05 | 寄存器、ALU 与控制器 | CPU 内部如何保存临时数据、计算和发出控制信号 |
| 06 | 存储层次结构 | 寄存器、Cache、内存、磁盘为什么分层 |
| 07 | Cache 原理 | 局部性、缓存行、替换、写策略 |
| 08 | 总线、外设与 IO | 数据如何在 CPU、内存和设备之间移动 |
| 09 | 中断与 DMA | 设备如何通知 CPU,如何不靠 CPU 搬完整块数据 |
| 10 | 硬件视角的性能模型 | 从 CPU、内存、Cache、IO 解释程序快慢 |
本模块固定观察点
- 数据在硬件里用什么位模式表示。
- CPU 如何一步步执行指令。
- 数据从哪里来、到哪里去、经过哪些缓存。
- 硬件限制如何影响软件性能。
读完本模块要形成的底层直觉
组成原理不是为了背硬件名词,而是为了把很多软件现象落到可解释的物理和结构约束上:
| 软件现象 | 组成原理里的解释方向 |
|---|---|
| 整数突然变负 | 固定位宽、补码、溢出 |
| 小数比较不相等 | 二进制浮点近似、舍入误差 |
| 顺序扫描比随机访问快 | 空间局部性、缓存行、预取 |
| 多线程计数性能差 | 原子操作、缓存一致性、伪共享 |
| IO 慢但 CPU 不忙 | CPU 在等待设备、内核、总线、存储介质 |
| 程序第一次运行慢,第二次快 | 缓存、页缓存、预热 |
| 高负载下延迟突然变差 | 队列、缓存失效、内存带宽、上下文切换 |
读的时候始终追问:
这份数据在哪里?
CPU 要怎样拿到它?
拿到之后用什么电路或指令处理?
结果写回哪里?
中间有没有等待、复制、缓存失效或竞争?