前面我们简单的介绍了一下计算机的硬件的组成和操作,现在我们正式介绍运行示例程序时发生了什么,我们会从宏观的角度进行描述,不会涉及到所有的技术细节

刚开始时,shell 程序执行它的指令,等待用户键入一个命令。当我们在键盘上输入了 ​​./hello​​ 这几个字符时,shell 程序将字符逐一读入寄存器,再把它放到内存中,如下图所示

C语言程序执行时的硬件操作流程_c语言

 

当我们在键盘上敲击​​回车键​​的时候,shell 程序就知道我们已经结束了命令的输入。然后 shell 执行一系列指令来加载可执行的 hello 文件,这些指令将目标文件中的代码和数据从磁盘复制到主存。

利用 ​​DMA(Direct Memory Access)​​ 技术可以直接将磁盘中的数据复制到内存中,如下

C语言程序执行时的硬件操作流程_开发语言_02

 

一旦目标文件中 hello 中的代码和数据被加载到主存,处理器就开始执行 hello 程序的 main 程序中的机器语言指令。这些指令将 ​​hello,world​​ 字符串中的字节从主存复制到寄存器文件,再从寄存器中复制到显示设备,最终显示在屏幕上。如下所示

C语言程序执行时的硬件操作流程_开发语言_03

高速缓存是关键

上面我们介绍完了一个 hello 程序的执行过程,系统花费了大量时间把信息从一个地方搬运到另外一个地方。hello 程序的机器指令最初存储在​​磁盘​​​上。当程序加载后,它们会​​拷贝​​​到主存中。当 CPU 开始运行时,指令又从内存复制到 CPU 中。同样的,字符串数据 ​​hello,world​​ 最初也是在磁盘上,它被复制到内存中,然后再到显示器设备输出。从程序员的角度来看,这种复制大部分是开销,这减慢了程序的工作效率。因此,对于系统设计来说,最主要的一个工作是让程序运行的越来越快。

由于物理定律,较大的存储设备要比较小的存储设备慢。而由于寄存器和内存的处理效率在越来越大,所以针对这种差异,系统设计者采用了更小更快的存储设备,称为​​高速缓存存储器(cache memory, 简称为 cache 高速缓存)​​,作为暂时的集结区域,存放近期可能会需要的信息。如下图所示

C语言程序执行时的硬件操作流程_高速缓存_04

 

图中我们标出了高速缓存的位置,位于高速缓存中的 ​​L1​​​高速缓存容量可以达到数万字节,访问速度几乎和访问寄存器文件一样快。容量更大的 ​​L2​​​ 高速缓存通过一条特殊的总线链接 CPU,虽然 L2 缓存比 L1 缓存慢 5 倍,但是仍比内存要快 5 - 10 倍。L1 和 L2 是使用一种​​静态随机访问存储器(SRAM)​​​ 的硬件技术实现的。​​最新​​​的、处理器更强大的系统甚至有三级缓存:L1、L2 和 L3。系统可以获得一个很大的存储器,同时访问速度也更快,原因是利用了高速缓存的 ​​局部性​​原理。