Contents

CSAPP-chapter-01 note

本章为一个关于计算机系统的概述,点明了本书的面向读者,以及读完本书所能非读者带去的好处。比如:一些避免由计算机表示数字的方式引起的数字错误的实用技巧、充分利用现代处理器和存储器的系统设计来优化 C 代码的小窍门、了解编译器如何实现过程调用以及利用这些知识来避免缓冲区溢出错误带来的安全漏洞、识别和避免链接时的错误、编写自己的 Unix shell 和动态存储分配包以及 Web 服务器、认识并发等。

1.1 信息就是位 + 上下文

对计算机而言,任何输入、输出都是 0/1 bit 序列,它由人设计并为其所用,这些比特序列以及对 bit 序列的解释方式即构成对人而言的信息。文本文件二进制文件是以人的角度(即解释的方式)来区分的,若某个文件其对应的 bit 序列可以按某个规则解释为对人有意义的文本,那么这个文件就是文本文件,否则就是二进制文件。

1.2 程序被其他程序翻译成不同的格式

机器能懂的只有指令,C 语言是为了人的方便创造的语言,由 C 语言写就的源程序需要让机器执行则必须先转换为机器所能理解的指令。这中间的过程为:

  • 预处理:处理头文件
  • 编译:源程序转化为汇编程序
  • 汇编:将汇编程序转换为可重定向的目标程序(什么是可重定向?)
  • 链接:汇编程序中可能调用了其他单独编译好的汇编目标文件,需要将被包含的目标文件合并到汇编程序中

1.3 了解编译系统是如何工作的大有益处

益处有:

  • 可以针对性的优化程序的性能:比如在达到统一个目的时,某种条件下使用某种语句会比另外的语句更高效
  • 理解和避免链接时出现的错误:比如各种静态变量和全局变量的区别、静态库和动态库的区别等
  • 避免安全漏洞:理解堆栈的原理和缓冲区益处的错误

1.4 处理器读取并解释存在内存中的指令

计算机的硬件组成部分主要包括:I/O (输入、输出)设备(比如键盘、鼠标、显示器)、主存、CPU;这些设备之间的数据传输注意通过一个叫「总线」的东西。程序运行时待执行的指令必须要(可能是从存储器)加载到主存中,CPU 根据当前的程序计数器存储的地址,执行待执行的指令,每执行一条指令后,程序计数器存储的内容就会更新为下一条待执行的指令的地址。

1.5 高速缓存至关重要

从 CPU 里的寄存器读写的速度和从内存里读写数据的速度是数量级的差别,从内存里读写数据的速度和从外存储器读写的速度也是数量级的差别,如果需要从慢速的存储器里频繁读取速度势必会降低计算机运行的效率,所以可以在快速和慢速存储器中间设置一个介于二者速度之间的存储器,这些存储器就是 cache,有了 cache 计算机存取数据的速率就会有所提升。

1.6 存储设备形成层次结构

CPU 里的寄存器、介于内存和内存中间的 cache、内存、介于内存和外存中间的二级存储器、外存等这一些列具有存储功能的器件就构成了计算机的存储器层次结构。它们存取速度由快到慢、存储空间由小到大,相同存储单位的造价由高到低

1.7 操作系统管理硬件

操作系统是介于应用程序和硬件之间的系统应用,其功能体现为向应用软件提供调用硬件的接口使得应用程序员不必关注与硬件交互的复杂细节,同时防止应用软件对硬件的滥用。主要通过三个抽象来实现:

  • 文件:对 「I/O 设备」 的抽象
  • 虚拟内存:对文件和「主存」的抽象
  • 进程:对虚拟内存和「CPU」的抽象

1.8 系统之间利用网络通信

在此之前都只涉及计算机对只被看做是一个孤立的硬、软件集合体,两台计算机之间同样可以通过网络来进行通信,可以发送数据给其他计算机,也可以从其他计算机接受数据,此种情况下网络亦可以视作是一种 I/O 设备。

1.9 重要主题

1.9.1 Amdahl 定律

定律可以总结为一个公式:S = 1 / (1 - alpha + alpha / k),其中 S 为提升性能后系统整体的加速比,k 为系统中占比为 alpha 的组成部分的加速比,通过公式可知,若想大幅提升系统整体的性能,必须提升占比很大的那部分的性能,即使得 alpha 和 k 同时尽可能的大,因为如果 alpha 很小的话,右边的极限(即 k 大上了天)也就是 1 / (1 - alpha)。 注:加速比的定义为新的速度比上旧的速度,比如原来的速度为 100,新速度为 200,那么加速比就是 2

习题

1.1
A:

alpha = 0.6

k = 1.5

-> S = 1 / (1 - alpha + alpha / k) = 1 / (0.4 + 0.6 / 1.5) = 5 / 4 = 1.25

B:

alpha = 0.6

S = 5 / 3

-> k = alpha / (1 / S + alpha - 1) = 0.6 / (0.6 + 0.6 - 1) = 3

1.2

alpha = 0.8

S = 2

-> k = alpha / (1 / S + alpha - 1) = 0.8 / 0.3 = 2.67

1.9.2 并发和并行

对操作系统而言,当两个进程中的某一个进程的终止时间在另一个进程的创建时间和终止时间之间时,那么便可以称这两个进程是并发的。并发指的是一个系统可以同时具有「多」个活动的能力,是一个通用的概念。并行则指的是通过并发来使一个系统运行的更「快」的能力。

1.10 小结

计算机系统是由硬件和系统软件组成,它们共同协作以运行应用程序。操作系统是硬件和应用程序之间的媒介,提供三种基本抽象,文件、虚拟内存、进程。