【注】本文首发微信公众号:最高权限比特
大家都知道,操作系统、计算机组成原理、数据结构与算法、计算机网络、被称作计算机四大基础课。不但是计算机专业考研的四门专业课,而且是每一个程序员必须掌握的内容。其实大家能够看到,为什么绝大多数企业都不想招培训班出来的“程序员”,其中有一个非常重要的原因就是他们的计算机基础知识过于薄弱,也就是上面说到的四门课程。 最近发现,研究计算机组成原理其实是非常有意思的一件事情。为什么这样说呢?不知道你有没有想过,当你写完一个程序之后(以c语言程序为例子),源代码通过编译器编译成汇编语言,然后汇编语言再通过解释,成为机器语言,经过黑盒子(你不知道的方式),得到你想要的结果。你只是看到了程序输出的最终结果,却不知道为什么能够得到你想要的最终结果,对吧。 那么,你有没有想过,一个程序究竟是如何跑起来的呢,究竟在计算机的最底层经过了怎样的执行过程呢?这就是我的这篇博文想要展示给大家的。
概述
我们知道,计算机是由软件和硬件共同组成的。没有硬件,软件就没有用武之地;没有软件,硬件就只能是一堆废铁。 而软件又分为两类:
- 系统软件
- 应用软件
其实这是从宏观上的封装和层次划分,对相关的内容没有了解的开发者理解起来可能会有些难度,不过这不是我们今天的重点。 我尝试着从程序员的视角来给大家分析一下,一个程序的完整运行过程。
计算机如何才能执行程序?
还是接着从序言的部分说起。 我们所用的语言,不论是C语言、Java还是其他的什么语言,都是属于高级语言。而高级语言编写的程序,计算机肯定是不能直接执行的,因为计算机只能识别0和1。为了能够让计算机执行高级语言编写的程序,需要经过下面的这些步骤:
- 只有机器语言计算机才能够识别并执行
- 相同的汇编语言程序在不同指令集平台下生成的机器语言是不同的
- 机器语言就是微指令
- 微指令系统的作用就是指挥计算机的各部分工作
好了,只有知道了这些内容,我们才能进行后续的东西。
现代计算机的结构
刚才说了,微指令系统是指导计算机硬件运行的。那么,这些计算机硬件都包括什么呢? 众所周知,现代计算机是在冯若依曼体系计算机的基础之上发展起来的,在开始我们的讲述之前,了解下冯若依曼计算机的结构还是很有必要的。
- 运算器:进行算数逻辑运算
- 存储器:存放数据以及程序
- 控制器:控制程序、数据、运算处理结果
- 输入设备:将指令转换成机器可识别的机器语言
- 输出设备:将指令转换成人可以识别的内容
可以看到,冯诺依曼结构的计算机是以运算器为核心的,而现在的计算机则是以存储器为核心的。这其中的原因暂不表述,有兴趣的可以查阅相关资料。 虽然现代计算机是以存储器为中心的,但是还是基于冯若依曼体系的。冯若依曼体系计算机的特点现代计算机都有。 现代计算机的结构是这样的:(纯手画,略丑,见谅)
计算机的工作过程
我们上面看到了现代计算机的体系结构:存储器、算数逻辑(运算器)、控制单元(控制器),当然还有IO设备。 现在,我们知道了微指令(机器语言)就是在这些部件之中游走,完成程序的操作,但是具体是如何游走的,或者说微指令系统是如何执行机器语言的,我们仍然不知道。 就我们目前掌握的内容来看,只能了解到这个层次了,若要是想再进一步,我们对更底层的东西还是要再进行分解。
存储器
下图是存储器的基本结构:
运算器
控制器
控制器的作用:解释指令,保证指令有序执行。 控制器的结构如下:
主机完成指令的过程
好了,终于走到了最后一部分。 在前面的几个过程中,你了解到了现代计算机的每一个部件的组成以及具体功能,在知道了这些内容后,下面的东西理解起来是会很简单的。在最后的这一部分,我会举出两个具体的例子,让你知道程序代码最终形成的机器语言究竟是如何运行的。
取数指令
描述:简单的讲,就是把一个数取出,存到ACC(一般加法操作时,ACC就是作为被加数)中的具体过程。先来看下面的这张图,最好结合着我下面的介绍看。
- 1.程序计数器+1,开始指向下一个地址。
- 2.存储器地址寄存器中存放着下一个地址,根据这个地址(地址寄存器的名字来历),指向存储体中的指令数据。
- 3.从存储体得到数据,存入数据寄存器(数据寄存器的名字就是这么来的)
- 4.得到指令,格式为指令码+操作码(当前操作就是:取数操作-地址),指令写入IR指令寄存器中。
- 5.指令寄存器询问CU控制单元当前是何种操作,得到取指令操作的回复
- 6.指令中的数据地址存入地址寄存器
- 7.通过地址寄存器得到存储体中当前地址存储的数据
- 8.得到的数据存入数据寄存器中
- 9.数据寄存器中的数据写入ACC,完成整个操作
- 10.PC程序计数器+1,开始新一轮的判断。
有了这个,相信你已经对整个操作过程有了很深刻的理解,下面我们再来一个例子,加深理解。
ax^2+bx+c程序运行过程(程序代码已经成为了机器语言)
- 1.程序由IO设备送至计算机
- 2.PC+1,得到程序首地址
- 3.程序开始启动
- 4.取数指令:PC-->MAR-->存储体-->MDR-->IR(指令寄存器)
- 5.分析指令:取出指令寄存器中的操作码,送入CU控制单元进行分析,得到指令意义
- 6.执行指令:取出IR中的地址码-->MAR--->存储体-->MDR-->ACC
- 7.PC+1=PC,得到新的地址
- 8.取数指令:PC-->MAR-->存储体-->MDR-->IR(指令寄存器)
- 9.分析指令:取出指令寄存器中的操作码,送入CU控制单元进行分析,得到指令意义
- 10.执行指令:取出IR中的地址码-->MAR--->存储体-->MDR-->X
- ……
- 最终出现结果
- 程序执行完毕
好了,进行到这里,我们的漫谈计算机组成原理的第一篇文章就算是结束了。如果大家发现我的博客存在问题,或者大家有什么疑问的地方,欢迎私信我,欢迎志同道合的伙伴联系我!
邮箱:roobtyan@outlook.com
微信公众号:最高权限比特流