第一章
编译系统:
在GCC中翻译过程分为四个阶段:
一、预处理阶段:
处理以字符#开头的命令如 #include, #define。比如#include读取的头文件将直接插入到程序文本中,结果得到了另一个C程序
扩展名为 .i
二、编译阶段:
编译器将文本文件 .i翻译成文本文件.s,它包含的是翻译成的汇编程序。
三、汇编阶段:
汇编器将扩展名为 .s 的文件翻译成机器语言指令并打包成 可重定位目标程序 的格式扩展名为 .o
四、链接阶段:
比如程序中调用了printf,该函数为标准C库中的函数,存在于一个名为printf.o单独的预编译好了的目标文件中,链接器负责把该文件合并到程序中,结果为加载内存中后能运行的可执行目标文件
系统的硬件组成
- 总线:一组贯穿系统的电子管道,传送定长的字节块,也就是字,字中的字节数即为字长,是一个基本的参数,大多数机器字长要么是4个字节(32位),要么是8个字节(32位)。
- I/O设备:每个I/O设备都通过一个适配器或控制器与I/O总线相连。其区别是它们的封装方式。适配器是一块插在主板插槽上的卡(如显卡),控制器是I/O设备本身或者系统的主板上的芯片组。
- 主存:有动态随机存取存储器(DRAM)芯片构成,逻辑上,存储器是一个线性的字节数组,每个字节都有唯一的地址(数组索引),地址从0开始。
- 处理器:CPU的核心是一个大小为一个字的存储设备(寄存器),成为程序计数器(PC)。在任何时刻,PC都指向主存中的某条机器语言指令(即含有该指令的地址).从通电到断电,CPU不断执行计数器指向的指令并更新PC,使其指向下一条,且不一定相邻。
存储器的层次结构:
CPU寄存器在顶部,接着是多层的硬件高速缓存存储器(L1,L2,L3),DRAM主存,和磁盘存储器。越高层的速度越快造价越高。层次结构中较高层次的存储设备可作为较低层次的高速缓存。
操作系统管理硬件
- 文件是对I/O设备的抽象 网络看成I/O设备
- 虚拟内存是对主存和磁盘的抽象
每个进程独占使用主存,每个进程看到的内存都是一致的,成为虚拟地址空间。
从低到高:程序代码和数据、堆、共享库、栈、内核虚拟内存; - 进程是处理器、主存、I/O设备的抽象
单处理器系统:
一个系统可运行多个进程,并发运行则是说一个进程的指令和另一个进程的指令是交错执行的,这种机制被称为上下文切换,有操作系统内核管理。在大多数系统中,需要运行的进程数是可以多于CPU个数的。
并发和并行
-
线程级并发
在一个进程中执行多个控制流,即超线程有时称为同时多线程,传统上,这种实现只是模拟出来的,就像杂耍艺人控制多个球,是通过正在执行的进程间快速切换实现的,而超线程技术的出现,在常规的处理器需要大约20000个时钟周期做不同线程的转换,而超线程的处理器可以在一个时钟周期的基础上决定执行哪一个线程。 -
指令级并行
现代处理器可以同时执行多条指令的属性成为指令级并行,8086需要多个时钟周期来执行一个指令,现在的处理器可以保持每个时钟周期2~4个指令的执行速率,这种处理器被称之为超标量处理器。 -
单指令、多数据并行
许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作这种方式成为单指令,多数据,即SIMD并行。例如较新几代的AMD 和 Intel的处理器都具有并行的对8对单精度浮点数(float)做加法的指令。