计算机是用来跑程序的,因此理解了程序的运行对学习计算机有很大的好处,在这里我对程序的运行做一个简要的总结。
如下是计算机的总体构造,cpu、内存、硬盘直接通过总线连接在一起,以此来传输数据和控制性。这里省略掉了cpu的内部寄存器,后面会详细说明。
我们的程序一开始是以存储在硬盘的文件里的,如果我这个时候通过命令行说要运行一段程序的话,硬盘里的程序会被搬运到内存里,同时也把字符串里的数据也搬过去,以一个简单的hello_world.c为例,数据就是"hello,word!"这个要打印的字符串。
紧接着,就是程序的运行过程了,这个过程是由cpu和内存配合完成的,我们已经知道,目前程序和数据目前已经保存在内存里了,因此cpu要干的事情就是按照内存里的代码指令执行运行。我们要指出的是,这是内存里的代码是机器语言(或者汇编语言,机器语言和汇编语言有着一一对应的关系),而不是C语言这样的高级语言。要理解cpu怎么工作的,需要再画几幅图。
下图是内存的存储结构,从硬盘拷贝过来的程序和数据被存放在了最下面,他们的地址最小。
再上面是运行时堆,这个地方我理解为当新建对象时,给对象的存储区域,它是往上生长的。
其他一切内存区域暂时不管,我们看最顶部,他们叫做函数堆栈,也叫函数帧,这些空间是在程序运行时动态分配的,并且往下生长,一个接着一个叠在一起。要搞清楚程序是如何运行的,就有必要搞清楚函数堆栈是如何生长和释放的。