一个hello程序的运行过程

    首先我们来看一下我们计算机大概的硬件结构,图中可能会屏蔽大量的实现细节,或者很多寄存器没有给出来,我们这里主要是为了总体的建立一个大概模型和印象,所以就只抓了主干,省去了一些细节,下面我们上图
    我们可以看到我们的计算机底层硬件主要分为了cpu、主存、I/O以及磁盘。

    假设我们现在硬盘上有一个hello的可执行文件,那它的运行要在这些硬件上经历一些什么呢?
    
         我们可以看到我们会通过键盘这个I/O设备输入一个hello按下换行之后,bash(假设我们使用的是bash)就会在自己的bin下查找是否有这个命令,bash执行命令的过程可以参见我的另一篇博客 点击打开链接。没有的话它会认为我们是要加载这个可执行文件到主存中。当然这个过程还涉及到了标准输入输出文件的问题,我们的shell在打开的时候,就会默认打开三个文件按,标准输入文件,这个通常会对应我们的键盘,还有标准输出和错误输出文件,这个通常对应我们的显示屏,不过也也可以通过重定向的方式进行更改,这里我们呢就不进行讨论了,详情可以参考 点击打开链接。好了,我们shell把hello这个文件加载到主存之后,会将main函数中的指令通过存储总线I/O桥,再通过系统总线以及PC寄存器和各种寄存器帮助下传到我们ALU进行命令的执行,然后将我们的hello字符串从主存复制到显示器上。
               所以总的来说我们的指令经过了从磁盘复制到主存,再从主存复制到处理器的过程,而数据则是从磁盘复制到主存,再从主存复制到显示器上。
                我们可以看到从数据的读取到,到输出的过程,从磁盘到处理器的过程,有一条漫长的路要走,而且外设和cpu又有速度上的差异,外设数据到达的速度通常是跟不上cpu的处理速度的,所以通常,我们为了解决数据处理速度不匹配的问题,会采用高速缓存解决。我们可以看下图
高速缓存就是利用局部性原理,将我们目前执行的指令周围的数据和指令加载到高速缓存上,我记得看一本书的时候,一个不记得名的大师说过,任何计算机的问题都可以通过中间层解决,而这里我们的高速缓存就起到了这个中间层的作用。

猜你喜欢

转载自blog.csdn.net/betty2017/article/details/80150681
今日推荐