计算机系统漫游
本章跟随一个 hello, world 程序,介绍它的生命周期中出现的相关概念。
1 从源程序开始
文本文件:只由ASCII字符(现在也包括Unicode字符)组成的文件。
- 文本文件实质上是一个由{0, 1}两个值组成的位(bit)序列
- 8个bit被组织为一组,称为字节
源程序:程序员通过编辑器创建并保存的文本文件。
计算机系统中的一切信息,包括磁盘上的、内存上的、网络上的,都是由一串比特表示的。区分不同数据的唯一方法是我们读取到这些数据时的上下文。根据不同的上下文,一个同样的字节序列可能表示整数、浮点数、字符串或指令等。
2 到目标文件
源文件需要经过编译系统(包括{预处理器,编译器,汇编器,链接器})转化为一系列机器指令,进而运行
- 预处理负责处理以 # 开头的编译器命令,如展开 include 并直接插入到原文件
- 编译阶段负责把上一阶段生成的文件翻译为汇编程序,它是语言无关、机器相关的。它仍是一个文本文件。
- 汇编器负责把汇编程序翻译为二进制的目标程序。
- 链接器负责把调用的库函数*插入到目标程序中,以供目标程序调用。
*:实际上并不只是这样,其他文件的全局符号(包括函数、变量)也会被处理。根据链接方式的不同,可能也不是在这一步插入。这部分后面应该会有更详细的解释。
3 为什么要了解编译系统
- 了解机器语言级别,我们的高级代码是如何运转的,进一步的,可以寻觅提升性能的方法。
- 了解链接出现的错误
- 避免漏洞
4 典型的硬件系统
一个典型的硬件系统主要由如下几部分构成
- 总线(Bus):负责在各个部件间传递定长的信息,该定长一般称为字
- IO设备:如硬盘、鼠标等,作为用户输入输出,通过适配器或控制器与总线相连。
- 主存:存放运行时程序和程序数据。逻辑上是一个线性的字节数组,其索引称为地址。
- 处理器:执行主存中存放的指令的部件。处理器中有一系列大小为一个字的存储设备(寄存器)。包括通用寄存器和一系列只能执行特定功能的寄存器
5 高速缓存
程序与数据最初存放在磁盘上,在加载时被复制到主存。
寄存器文件速度快、可存放内容少、造价高
主存速度相对慢、可存放内容相对多、造价相对低
高速缓存:作为暂时的集结区域,存放处理器近期可能需要的信息,速度比主存快很多
- 高速缓存分级,L1容量可以达到数万字节,速度接近寄存器
- L2容量在数十万到百万字节,比L1慢5倍
- 高速缓存由SRAM精彩随机访问存储器实现
6 存储器层次结构
存储器分层,高层做低层的高速缓存,期望达到接近高层的容量、低层的访问速度
一个典型的层次结构从低到高可能包括:寄存器、L1-L3、主存、磁盘、远程存储(分布式文件系统、Web)
7 操作系统管理硬件
操作系统主要提供两个基本功能
- 防止硬件被程序滥用
为程序提供简单一致的机制控制复杂且不同的硬件设备,主要机制包括
- 进程
- 虚拟内存
- 文件
7.1 进程
进程:OS对正在运行的程序的一种抽象,系统可以同时运行多个进程,每个进程认为自己独占硬件。
并发运行:不同进程的指令是交错执行的,OS通过上下文切换实现这种机制
上下文:进程运行所需的状态信息,主要包括
- 程序计数器PC和寄存器的值
- 主存的内容
7.2 线程
一个进程可以由多个称为线程的执行单元组成,共享代码和数据
7.3 虚拟内存
虚拟内存使得进程认为自己独占的使用主存,每个进程看到的内存都一致,称为虚拟地址空间。
Linux下虚拟地址空间从低地址到高地址主要由这些内容组成:
- rodata和text:只读数据和代码
- data、bss:可读写的数据
- heap:堆,向上增长
- 共享库的映射
- stack:由用户空间的最高地址向下增长
- kernel:内核的虚拟内存
7.4 文件
文件就是字节序列,在Linux(Unix)中,设备与网络都可以看作是文件。
8 网络通信
计算机系统通过网络和其他系统连接到一起,以实现信息的复制。
9 总结
系统:硬件和软件系统交织的结合体
9.1 Amdalh定律
定律:对系统的某个部分加速时,对系统性能影响取决于该部分重要性和加速程度。
$$ 执行某程序时间T_{old},某部分执行时间与其之比为\alpha,该部分性能提升比例为k $$
$$ 加速比S=\frac{1}{(1-\alpha)+\alpha/k} $$
9.2 并发和并行
并发:一个同时具有多个活动的系统
并行:用并发使得一个系统运行的更快
从高到低主要三个层次
- 线程级并发:同时执行多个线程:超线程/多线程技术
- 指令级并行:同时执行多条指令:pipeline
- 单指令、多数据并行:单条指令同时处理多条数据:SIMD
9.3 抽象
文件是对IO设备的抽象
虚拟内存是对存储器的抽象
进程是对正在运行的程序的抽象。
评论 (0)