Skip to main content

深入理解计算机系

📅 2026-03-24 ✏️ 2026-03-24 BN
No related notes

1 · 读书笔记:深入理解计算机系统

Computer Systems: A Programmer’s Perspective

https://book.douban.com/subject/26912767/

  • 是什么(What)— 理论/原则,建立认知模型
  • 为什么(Why)— 背后的动机、约束与权衡
  • 怎么做(How)— 技巧 + 实践 + 边界(该做与不该做)

1.1 · 核心观点:

程序员需要理解整个计算机系统(硬件+OS+编译器+网络)才能写出正确、高效、安全的程序。抽象是好的,但不能止步于抽象——你必须知道抽象背后发生了什么。

1.2 · 启发点(关键洞察):

  1. 信息 = 位 + 上下文:同一段比特序列,在不同上下文中可以是整数、浮点数、指令或字符串。类型系统和编码方式决定了”意义”。
  2. 整数/浮点运算不等于数学运算:有限位宽导致溢出、精度丢失、舍入误差。安全漏洞(如缓冲区溢出)的根源往往在此。
  3. 程序的性能由存储器层次结构决定:CPU-寄存器-L1/L2/L3-主存-磁盘,局部性原理(时间局部性 + 空间局部性)是程序员能利用的最重要的硬件特性。
  4. 虚拟内存是核心抽象:它同时解决了保护、共享、内存管理三个问题。每个进程拥有独立的地址空间,让编程模型极大简化。
  5. 链接器被严重低估:理解符号解析、重定位、静态/动态链接,能解释大量”诡异”的编译和运行时错误。
  6. 异常控制流贯穿整个系统:从硬件中断、陷阱、故障,到进程、信号、非局部跳转(setjmp/longjmp),操作系统通过异常控制流管理一切。
  7. 并发不只是线程:进程、I/O 多路复用、线程是三种并发机制,各有适用场景;共享变量 + 竞争条件是并发 bug 的根源,同步原语(互斥锁、信号量)是必修课。
  8. 编译器优化 vs. 程序员优化的边界:编译器能做常量折叠、死代码消除,但无法优化算法复杂度和数据布局——后者是程序员的责任。

1.3 · 行动:

  1. 手写 malloc:实现显式空闲链表 + 分离适配,深入理解堆内存管理
  2. cachegrind/perf 分析真实程序的缓存命中率,体会数据布局对性能的影响
  3. objdump/readelf 拆解一个 ELF 可执行文件,理解段、节、符号表、重定位表
  4. 写一个 tiny shell(tsh):练习进程控制、信号处理、作业管理
  5. 写一个简单的 proxy server:练习网络编程 + 并发 + 缓存

1.4 · 金句:

  1. “Information is bits + context.”
  2. “If you understand how compilers translate C into machine code, you will see that the claims of the high-level language are cast in iron.”
  3. “The memory system is one of the most important parts of a modern computer system. From the programmer’s perspective, it is a simple linear array of bytes. In practice, it is a complex hierarchy.”
  4. “Concurrency is a property of the system; parallelism is a property of the program.”