CSAPP笔记-第一章
快速链接:
-
目录与重点内容:
计算机系统的抽象
Amdahl加速比定律公式
- 这一章术语(请ctrl+F正文内查找):
位,字节,字符,文本,ASCII, 文本文件,二级制文件,机器指令,可执行目标程序,编译器GCC(缺省),编译系统,预处理器,编译器,汇编器,链接,总线,I/O,主板,适配器,控制器,主存,DRAM,逻辑,处理器,程序计数器,寄存器,ALU,加载,存储,操作,跳转,指令集,高速缓存,操作系统,抽象,进程,多核,并发,上下文切换,内核,系统调用,控制权,线程,虚拟内存,虚拟地址空间,堆(缺省),共享库(缺省),用户栈(缺省),内核虚拟内存(缺省),加速比,Amdahl定律,并行,并发,线程级并发,多核,超线程,指令集并发,SIMD并行,虚拟机
一个hello world程序的生命周期
#include <stdio.h>
int main(){
printf("hello, world\n");
return 0;
}
编译系统:
-
编译hello程序的过程
(1) 预处理阶段:插入头文件
(2) 编译阶段:编译器翻译,包含main函数定义的汇编语言程序
main:
subq $8, %rsp #一条低级机器语言指令
movl $.LCO, %edi
call puts
movl $0, %eax
addq $8, %rsp
ret
(3) 汇编阶段:汇编器翻译成机器语言指令,打包成可重定位目标程序(relocatable object program), 保存为二进制文件
(4) 链接阶段:链接器合并调用的printf函数,得到可执行目标文件
-
shell: 命令行解释器;运行hello程序,\(> ./hello\)
-
系统硬件组成
-
总线:总线传送定长的字节块(字,word),字长是基本的系统参数:32位系统是4个字节,64位系统是8个字节
-
I/O设备:每个I/O设备都通过一个控制器(设备/系统主板上的芯片组)/适配器(插在设备/系统主板插槽上的卡)与I/0总线相连
-
主存:由一组动态随机存取存储器(DRAM)芯片组成。逻辑上,是一个线性字节数组。
-
处理器 (CPU):
模型 - 指令集架构。
下一条指令不一定和内存中刚执行的指令相邻。4.1 核心 - 大小为一个字的寄存器,成为程序计数器(PC),PC指向主存中某条机器语言指令(的地址)。
4.2 寄存器文件(register file): 一个小的存储设备,每个寄存器单个字长
4.3 算数/逻辑单元 (ALU): 计算新的数据和地址值
4.4 CPU在PC中指令要求下执行的操作:
加载 - 主存 -> 寄存器;
存储 - 寄存器到主存;
操作 - 两个寄存器 -> ALU运算 -> 一个寄存器;
跳转 - 指令复制到PC
hello程序的运行过程 (省略细节)
高速缓存存储器 (cache memory)
加快从主存中复制到寄存器的速度。
多级高速缓存:L1, L2, (L3), ...
可以利用高速缓存将程序的性能提高一个数量级
- 存储设备的层次:使用上一层存储器作为低一层存储器的高速缓存
操作系统:应用程序 <--> 硬件
操作系统两个基本功能:
(1)防止硬件被失控的应用程序滥用
(2)向应用程序提供简单一致的机制来控制复杂的低级硬件设备
因此,操作系统有以下抽象:
-
进程:操作系统对一个正在运行的程序的一种抽象。
- 并发运行 - 一个进程的指令和另一个进程的指令交错执行。进程数多于CPU个数。CPU通过处理器在进程间的切换来实现并发。
- 这种交错执行的机制称为上下文切换 - 保持跟踪运行的状态信息,即上下文(PC,寄存器当前值,主存内容等)。
- 内核(kernel, 操作系统代码常驻主存的部分,系统关系全部进程所用代码和数据结构的集合)管理进程到进程的转换。
应用程序执行一条system call指令,将控制权传递给内核/操作系统。
操作系统保留当前进程的上下文,创建应用程序的新进程以及上下文。
操作系统将控制权传给新进程(执行请求,返回应用程序)。
-
线程
一个进程由多个线程执行单元组成。线程运行在进程的上下文中(?),共享代码和全局数据。 -
虚拟内存
一个抽象概念。进程的虚拟地址空间如下(每个进程看到的内存都是一致的):
地址由下往上增大。
- 文件
就是字节序列。每个I/O设备都可以看成文件。系统输入输出通过使用一组Unix I/O系统函数调用读写文件来实现。
系统之间的网络通信
简而言之,网络可以视为一个I/O设备。
Amdahl law
实际加速比的计算:\(S = T_{old} / T_{new}, T_{new} = (1-\alpha)T_{old} + \alphaT_{old}/k\)
并发(concurrency)和并行(parallelism)
并发:通用概念,指同时具有多个活动的系统
并行:用并发使一个系统运行得更快
系统层次结构中由高到低的三个并行层次:
-
线程级(进程级?):多核处理器, 超线程/同时多线程
-
指令集并行:处理器同时执行多条指令 - 超标量(super-scalar)处理器
-
单指令、多数据(SIMD并行):多是为了提高处理影像、声音和视频数据应用的执行速度。;编译器支持用特殊的向量数据类型来写程序。
计算机系统中抽象的重要性
如,为一组函数规定一个简单的应用程序接口(API)
计算机系统提供的一些抽象(在上述介绍的基础上增加"虚拟机"抽象):
Other glossary
-
8个位(比特) -> 1个字节 -> 程序中某个字符
-
ASCII标准:用唯一的单字节大小的整数值来表示每个字符
-
文本文件:只由ASCII字符构成的文件。
-
二进制文件:不是文本文件的所有其他文件
Unsolved
- 线程运行在进程的上下文中
- 线程级并发 - 进程级并发?
练习题答案
(略)