CSAPP 第一章 计算机系统漫游

计算机系统由硬件系统软件组成。

1
2
3
4
5
6
#include <stdio.h>

int main(){
printf("hello, world\n");
return 0;
}

1.1 信息就是位 + 上下文

hello 程序的生命周期是从一个源程序(源文件)开始的,文件名为hello.c。源程序实际就是由一个值为 0 和 1 组成的位(比特)序列,8 个位被组织为一组,称为字节

大部分的现代计算机系统都使用 ASCII 标准来表示文本字符。

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

hello 程序的生命周期是从一个高级 C 语言程序开始,因为这种形式能够被人读懂。然而,为了在系统上运行hello.c 程序,每条C 语句都必须被其他程序转化为一系列的低级机器语言指令。然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也可称为可执行目标文件

在 Unix 系统上,从源文件到目标文件的转化是由编译器驱动程序完成的:

linux> gcc -o hello hello.c

  • 预处理阶段。预处理器(cpp)根据以字符#开头的命令,修改原始的C程序。以.i作为文件扩展名。
  • 编译阶段。编译器(ccl)将文本文件hello.i 翻译成文本文件 hello.s,它包含一个汇编语言程序
  • 汇编阶段。接下来,汇编器(as)将hello.s 翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并把结果保存在目标文件hello.o 中,hello.o 文件是一个二进制文件。
  • 链接阶段。链接器(ld)负责处理合并,结果就得到了hello 文件,它是一个可执行目标文件,可以被加载到内存中,由系统执行。

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

  • 优化程序性能
  • 理解链接时出现的错误
  • 避免安全漏洞

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

此时,hello.c 源程序已经被编译系统翻译成了可执行目标文件hello,并被存放在磁盘上。要想在Unix 系统上运行该可执行文件,我们将它的文件名输入到称为 shell的应用程序中:

linux> ./hello

hello, world

linux>

shell是一个命令行解释器。

1.4.1 系统的硬件组成

1. 总线

它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是

2. I/O 设备

3. 主存

主存是一个临时存储设备,在处理执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存粗器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。

4. 处理器

中央处理器(cpu),简称处理器,是解释(执行)存储在主存中指令的引擎。

1.5 高速缓存至关重要

​ hello 程序的机器指令最初存放在磁盘上,当程序加载时,它们被复制到主存;当处理器开始运行程序时,指令又从主存复制到处理器。从程序员角度看,这些复制就是开销,减慢了程序“真正”的工作。

​ 一个磁盘驱动器可能比主存大1000倍,但是对于处理器而言,从磁盘驱动器上读取一个字的时间开销要比从主存中读取的开销大1000万倍。

​ 针对这种处理器与内存之间的差异,系统设计者采用了更小更快的存储设备,称为高速缓存存储器(cache),作为暂时的集结区域,存放处理器近期可能会需要的信息。

1.6 存储设备形成层次结构

1.7 操作系统管理硬件

所有应用程序对硬件的操作尝试都必须经过操作系统。

操作系统有两个基本功能:

  • 防止硬件被失控的应用程序滥用;
  • 向应用程序提供简单一致的机制来控制复杂而又大不相同的低级硬件设备;

操作系统通过几个基本的抽象概念(进程,虚拟内存和文件)来实现这两个功能。

(1),文件是对I/O设备的抽象表示。

(2),虚拟内存是对主存和磁盘I/O设备的抽象表示。

(3),进程是对处理器,内存和I/O设备的抽象表示。

1.7.1 进程

进程是操作系统对一个正在运行的程序的一种抽象。

操作系统保持跟踪进程运行所需要的所有状态信息。这种状态,就是上下文

==进程是系统进行资源分配和调度的一个独立单位。==

引入进程的目的是为了更好地使多道程序并发执行,提高资源利用率和系统吞吐率。

1.7.2 线程

一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

==线程是一个基本CPU执行单元,也是程序执行的最小单元==

引入线程的目的则是为了减小程序在并发时所付出的时空开销,提高操作系统的并发性能。

1.7.3 虚拟内存

虚拟内存时一个抽象概念,它为每一个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间

每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。我们从最低的地址开始:

  • 程序代码和数据
  • 共享库。用来存放像C标准库和数学库这样的共享库的代码和数据的区域。
  • 内核虚拟内存。地址空间顶部的区域是为内核保留的。

1.7.4 文件

文件就是字节序列。每个I/O设备,甚至网络,都可以看生是文件。

1.8 系统之间利用网络通信