Leooel和CSAPP(即Computer Systems: A Programmer’s Perspective)的计算机系统漫游。
1.1 信息就是「位 + 上下文」
- 源程序实际上就是一个由值0和1组成的位(比特)序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。
- 系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
1.2 程序被其他程序翻译成不同的格式
- 在Unix系统上,从源文件到目标文件的转化是由编译器驱动程序完成的。这个转化过程可分为四个阶段完成,如下图所示。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。
- 预处理阶段:预处理器(cpp)根据以字符#开头的命令,修改原始的C程序,比如读取系统头文件的内容,并把它直接插入程序文本中,得到另一个C程序,通常以.i作为文件扩展名。
- 编译阶段:编译器(ccl)将文本文件hello.i翻译成hello.s,变成一个汇编语言程序。
- 汇编阶段:接下来,汇编器(as)将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并把结果保存在目标文件hello.o中。hello.o文件是一个二进制文件。
- 链接阶段:链接器(ld)负责链接程序中调用的事先库里提供的函数(如printf)到hello.o程序中,这样就得到了一个可执行目标文件。

1.3 了解编译系统如何工作是大有裨益的
- 从程序员的视角优化程序性能,比如做出好的编码选择。
- 理解链接时出现的错误。根据经验,一些最令人困扰的出现错误往往都与链接器操作有关,尤其是试图构建大型的软件系统时。
- 避免安全漏洞。
1.4 处理器读并解释存储在内存中的指令
- 系统的硬件组成
- 总线:贯穿整个系统的一组电子管。它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定常的字节块,也就是字。字中的字节数(字长)是一个基本的系统参数,现在大多数机器字长要么是4个字节(32位)要么是8个字节(64位)。
- I/O设备:I/O设备是系统与外部世界的联系通道。包含键盘、鼠标、显示器、磁盘、(网络)。每个I/O设备都通过一个控制器或适配器与I/O总线相连。
- 主存:主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。
- 处理器:中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器)称为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令。

- 运行hello程序
1.5 高速缓存至关重要
- 高速缓存存储器(cache),作为暂时的集结区域,存放处理器近期可能会需要的信息。高速缓存用的是静态随机访问存储器(SRAM)。
- 高速缓存的局部性原理:即程序具有访问局部区域里的数据和代码的趋势。通过让高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
1.6 存储设备形成层次结构

- 正如可以运用不同的高速缓存的知识来提高程序性能一样,程序员同样可以利用对整个存储器层次结构的理解来提高程序性能。
1.7 操作系统管理硬件
- 可以把操作系统看成是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。如图1-10。
- 操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用 (2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。 操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。如图1-11所示,文件是对I/O设备的抽象,虚拟内存是对主存和磁盘I/O设备的抽象,进程是对处理器、主存和I/O设备的抽象。
- 进程:进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。这个假象是通过进程的概念来实现的。并发运行 是说一个进程的指令和另一个进程的指令是交错执行的。 上下文切换是说无论在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。从一个进程切换到另一个进程是由操作系统内核(kernel)管理的,内核是操作系统
代码
常驻主存的部分。 - 线程:一个进程可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。 多线程之间比多进程之间更容易共享数据,线程一般也比进程更高效。
- 虚拟内存:虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一样的,称为虚拟地址空间。
- 文件:文件就是文字序列。每个I/O设备,都可以看成是文件。
- 进程:进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。这个假象是通过进程的概念来实现的。并发运行 是说一个进程的指令和另一个进程的指令是交错执行的。 上下文切换是说无论在单核还是多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。从一个进程切换到另一个进程是由操作系统内核(kernel)管理的,内核是操作系统
1.8 系统之间利用网络通信
网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种I/O设备。
1.9 重要主题
- Amdahl定律:主要思想是当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
- 并行和并发:想要计算机做的更多、想要计算机做的更快是计算机整个发展历史中的两个持续动力。并发指一个同时具有多个活动的系统;并行指的是用并发来使一个系统运行的更快。
- 抽象在计算机系统中有很大的重要性。
小结
- 计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位,它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件。
- 处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在内存、I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分成层次结构——CPU 寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器。在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特造价也更高。层次结构中较高层次的存储设备可以作为较低层次设备的高速缓存。通过理解和运用这种存储层次结构的知识,程序员可以优化C程序的性能。
- 操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象: 1)文件是对I/O设备的抽象:2)虚拟内存是对主存和磁盘的抽象; 3)进程是处理器、主存和I/O设备的抽象。
- 最后,网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种I/O设备。