一个程序在计算机中是如何运行的
首先看一段代码:
public class demo {
public static void main(String[] args) {
System.out.println("小朋友,你是否有很多问号?");
}
}
demo保存在哪?
如下图可见:这个java源文件保存在我本地的E盘,那它又是保存在电脑的什么部分呢?
计算机的五个基本组成部分:
运算器:运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理
控制器:是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等
存储器:存储器的功能是存储程序、数据和各种信号、命令等信息,并在需要时提供这些信息
输入设备:输入设备是计算机的重要组成部分,输入设备与输出设备合你为外部设备
输出设备:输出设备与输入设备同样是计算机的重要组成部分,它把外算机的中间结果或最后结果、机内的各种数据符号及文字或各种控制信号等信息输出出来
在计算机中,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存了,而这个外部存储器主要就是磁盘了,我们写的这个Java源文件就是存放在电脑中的磁盘了。
那么代码保存到磁盘中之后呢?代码被保存到磁盘之后,接下来就要CPU和内存登场。
CPU和内存
先来看看硬盘、CPU和内存的关系:
在CPU内部设置一个缓存,可以将使用频繁的数据暂时读取到缓存,需要同一地址上的数据时,就不用大老远地再去访问内存,直接从缓存中读取即可。
从这张图可以看出,它们之间数据读取的关系,代码保存到了硬盘中,如果要执行这段代码的话,需要把这段代码从硬盘中读取到内存中,此时的代码已经变成了二进制文件存储在内存中,为了更好的去理解,我们把上面的代码再进一步改写下:
public class demo {
public static void main(String[] args) {
int a = 1;
int b = 2;
sum = a + b;
System.out.println(sum);
}
}
也就是加入了一个基础的加法运算,此时这段代码已经变成二进制文件放到了内存中,现在要继续执行,也就是要执行代码的加法操作,此时的数据a和b,也就是1和2已经是二进制的形式在内存中,现在需要把a和b做加法运算,CPU收到这个指令(将a和b相加),就会去内存中将a和b读取,然后存放到自己的寄存器中,然后由CPU中的运算器去做加法运算,得到的结果依然放到寄存器中。
内存:内存条知道吧,我们电脑中的内存条,它是属于内部存储器,主要就是用来存放数据的,也可以理解为我们这里说的内存,这是实际存在的,我们可以看得见的内存条,但是关于数据存储,怎么存储,是不是还有点模糊,那么我们抽象点来说,这个内存其实就是一个个的小格子,就像这样:
这些小格子就是用来存放数据和指令的,而且每个格子都有自己的编号,这个编号大家也熟悉,就是我们经常说的内存地址。
CPU主要功能:
从内存中读取数据,然后放到寄存器中
把寄存器中的数据写入到内存
进行数学运算和逻辑运算(加减乘除,AND,OR)
依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)
CPU的重点组成部分
寄存器:存储部件,容量非常有限,主要用来存放数据
运算器:是计算的核心,操作寄存器中存放的数据
CPU和内存的交互
根据上面的代码,取数据a和b,那么读取到的数据a和b是被放到了CPU中的寄存器中了,在CPU中有两个比较重要的组件就是运算器和寄存器,寄存器有很多个,再看内存,是一个个的小格子,每个格子有编号,比如说现在数据a和b分别存放在#1和#2上,然后CPU将他们读取放在寄存器R1和R2上
计算a和b的和了,然后就轮到运算器出马了,它会拿到寄存器R1和R2,也就是拿到数据a和b,然后做加法运算
那么计算之后的结果也就是sum,运算器会再次把它放到寄存器,比如R1中,这个时候之前的数据b就会被覆盖,如此一来,CPU和内存就一起完成一次加法运算操作。
总结
总的来说,就是我们写的程序是放在硬盘中的,在运行的时候才会被调入到内存中,也就是说内存中的数据是从硬盘来的,而CPU中寄存器的数据又是从内存中装载进来的,然后CPU会根据相应的指令去操作寄存器中的数据,比如加减乘除什么的,以此来完成一个程序在计算机中的运行。