浅谈一个程序在计算机中的旅途
引言
对于一位计算机专业的学生来说,Ta的C语言课程往往会以下面这个经典的程序开始(后面我们称之为hello程序):
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
经过简单学习的人都知道,这段程序会在控制台打印一个字符串“Hello World”并换行。很多人都知道hello程序的作用,但却从未想过从我们在代码编辑器上写出这段程序,到执行打印出“Hello World”,hello程序在计算机中到底经历了什么?
今天,我们以不一样的视角来简单看看这段hello程序在计算机中的旅途。
一个简单hello程序的运行也需要复杂的软硬件系统逻辑,本文只是简单粗略的描述,至于更详细的解释,敬请期待!
编译系统
我们在编辑器上写出hello程序,然后点击编辑器自带的运行按钮,即可运行我们刚刚些好的hello程序。好像很简单的样子,这是因为我们使用的编辑器帮助我们在背后完成了一系列的操作,又对我们隐藏了具体细节,这种编辑器我们称之为集成开发环境(IDE,Integrated Development Environment )。
hello程序从编写到运行,需要经历一套编译系统:
hello源程序在预处理阶段会识别#include <stdio.h>
这段代码,读取系统头文件stdio.h的内容并将其加在hello程序内。然后经过编译器、汇编器的处理后,链接器识别到程序中用到了printf函数,会在预提供的函数库中找到printf.o文件与hello.o链接。最后输出hello可执行目标程序,运行该可执行目标程序即可打印出Hello World。
硬件结构
此时,hello可执行目标程序会被存储到磁盘,需要将其从磁盘中读取到处理器中才能执行该程序:
- 总线:贯穿整个系统,在各个部件间传输数据
- CPU:中央处理单元,简称处理器,用于执行指令
- PC:程序计数器,指向处理器需要执行的指令,即记录指令地址
- 寄存器:为处理器运行提供快速数据存取服务
- ALU:运算单元,进行数学运算
- 主存:临时存储设备
- 磁盘:提供持久化存储服务
- 控制器/适配器:接入I/O设备
系统会从磁盘中读取hello程序到主存储器中,处理器再根据PC指定的指令地址,从主存中读取一条指令,将相应数据存在寄存器中,并通过ALU完成数据运算。当执行完一条指令后,再次读取PC指向的下一条指令并处理,直到执行完hello程序,将结果输出到显示器中。
存储结构
至此,hello程序在计算机中的旅途便简单的走完了。在过程中,我们看到hello程序从磁盘走到主存,在从主存走到寄存器,为什么不能直接一步到位呢?
这就不得不讲到,在物理硬件世界,对于不同的存储器材料,相应的成本可是天差地别!虽然磁盘的容量可能必主存大1000倍,但是主存的读取速度却可以比磁盘快1000万倍!如果要造一个足够大的主存来取代磁盘,其带来的经济成本是难以承受的。
我们虽然不能用一个大的主存来取代磁盘,但却可以用一个小的更快的存储器在两者中间提供一层缓存,也可以起到加速的作用!就如同我们在图书馆里,无法将全部的书都拿走,但却可以先将最近要读的书拿到书桌上,这样就不用每次换新书都去书架上找,再将那一本书拿到书桌上了,这样就大大提高了我们读书的效率。
常见存储结构: