CSAPP 第一章 计算机系统漫游 总结

第一章是总论,把一下简单的概念梳理了一下

程序的编译

带有 .c 后缀的C语言源文件是不能直接在程序上运行的,需要将其中的C语句转换为机器语言,按照可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。目标程序也称为可执行目标文件。

我们常使用的编译命令 gcc -o hello hello.c ,具体的编译过程分为四个阶段:(1) 预处理;(2) 编译;(3) 汇编;(4) 链接;

01 预处理

预处理器将根据将读取所有的 #include 头文件以及宏定义,把他们插入文本中,将原本的命令替换成其具体详细的内容。

处理结果是得到 .i 文本文件

02 编译

编译器将 .i 文件转换为 .s 文件,其代码指令由C语言代码转为汇编指令。文件中包含函数 main 的定义,类似下图:

1
2
3
4
5
6
7
8
main:
pushq %rbp
movq %rsp ,%rbp
leaq .LC0 ,%rdi
call puts@PLT
movl $0 ,%eax
popq %rbp
ret

03 汇编

汇编器将 .s 文件的人类可读的文本指令转换为计算机可读的二进制机器语言指令,把这些指令打包成一种叫做可重定位目标程序(relocatable object program)的格式,并将结果保存在 .o 文件中。

此时的文件用文本编辑器打开的话内容将是乱码。

04 链接

链接器 .o 目标文件与其他目标文件、库文件、启动文件等链接起来生成可执行目标文件

例如我们在程序中调用 printf 函数,printf 函数存在于一个名为 printf.o 的单独的预编译好了的目标文件中,而这个文件必须由链接器合并到我们的 hello.o 程序中。

系统的硬件组成

系统硬件由四部分组成:总线、I/O设备、主存和处理器

总线

总线就是贯穿整个系统的电子管道,负责在各个部件之间传递信息。

通常总线被设计成传送定长的字节块,也就是计算机处理数据的基本单元大小字(word)。不同系统中的机器字长不同,大部分是 4 字节(32位)和 8 字节(64位)。

I/O 设备

I/O(输入/输出)设备就是系统与外界联系的通道。像键盘鼠标,以及磁盘驱动器、网络驱动器之类的硬件都是 I/O 设备。

每个 I/O 设备都通过一个控制器适配器与 I/O 总线相连,负责在二者之间传递信息。

控制器是 I/O 设备本身或者系统的主印制电路板(主板)上的芯片组

适配器是一块插在主板插槽上的卡

主存

从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。

主存也就是我们会在购买电脑时在详情页中看到的“运行内存”,代表程序可以同时运行的程序和数据大小

处理器

中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。

在任何时刻,PC 都指向主存中的某条机器语言指令(即含有该条指令的地址)。

此 PC 非 “个人计算机” PC 哦

从系统通电开始,直到系统断电,处理器一直在不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令,不断循环往复。这个过程围绕着主存、寄存器文件(register file)和算术/逻辑单元(ALU)进行。

运行一个程序

假设我们目标运行的程序将输出 “hello world!”,我们在命令行解释器shell中直接输入文件名,系统就会执行文件并作出相应的输出。

1
2
linux> ./hello
hello world!

在计算机层面,运行程序就是不断复制的一个过程,大致分为以下几个流程:

首先我们在键盘上输入字符串 ”./hello“ ,shell 会将其字符逐一读入寄存器,再把他们放入内存中。

![](/img/CSAPP-第一章-计算机系统漫游-总结/1-read hello from keyboard.png)

敲击回车键以后,shell 就会执行一系列指令来加载可执行的 hello 文件,这些指令将会把目标文件中的代码和数据复制到主存。

接下来,CPU就会开始处理 目标程序的 main 程序中的机器语言指令。这些指令将会把将要输出的字符串中的字节从主存复制到寄存器文件,再从寄存器复制到显示设备,最终显示到屏幕上。

操作系统

我们可以把操作系统理解为应用程序和硬件之间的一层软件,所有应用对硬件的操作尝试都必须经过操作系统。

![](/img/CSAPP-第一章-计算机系统漫游-总结/1-操作系统 .png)

操作系统的功能:

  • 防止硬件被失控的应用程序滥用

  • 向应用程序提供简单一致的机制来控制低级硬件设备

操作系统通过三个抽象概念来实现上述功能:进程、虚拟内存、文件

三个概念的关系如下图所示:

进程

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

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程由多个线程组成,每个线程都运行在进程的上下文中,共享同样的代码和数据。

并发运行是指一个进程的指令和另一个进程的指令交错执行,多个进程同时活动。一个CPU通过上下文切换实现并发执行多个程序。

虚拟内存

虚拟内存是主存和I/O设备的抽象,它为进程提供一种独立占用内存的假象。

每个进程看到的内存都是一致的,称为虚拟地址空间。每个进程看到的虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能。

文件

文件就是字节序列,每个I/O设备,包括磁盘、键盘、显示设备,甚至网络都可看为文件。

重要概念

Amdahl 定律

Amdahl 定律(也叫阿姆达尔定律)主要思想是,当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。

所以,要想显著加速整个系统,必须提升全系统中相当大的部分的速度

并行和并发

并发是指一个同时具有多个活动的系统。

并行是指用并发来使一个系统运行得更快。

线程级并发

构建在进程这个抽象之上,我们能够设计出同时有多个程序执行的系统,这就导致了并发。使用线程,我们甚至能够在一个进程中执行多个控制流。

多处理器系统是由单操作系统内核控制的多处理器组成的系统。

多核处理器是将多个CPU(称为”核”)集成到一个集成电路芯片上。

超线程,有时称为同时多线程(simultaneous multi-threading),是一项允许一个 CPU 执行多个控制流的技术。超线程的处理器可以在单个周期的基础上决定要执行哪一个线程,比如,假设一个线程必须等到某些数据被装载到高速缓存中,那在这个装在过程中, CPU 就可以继续去执行另外的一个线程。

指令级并行

现代处理器可以同时执行多条指令的属性称为指令级并行。

超标量处理器是指可以达到比一个周期一条指令更快的执行速率的处理器。

单指令、多数据并行

单指令、多数据,即 SIMD 并行,就是许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作。

虚拟机

虚拟机提供对整个计算机的抽象,包括操作系统、处理器和程序。

虚拟机这个抽象概念与之前的进程、虚拟内存和文件的抽象概念关系如下图:


之前一直在快乐暑假摆烂 到处吃席,终于要开始恢复学习状态辣🤪


CSAPP 第一章 计算机系统漫游 总结
https://shmodifier.github.io/2023/08/31/CSAPP-第一章-计算机系统漫游-总结/
作者
Modifier
发布于
2023年8月31日
许可协议