导航
- 第一章 计算机系统漫游
- 第一部分
时间轴
看完 2.2 整数表示
看的还是太慢了……怎么说也要在四月前把第二章看完!
看完 2.1 信息存储
本文中需重点理解寻址和字节顺序。
看完 第一章 计算机系统漫游
这个章节从 hello world
开始,带着读者从一个新的视角真正理解这一个简单语句背后的故事。
要不说人家是神作呢,读完第一章就已经满满的都是相见恨晚。
在通过中科创达的面试并了解到入职后主要从事BSP驱动开发后,内心总觉得有些不安,希望在正式入职前学习一些相关的知识。于是找了一本《Linux 驱动开发入门与实战》进行阅读,然而在进行简要的阅读之后,发现由于自己在操作系统、计算机组成原理方面的知识过于薄弱,很难理解书中的知识。
巧合之下,在和腾讯元宝的交流中,得知了《深入理解计算机系统》这本书,并了解到这是被誉为计算机神作的一本经典。欣喜若狂,便开始读了起来。
很喜欢豆瓣某用户对这本书的评价,“恭喜你,迈出了成为优秀程序员的第一步!”
章节概述
《深入理解计算机系统》(CS:APP)是一本系统讲解计算机硬件与软件协同工作的经典教材,其内容涵盖从底层硬件到上层软件的完整知识体系。以下是各章节的详细介绍及核心内容:
第一章:计算机系统漫游
以一个简单的“Hello World”程序为主线,串联起从源代码编写到程序执行的完整流程,包括编译、汇编、链接、加载到内存、CPU执行指令等环节。最后引入Amdahl定律,分析系统性能优化的理论极限。
第二章:信息的表示和处理
讲解计算机中数据的二进制表示,重点包括:
- 整数:原码、反码、补码的转换规则,以及溢出问题。
- 浮点数:IEEE 754标准,单精度与双精度浮点数的存储结构(符号位、指数、尾数)。
- 字符与字符串:ASCII与Unicode编码的差异。
第三章:程序的机器级表示
深入汇编语言与机器指令,涵盖:
- x86-64指令集:寄存器(如RAX、RBX)、操作数(立即数、寄存器、内存)、寻址方式(基址+偏移、间接寻址)。
- 汇编代码示例:通过反汇编工具分析C程序的机器级代码,理解编译器如何生成指令。
第四章:处理器体系结构
解析CPU的工作原理,包括:
- 指令流水线:取指、译码、执行、访存、写回的并行执行机制。
- 动态调度:乱序执行与分支预测技术,提升指令级并行性。
- 性能优化:如何通过编译器指令(如
#pragma unroll
)或硬件特性优化程序。
第五章:优化程序性能
从代码层面到系统层面探讨性能优化策略:
- 编译器优化:常量折叠、循环展开、死代码消除。
- CPU缓存优化:数据局部性(空间局部性、时间局部性),循环嵌套顺序对缓存命中率的影响。
- 算法与数据结构:时间复杂度与空间复杂度的权衡。
第六章:存储器层次结构
详细剖析存储系统的层级设计:
- 存储层次:寄存器(最快)→ 高速缓存(Cache)→ 主存(DRAM)→ 磁盘/SSD(最慢)。
- Cache机制:直接映射、组相联、全相联的差异,以及替换策略(LRU、FIFO)。
- 虚拟内存:页表、页错误处理、内存分页与分段。
第七章:链接
解释程序链接的原理与实现:
- 静态链接:将目标文件与库合并为可执行文件。
- 动态链接:运行时加载共享库(如
.so
文件),节省内存空间。 - 链接错误:符号未定义、重复定义等问题的解决方法。
第八章:异常控制流
涵盖操作系统与硬件交互的核心机制:
- 中断与异常:硬件中断(如I/O设备)、软件异常(如除零错误)。
- 进程与线程:进程控制块(PCB)、上下文切换、信号处理。
- 系统调用:用户态与内核态的切换,以及
sysenter
指令的使用。
第九章:虚拟内存
深入虚拟内存管理:
- 页表结构:多级页表(如4级页表)、TLB(快表)的作用。
- 内存映射文件:将文件直接映射到虚拟地址空间,提升I/O效率。
- 页面置换算法:最佳置换(OPT)、先进先出(FIFO)、最近最少使用(LRU)。
第十章:系统级I/O
讨论输入/输出设备的实现:
- 磁盘结构:扇区、磁道、柱面,以及磁盘调度算法(如SCAN、C-SCAN)。
- 文件系统:inode表、目录结构、日志结构文件系统(JFS)。
- 网络编程:套接字(Socket)API、TCP/IP协议栈。
第十一章:并发编程
多线程与并行计算的核心概念:
- 线程同步:互斥锁(Mutex)、信号量(Semaphore)、条件变量。
- 死锁预防:银行家算法、资源分级分配。
- 并行计算模型:共享内存(OpenMP)、消息传递(MPI)。
第十二章:网络与分布式系统
现代计算机网络的基础:
- OSI七层模型:物理层到应用层的分工。
- TCP/IP协议:三次握手、四次挥手、滑动窗口机制。
- 分布式系统:CAP定理、一致性哈希、Paxos算法。
总结
本书通过“从上到下”与“从下到上”的双重视角,将计算机系统的各个组件(硬件、操作系统、编译器、网络)有机串联,帮助读者建立“系统级思维”。建议结合实验(如编写汇编代码、分析Cache性能)加深理解。