cser - foundations

00. CSER 必须先建立的底层通识

这一章放在四大件之前。它不属于某一门课,而是所有计算机基础课共同依赖的 first principles。

如果你想逐章细读通识基础,进入 foundations/README.md。本章是总览,foundations/ 是展开版。

先用一张图建立方向:四大件不是四门互不相干的课,而是同一段程序在不同层次上的解释。

四大件博客视觉路线

1. 计算机本质上在处理什么

计算机处理的是信息。信息在机器里最终都落成 bit:

0 / 1

bit 本身没有意义。意义来自解释规则。

bit 模式解释规则得到的意义
01000001ASCII字符 A
01000001无符号整数65
一段 bit指令编码某条机器指令
一段 bit图片格式像素和颜色

所以“数据类型”“编码”“协议”“文件格式”本质都是解释 bit 的规则。

2. 程序是什么

程序可以看成:对状态的一系列可执行变换。

输入状态
-> 执行规则
-> 输出状态

例子:

变量 a=1, b=2
执行 a+b
输出 3

更底层一点:

  • 数据在内存或寄存器里。
  • 指令告诉 CPU 怎么读、算、写。
  • 控制流决定下一条指令是谁。
  • IO 把外部状态带进来或把结果送出去。

3. 计算机系统的四类核心资源

资源负责什么典型问题
CPU执行指令算不动、调度、上下文切换、并行
内存临时保存运行中的数据容量、地址、隔离、缓存、泄漏
存储长期保存数据文件、块、延迟、持久性、崩溃恢复
网络/设备和外部世界交换信息寻址、传输、可靠性、延迟、带宽

四大件就是围绕这些资源建立抽象:

  • 组成原理解释硬件资源如何工作。
  • OS 管理这些资源并提供安全抽象。
  • 数据结构组织内存中的信息。
  • 网络让不同机器上的进程交换信息。

4. 抽象是计算机科学的核心武器

抽象的意思是:隐藏复杂细节,只暴露可使用的接口。

抽象隐藏了什么
变量内存地址和二进制表示
数组地址计算和连续存储
文件磁盘块、inode、缓存、设备驱动
进程CPU 调度、地址空间、权限
Socket网卡、协议栈、路由、缓冲区
HTTPTCP 字节流、连接、分包、重传

学习底层不是为了抛弃抽象,而是知道抽象的边界。

5. 层次结构

复杂系统通常按层构建。

应用
-> 运行时 / 标准库
-> 操作系统
-> 指令集
-> CPU / 内存 / 设备

网络也分层:

应用协议
-> 传输层
-> 网络层
-> 链路层
-> 物理层

分层带来可组合性:上层依赖下层提供能力,下层不需要理解上层业务。

6. 成本模型:任何东西都不是免费的

CS 学习里最重要的习惯之一:问成本。

成本常见来源
时间循环、查找、排序、等待 IO、上下文切换
空间数据结构额外字段、缓存、复制、对象/块元数据
延迟网络往返、磁盘读取、锁等待、缺页
带宽单位时间能搬多少数据
可靠性丢包、崩溃、断电、并发竞争
复杂度状态太多、接口太乱、边界条件太多

一句话:所有系统设计都是在不同成本之间做 trade-off。

7. 快和慢的第一性原因

程序快慢通常来自这些层面:

存储层次结构

层面快的原因慢的原因
算法少做无用步骤复杂度太高
数据结构访问模式匹配查找/移动/冲突成本高
内存局部性好cache miss、缺页
CPU指令少、分支可预测分支混乱、等待数据
OS少切换、少阻塞线程过多、锁等待、系统调用频繁
网络RTT 少、连接复用丢包、重传、拥塞、握手多

所以性能不是某一门课的问题,而是系统问题。

8. 正确性、可靠性、性能是三条线

目标关心什么
正确性算出来的结果对不对
可靠性在失败、并发、异常输入下还能不能工作
性能在给定资源下是否足够快、足够稳

初学者容易只看“能不能跑”。CSER 要继续问:

  • 输入变大还能跑吗?
  • 多个任务同时跑会乱吗?
  • 网络断了怎么办?
  • 文件写一半崩溃怎么办?
  • 内存不够怎么办?
  • 结果是否依赖未定义行为或精度误差?

9. 必须熟悉的通用词

最小解释
状态某一刻系统保存的信息
不变量无论怎么操作都必须保持成立的条件
接口上层使用下层的约定
协议多方通信时共同遵守的格式和流程
缓冲用一段空间吸收速度差
缓存保存近期/高频数据以减少重复成本
队列按顺序等待处理的任务集合
并发多个任务在同一时间段推进
并行多个任务同一时刻真正同时执行
同步协调多个执行流的顺序和共享状态
原子性操作不可被中间打断观察
可见性一个执行流的修改能被另一个看到
局部性最近访问或附近数据未来仍可能访问
吞吐单位时间完成多少工作
延迟完成一次工作需要多久

10. 学任何知识点的固定问法

以后遇到一个概念,按这个顺序拆:

  1. 它管理什么资源或状态?
  2. 它给上层提供什么抽象?
  3. 它隐藏了哪些底层细节?
  4. 它最常见的操作是什么?
  5. 每个操作的时间、空间、等待成本是什么?
  6. 它在哪些输入或状态下会退化?
  7. 它失败时外部能看到什么现象?
  8. 它和四大件里的哪几块相连?

这套问法比背定义更稳定。

延伸阅读