笔记不能是对书本内容的简单搬运,应该加上自己的理解和梳理,为的是方便以后更好的查阅和复习。
《计算机系统:一种程序员的视角》一书经常在知乎上被人推荐,自己基础一直不好,希望能专心把这门书学习完。 但是过往看书,边看边忘,必须养成学习记录的习惯,才能查缺补漏,温故知新。
本书一个优点在于拥有配套的lab,http://csapp.cs.cmu.edu/3e/labs.html
这本书写给那些希望编写更好代码的程序员,专注介绍于计算机通用的概念。
本章借助hello world程序运行粗略讲解其中涉及计算机系统内容。
1.1 信息=比特+上下文
世界是充满信息的世界,信息无处不在,计算机本质是处理信息的工具,计算机中到处也涌动着信息。
信息是什么呢?
信息在计算机中最直观的表示,就是高低闪烁的电平信号,采用二进制表示01的位bit。
八位组成一个字节byte,一个字节通过字符编码映射一个字符,hello world源码因此由一个个字节组成。
单纯的bit序列是没有意义的,计算机中的所有信息都通过比特bits表示,上下文context是区分信息的关键。上下文可能是指bit序列的用途。
1.2 源码到可执行文件
hello源码是遍于程序员理解的语言,它并不能直接被计算机执行。需要通过一系列步骤,转换为可执行目标文件executable object file。

unix系统中,gcc complier driver负责执行这一转换步骤。
它包括了预处理器Preprocessor、编译器compiler、装配器assembler和链接器linker。
预处理器Preprocessor,执行预处理命令,执行替换文本、插入头文件等操作。
编译器compiler,将完整代码翻译成汇编语言。
装配器assembler,翻译成机器语言,成目标文件。
链接器linker,将调用的系统函数目标文件,和装配后的目标文件合并,形成可执行文件。
1.3 为什么了解编译系统
因为牛逼。
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
1.4 处理器执行指令
接下来,我们可以敲入命令,使计算机将会执行hello world,在显示器上输出hello world字样。
首先了解一些计算机的基础结构。
- 总线
- 总线被设计成传送定长的字节块,通常32位或者64位,称为字word。
- IO设备
- 包括控制器和适配器,控制器是设备中的主板,设配器是插在电脑上的接口。
- 主存(内存)
- 动态随机存取存储器DRAM
- 处理器
- 核心是程序计数器PC,一个寄存器,指向内存中某条机器指令地址
执行hello world时,首先从键盘输入shell命令,回车按下后,将输入的命令字符串输入寄存器,然后再存入内存。
shell程序执行一系列指令,加载执行磁盘中的hello可行性文件。
1.5 高速缓存
高速缓冲是为了解决处理器高速和主存读取低速之间的矛盾。由静态随机访问储存器SRAM实现,分为L1、L2、L3不同级别。
1.6 层次存储结构
更大更慢更便宜,更小更快更贵。
1.7 操作系统管理硬件
所有应用程序都通过操作系统实现对硬件(IO设备、主存、处理器)的操作。
操作系统通过抽象,简化对硬件的管理。
文件是对IO设备的抽象,虚拟内存是对主存的抽象,进程是对处理器的抽象。
进程
进程process是操作系统对一个正在运行的程序的抽象。一个系统可以运行多个进程,每个进程都可以看做独占地使用硬件。
进程运行时所有的状态信息称为上下文context。
操作系统内核kernel负责进程上下文间的切换,是操作系统代码常驻内存的部分。
进程中还可以有多种控制流,称为线程thread。
虚拟内存
虚拟内存Virtual Memory使每个进程看到的内存空间都是一样的,仿佛独占地使用内存。
内存地址自底向上递增,从下往上介绍。
- 程序和数据
- 堆
- 通过malooc和free分配变量空间
- 共享库
- C标准库和共享库
- 栈
- 函数调用
- 内核虚拟内存
文件
磁盘、键盘、显示器、网络都可以看成文件。
1.8 网络通信
略
1.9 重要主题
Amdahl定律
局部性能提升和整体性能提升的关系
局部性能占整体性能的比例α,局部性能提升的幅度k,则加速比S
并发和并行
计算机系统希望更强,要么算的更多,要么算的更快
并发concurrency指系统同时具有多个活动。
并行parallelism指用并发使一个系统运行得更快。
以下从高到底介绍三个层面
- 线程级并发
- 多核
- 超线程,一个处理器同时执行多个线程,比如单核双线程
- 指令集并行
- 现代处理器可以同时执行多条指令的属性
- 单指令、多数据并行SIMD
- 现代处理器通过某些特殊硬件,使一条指令产生可以并行执行的操作
抽象的重要性
虚拟机是对整个计算机的抽象。
