cser - foundations
00. CSER 必须先建立的底层通识
这一章放在四大件之前。它不属于某一门课,而是所有计算机基础课共同依赖的 first principles。
如果你想逐章细读通识基础,进入 foundations/README.md。本章是总览,foundations/ 是展开版。
先用一张图建立方向:四大件不是四门互不相干的课,而是同一段程序在不同层次上的解释。
1. 计算机本质上在处理什么
计算机处理的是信息。信息在机器里最终都落成 bit:
0 / 1
bit 本身没有意义。意义来自解释规则。
| bit 模式 | 解释规则 | 得到的意义 |
|---|---|---|
01000001 | ASCII | 字符 A |
01000001 | 无符号整数 | 65 |
| 一段 bit | 指令编码 | 某条机器指令 |
| 一段 bit | 图片格式 | 像素和颜色 |
所以“数据类型”“编码”“协议”“文件格式”本质都是解释 bit 的规则。
2. 程序是什么
程序可以看成:对状态的一系列可执行变换。
输入状态
-> 执行规则
-> 输出状态
例子:
变量 a=1, b=2
执行 a+b
输出 3
更底层一点:
- 数据在内存或寄存器里。
- 指令告诉 CPU 怎么读、算、写。
- 控制流决定下一条指令是谁。
- IO 把外部状态带进来或把结果送出去。
3. 计算机系统的四类核心资源
| 资源 | 负责什么 | 典型问题 |
|---|---|---|
| CPU | 执行指令 | 算不动、调度、上下文切换、并行 |
| 内存 | 临时保存运行中的数据 | 容量、地址、隔离、缓存、泄漏 |
| 存储 | 长期保存数据 | 文件、块、延迟、持久性、崩溃恢复 |
| 网络/设备 | 和外部世界交换信息 | 寻址、传输、可靠性、延迟、带宽 |
四大件就是围绕这些资源建立抽象:
- 组成原理解释硬件资源如何工作。
- OS 管理这些资源并提供安全抽象。
- 数据结构组织内存中的信息。
- 网络让不同机器上的进程交换信息。
4. 抽象是计算机科学的核心武器
抽象的意思是:隐藏复杂细节,只暴露可使用的接口。
| 抽象 | 隐藏了什么 |
|---|---|
| 变量 | 内存地址和二进制表示 |
| 数组 | 地址计算和连续存储 |
| 文件 | 磁盘块、inode、缓存、设备驱动 |
| 进程 | CPU 调度、地址空间、权限 |
| Socket | 网卡、协议栈、路由、缓冲区 |
| HTTP | TCP 字节流、连接、分包、重传 |
学习底层不是为了抛弃抽象,而是知道抽象的边界。
5. 层次结构
复杂系统通常按层构建。
应用
-> 运行时 / 标准库
-> 操作系统
-> 指令集
-> CPU / 内存 / 设备
网络也分层:
应用协议
-> 传输层
-> 网络层
-> 链路层
-> 物理层
分层带来可组合性:上层依赖下层提供能力,下层不需要理解上层业务。
6. 成本模型:任何东西都不是免费的
CS 学习里最重要的习惯之一:问成本。
| 成本 | 常见来源 |
|---|---|
| 时间 | 循环、查找、排序、等待 IO、上下文切换 |
| 空间 | 数据结构额外字段、缓存、复制、对象/块元数据 |
| 延迟 | 网络往返、磁盘读取、锁等待、缺页 |
| 带宽 | 单位时间能搬多少数据 |
| 可靠性 | 丢包、崩溃、断电、并发竞争 |
| 复杂度 | 状态太多、接口太乱、边界条件太多 |
一句话:所有系统设计都是在不同成本之间做 trade-off。
7. 快和慢的第一性原因
程序快慢通常来自这些层面:
| 层面 | 快的原因 | 慢的原因 |
|---|---|---|
| 算法 | 少做无用步骤 | 复杂度太高 |
| 数据结构 | 访问模式匹配 | 查找/移动/冲突成本高 |
| 内存 | 局部性好 | cache miss、缺页 |
| CPU | 指令少、分支可预测 | 分支混乱、等待数据 |
| OS | 少切换、少阻塞 | 线程过多、锁等待、系统调用频繁 |
| 网络 | RTT 少、连接复用 | 丢包、重传、拥塞、握手多 |
所以性能不是某一门课的问题,而是系统问题。
8. 正确性、可靠性、性能是三条线
| 目标 | 关心什么 |
|---|---|
| 正确性 | 算出来的结果对不对 |
| 可靠性 | 在失败、并发、异常输入下还能不能工作 |
| 性能 | 在给定资源下是否足够快、足够稳 |
初学者容易只看“能不能跑”。CSER 要继续问:
- 输入变大还能跑吗?
- 多个任务同时跑会乱吗?
- 网络断了怎么办?
- 文件写一半崩溃怎么办?
- 内存不够怎么办?
- 结果是否依赖未定义行为或精度误差?
9. 必须熟悉的通用词
| 词 | 最小解释 |
|---|---|
| 状态 | 某一刻系统保存的信息 |
| 不变量 | 无论怎么操作都必须保持成立的条件 |
| 接口 | 上层使用下层的约定 |
| 协议 | 多方通信时共同遵守的格式和流程 |
| 缓冲 | 用一段空间吸收速度差 |
| 缓存 | 保存近期/高频数据以减少重复成本 |
| 队列 | 按顺序等待处理的任务集合 |
| 并发 | 多个任务在同一时间段推进 |
| 并行 | 多个任务同一时刻真正同时执行 |
| 同步 | 协调多个执行流的顺序和共享状态 |
| 原子性 | 操作不可被中间打断观察 |
| 可见性 | 一个执行流的修改能被另一个看到 |
| 局部性 | 最近访问或附近数据未来仍可能访问 |
| 吞吐 | 单位时间完成多少工作 |
| 延迟 | 完成一次工作需要多久 |
10. 学任何知识点的固定问法
以后遇到一个概念,按这个顺序拆:
- 它管理什么资源或状态?
- 它给上层提供什么抽象?
- 它隐藏了哪些底层细节?
- 它最常见的操作是什么?
- 每个操作的时间、空间、等待成本是什么?
- 它在哪些输入或状态下会退化?
- 它失败时外部能看到什么现象?
- 它和四大件里的哪几块相连?
这套问法比背定义更稳定。