第一章 计算机系统漫游
-
C语言的起源:(系统级编程的首选)
- C语言与Unix操作系统关系密切
- C语言小而简单:其设计由一个人掌控
- C语言是为实践目的设计的:其设计用来实现Unix操作系统
-
C语言程序编译的四个阶段:
- 预处理阶段:预处理器(cpp),根据字符#开头的命令,修改原始的C程序,hello.c -> hello.i
- 编译阶段:编译器(ccl),将预处理结果翻译为汇编文件,hello.i -> hello.s
- 汇编阶段:汇编器(as),将汇编文件翻译成机器语言指令,hello.s -> hello.o
- 链接阶段:链接器(ld),合并不同的*.o文件,生成可执行目标文件,hello.o + printf.o -> hello
-
了解编译系统,有助于:
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
-
系统的硬件组成:
-
总线:携带信息字节并负责在各个部件间传递
- 字:总线上传送的定长字节块
-
I/O设备:系统与外部世界的而联系通道
- 控制器:I/O设备本身或者系统的主板上的芯片组
- 适配器:插在主板插槽上的卡
- 主存:临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据
-
处理器:解释(或执行)存储在主存中指令的引擎
- 核心:程序计数器,大小为一个字
- 指令集架构:描述每条机器代码指令的效果
- 微体系结构:描述处理器实际上是如何实现的
-
总线:携带信息字节并负责在各个部件间传递
-
高速缓存存储器(cache):数据暂时的集结区域,存放处理器近期可能会需要的信息
- L1高速缓存:容量可达数万字节,访问速度几乎和访问寄存器文件一样快
- L2高速缓存:容量为数十万到数百万字节,访问时间比访问L1高速缓存长5倍,但仍比访问主存快5~10倍
-
存储器层次结构:从上至下,设备的访问速度越来越慢,容量越来越大,并且每字节的造价也越来越便宜
- 主要思想:上一层的存储器作为低一层存储器的高速缓存
-
操作系统:应用程序与硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统
- 主要功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
- 基本抽象概念:
- 进程:对处理器、主存和I/O设备的抽象表示
- 虚拟内存:对主存和磁盘I/O设备的抽象表示
- 文件:对I/O设备的抽象表示
- 主要功能:
-
进程:操作系统对一个正在运行的程序的一种抽象,制造一种假象,即某个程序的代码和数据是系统内存中唯一的对象
- 并发运行:一个进程的指令和另一个进程的指令是交错执行的
- 上下文:跟踪程序运行所需的所有状态信息(PC、寄存器文件的当前值、主存的内容等)
- 上下文切换:一种进程间交错执行的机制,保存当前进程的上下文,恢复新进程的上下文,将控制权传递到新进程
-
操作系统内核:操作系统代码常驻主存的部分,是系统管理全部进程所用代码和数据结构的集合
- 当应用程序需要操作系统的某些操作时,它就执行一条特殊的系统调用指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序
线程:一个进程可由多个执行单元(线程)组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据
-
虚拟内存:为每个进程提供一种假象,即每个进程都在独占地使用主存
-
内存地址空间
- 程序代码和数据:在进程一开始运行时就被指定了大小,直接按照可执行文件的内容初始化
- 堆:可以在运行时动态地扩展和收缩(调用free、malloc等函数)
- 共享库:用来存放像C标准库和数学库这样的共享库的代码和数据
- 栈:实现函数调用,在程序执行期间可以动态地扩展和收缩(调用函数、函数返回)
- 内核虚拟内存:为内核保留,不允许应用程序读写和直接调用
-
-
文件:字节序列,每个I/O设备都可以看成是文件
- 系统中所有输入输出都是通过使用Unix I/O系统函数调用读写文件来实现的
-
Amdahl定律:
主要思想:当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度
-
总执行时间:
$T_{new}=(1-\alpha)T_{old}+(\alpha T_{old})/k=T_{old}[(1-\alpha)+\alpha/k]$
- $T_{old}$:(原来)系统执行某应用程序需要的时间
- $T_{new}$:(加速后)系统执行某应用程序需要的时间
- $\alpha$:系统某部分所需执行时间与$T_{old}$的比例
- $k$:该部分性能提升比例
-
加速比:
$S={T_{old}\over T_{new}}={1\over(1-\alpha)+\alpha/k}$
- $S$:加速比
-
并发和并行:
并发:指一个同时具有多个活动的系统
并行:指用并发来使一个系统运行得更快
-
三个层次:
-
线程级并发:传统意义上这种并发行为只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的
- 超线程:一项允许一个CPU执行多个控制流的技术
- 涉及CPU某些硬件有多个备份:如程序计数器、寄存器文件
- 其他的硬件部分只有一份:如执行浮点算术运算的单元
- 多处理器:
- 减少了在执行多个任务时模拟并发的需要
- 可以使应用程序运行得更快
- 超线程:一项允许一个CPU执行多个控制流的技术
-
指令级并行:现代处理器可以同时执行多条指令的属性
- 流水线:将执行一条指令所需要的活动划分成不同的步骤,将处理器的硬件组织成一系列的阶段,每个阶段执行一个步骤。这些阶段可以并行地操作,用来处理不同指令的不同部分
- 超标量:处理器达到比一个周期一条指令更快的执行速率
单指令、多数据并行:允许一条指令产生多个可以并行执行的操作(SIMD并行)
-
-
抽象: