计算机系统漫游
计算机系统漫游
HelloWorld
相信大多数人学习C语言的第一个程序便是HelloWorld。对于把程序编译再运行,得到一个黑框显示出helloworld这个过程,我们并不陌生。只是这个过程到底在计算机中发生了什么呢?
信息的表示
让我们回到hello程序,首先要在黑框中显示出helloworld,要有一个程序。而这个程序就储存在计算机硬盘中,与其他文本文件无二异,它也是使用ASCII标准进行编码的。而除了这样的文本文件,还有其他的文件称为二进制文件。这些所有的文件,包括文本,图片,音频,视频等等组成了计算机中所有的文件,而在计算机底层均是使用一串串的比特(bit)来表示的,至于为什么可以参考我上一篇文章《从编码到二进制》。至此我们了解到了hello程序是存储在计算机硬盘中用ASCII编码的一串比特位。而要如何执行它呢?
翻译的过程
程序文件归根到底也是我们人写下的定义,要让计算机理解并且执行就需要有一个翻译官。毕竟人和机器不能够直接沟通,就像两个语言地区的人不能够直接使用语言交流一样。在计算机中我们把翻译叫做编译,工具编译器就在此充当了这样一个翻译官。编译的过程包含些许步骤,总的来说是对文本文件到二进制文件做了一个转换。这里还有一层含义:文本文件是给人看的,而二进制文件是给计算机看的。在C语言中编译的步骤包括了预处理、编译、汇编、链接几个步骤。至于为什么是这几个步骤原因在于C语言本身设计出的特性以及为了能够让所有机器都能够看懂程序。其中部分步骤甚至不是必须的可以省略。到目前我们只需要知道翻译的整体过程就好。
执行的过程
当程序编译好了之后就可以执行了。也许你使用了ide省去了下列步骤,但为了说明细节,这里这么表达。要让程序执行起来有这么几几个步骤:
- 打开shell终端
- 输入程序名
- 回车运行
- 显示结果
在第二步中,我们需要将程序名输入到一个shell终端的软件,这是一个解释程序的软件,输入了程序名它会认为这是一个可执行程序,然后告诉操作系统去寻找该程序并执行。随后便可在shell终端后看到执行的结果。这个过程中我们很容易想到可能用到了以下硬件:
- 硬盘:用于存储各种文件
- 主存储器(内存):用于存放计算机当下运行中所有临时数据
- 输入输出设备:用于输入文字和输出结果
- 处理器:用于执行程序
但这些好像还不够,是不是少了点什么?这些数据怎么在里面流通的呢?实际上,为了能够让数据在各个硬件中流通,还有一个叫做总线的硬件,它是贯穿整个计算机系统的一组电子管道。
那么hello程序的运行过程就很明显了:
-
输入程序名后,shell读入程序名将其存入内存中,这个过程数据流向是:输入设备 → 总线 → 处理器 → 总线 → 硬盘
-
回车了之后shell开始加载程序名所对应的程序,这个过程的数据流向是:硬盘 → 总线 → 内存
可能你会疑惑这里为什么就不用经过处理器呢?实际上这里用到了DMA技术,这个将会在后续说明
-
加载完成处理器就开始执行程序,这个过程的数据流向是:内存 → 总线 → 处理器 → 总线 → 输出设备
执行完成以上三个步骤之后,我们就可以在shell终端看到执行的结果Hello,World!了!
更进一步
然而实际上上面的步骤是为了理解,简化之后的整体步骤,实际的现代计算机的执行过程要比这复杂得多。我们不妨思考这样一个问题,这个程序运行过程中最麻烦的步骤是什么?计算机一直在将数据从一个地方搬到另一个地方,是不是非常的麻烦?没错,确实非常的麻烦,但这是无可避免的。就像在工厂的流水线中,要想将原材料生产出成品,必须要有一整套流水线,而其中每一个位置的职责都是固定的,流水线是可以改变的。而在此基础上我们可以想到如何让程序运行的更快一些,或者说如何让结果更高效的出来。还是刚才那个流水线的比喻。每一个位置的职责是固定的,而流水线是可以改变的。如果你是工厂主你会怎么做呢?聘用效率更高的工人让每一个位置上产出速度更快?还是改进生产流程让各个位置的工人更加高效的工作?当然两种方式都可以,让我们用这两个改进方法带入到原来的计算机问题上。也就是说,我们可以通过更换更强大的硬件让计算机执行更快,也可以改进其中数据流通的方式以加速计算机的执行。
例如:
- 使用高速缓存:计算机中不仅仅只有硬盘和主存储器,还有高速缓存,这种缓存有比主存储器更快的交换速度,用多级高速缓存可以加速数据的流入和流出。
- 资源管家(操作系统):想象一下一个没有人管理的系统会是怎样?显然中间会有许多不可避免地意外会发生,而此时有一个管理者会好得多,而操作系统就扮演了这样一个角色,它提供了许多的机制让硬件更高效的工作,例如并发,共享,虚拟,异步。
当然还有很多,远不止这些,这里只是给大家提供一个思考的过程,希望能带给读者一些帮助。

浙公网安备 33010602011771号