程序的生命周期
#include <stdio.h>
int main()
{
printf("hello,world\n");
return 0;
}
创建 => 运行 => 输出 => 终止
创建
生命周期从一个源程序(源文件)开始,文件名是hello.c(二进制文件 / 文本文件),由0/1组成的位序列,遵守ASCII标准(用唯一的单字节大小的整数值来表示每个字符)
一切文件、程序、数据都是由一串比特表示的,区分的唯一方法是读到这些数据时的上下文。
程序被其他程序翻译成不同的格式
每条c语句会被转化为一系列的地基机器语言指令,然后按照可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来。
gcc -o hello hello.c
由hello.c翻译成hello可执行目标文件的过程可分为四个阶段:
- 预处理阶段。根据以字符 # 开头的命令。修改原始
C程序。将其直接插入程序文本中。 - 编译阶段。其包含一个汇编语言程该程序包含函数
main的定义。它为不同高级语言的不同编译器提供了通用的输出语言。 - 汇编阶段。将指令翻译成及其语言指令,打包成可重定位目标程序的格式,并保存在二进制文件
hello.o中 - 链接阶段。
hello程序调用了printf函数。printf存在于一个名为printf.o的单独的预编译好了的目标文件中。将这个文件合并到hello.o程序中,得到hello文件。加载到内存中,由系统执行。
处理器读并解释存储在内存中的指令
将磁盘上的hello可执行目标文件的文件名输入到称为shell的应用程序中。
shell是一个命令行解释器,输出一个提示符,等待输入一个命令行,然后执行这个命令。如果该命令行的第一个单词不是一个内置的shell命令,那么shell就会假设这是一个可执行文件的名字。
系统的硬件组成
-
总线 贯穿整个系统的一组电子通道,携带信息字节并负责在各个部件间传递,通常被设计成传送定长的字节快(字),大多数机器为 4 / 8 字节
-
I/O设备 系统与外部世界的联系通道。每个I/O设备都通过一个控制器或适配器与I/O总线相连。控制器是I/O设备本身活着系统的主印制电路板(主板)上的芯片组。适配器是一块插在主板插槽上的卡。都负责在I/O总线和I/O设备之间传递信息。 -
主存 临时储存设备,在处理器执行程序时,存放程序和程序处理的数据。由一组动态随机存取存储器(DRAM)芯片组成。在逻辑上是一个线性的字节数组,每个字节都有其唯一的地址(数组索引)这些地址是从零开始的。
-
处理器 CPU是解释(或执行)存储在主存中指令的引擎。其核心是一个大小为一个字的存储设备(或寄存器)成为程序计数器(PC),其始终指向主存中的某条机器语言指令(即含有该条指令的地址)。 处理器看上去是按照一个简单的指令执行模型来操作的,这个模型是由指令集架构决定的。指令按照顺序执行。执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存处读取指令,解释指令中的位,执行该指令的简单操作,然后更新PC,使其只想下一条指令。而这条指令并不一定和内存中刚刚执行的指令相邻。这样的简单指令围绕 主存、 寄存器文件和算数/逻辑单元(ALU)进行。寄存器由一些单个字长的寄存器组成。
- 加载。主存(一个字节/一个字) => 寄存器,覆盖寄存器原来的内容。
- 存储。寄存器 => 主存。覆盖。
- 操作。寄存器 * 2 => ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖原来的内容。
- 跳转。从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,覆盖原来的内容。
将处理器的指令集架构和处理器的微体系结构区分开来,指令集架构描述的是每条机器中代码指令的效果,微体系结构描述的是处理器实际上是如何实现的。
运行hello程序
shell程序将字符逐一读入寄存器,再把它存放到内存中。
shell执行一系列指令来加载可执行的hello文件,将目标文件中的代码和数据从磁盘复制到主存。
利用直接存储器存取(DMA)技术,数据可以不通过处理器直接从磁盘到达主存。
等待加载完毕,处理器就开始执行目标程序的main程序中的机器语言指令。将需要输出的数据从主存复制到寄存器文件,在复制到显示设备,最终现实在屏幕上。
高速缓存
由于处理器与主存之间存取速度上的差异,将高速缓存存储器(cache)作为暂时的集结区域,存放处理器近期可能会需要的信息。处理器芯片上的L1高速缓存的容量可以达到数万字节,访问速度几乎和访问寄存器文件一样快。L2高速缓存容量为数十万到数百万字节,通过一条特殊的总线连接到处理器。L2的访问速度比L1要慢5倍,但是仍然比访问主存快5~10倍,。这两种高速缓存采用静态随机访问存储器(SRAM)的硬件技术。再配合L3构成三级高速缓存,系统可以获得一个很大的存储器,同时访问速度也很快。原因是利用了高速缓存的局部性原理。
妥善利用高速缓存能将程序的性能提高一个数量级。
存储设备形成层次结构
层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存。
操作系统管理硬件
当shell加载和运行hello程序时,以及输出消息时,其通过操作系统提供的服务对硬件进行访问。
操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现下面两个功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大大不同的低级硬件设备。
文件是对I/O设备的抽象标识,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。