一个程序在计算机中是如何运行的?超级干货!!!

强烈声明:本文很干,请自备茶水!😎java

开门见山,咱不说废话!web

你有没有想过,你写的程序,是如何在计算机中运行的吗?好比咱们搞Java的,确定写过这段代码算法

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World!"); 
    }
}

熟悉吧,可能你们都知道,运行输出“Hello World!”,不过嘞,今天我带你从内存和CPU的角度去剖析一下这段代码在计算机中是如何执行的。编程

Hello World保存在哪?

首先问你个很简单的问题,当你写下这段代码的时候,你把它保存在哪了,假如说你说是桌面,就像如今这样数据结构

是的,一个HelloWorld.java文件就保存在了桌面上,这个叫作Java源文件,不过说是保存在桌面上这个有点模糊,这个桌面又是个啥呢,咱们应该想象它保存在了咱们电脑的哪一个部分呢?一台计算机包含以下基本五个部分:并发

  1. 运算器
  2. 控制器
  3. 存储器
  4. 输入设备
  5. 输出设备

在计算机中啊,保存信息主要靠存储器,而存储器又分为内部存储器和外部存储器,内部存储器就是内存了,而这个外部存储器主要就是磁盘了,磁盘又分为硬盘和软盘,而咱们电脑中的大部分就都是硬盘了,这里也分为固态硬盘和传统机械硬盘。svg

无论怎么说吧,磁盘也好内存也罢,就是用来存放数据的,那么咱们就知道了咱们写的这个Java源文件应该就是存放在电脑中的磁盘了。工具

那么代码保存到硬盘中以后呢?学习

今天的主角,CPU和内存

代码被保存到硬盘以后,接下来就要CPU和内存登场了,提起精神了,超级干货来了。网站

告诉你个秘密,理解CPU和内存是如何在一块工做的,是每一个学编程必备的基础中的基础,反正就是很重要!

咱们在上面提到了硬盘,这里又说到了CPU和内存,那么咱们就来看看这三个家伙

硬盘,内存和CPU

先看一张图

这张图大体描述了三者的一个关系,什么关系嘞,数据读取的关系,咱们以前不是说咱们写的代码保存到了硬盘中了吗,若是要执行这段代码的话,须要把这段代码从硬盘中读取到内存中,此时的代码已经变成了二进制文件存储在内存中,为了更好的去理解,咱们把上面的代码再进一步改写下:

public class HelloWorld {
    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        sum = a + b;
        System.out.println(sum); 
    }
}

也就是加入了一个基础的加法运算,此时这段代码已经变成二进制文件放到了内存中,如今要继续执行,也就是要执行代码的加法操做,此时的数据a和b,也就是5和3已是二进制的形式在内存中,如今须要把a和b作加法运算,CPU收到这个指令(将a和b相加),就会去内存中将a和b读取,而后存放到本身的寄存器中,而后由CPU中的运算器去作加法运算,获得的结果依然放到寄存器中。

是否是有点懵?啥是寄存器?运算器呢?别急,咱们继续往下看。

内存是个啥?

这个内存是啥呢?内存条知道吧,咱们电脑中的内存条,它是属于内部存储器,主要就是用来存放数据的,也能够理解为咱们这里说的内存,这是实际存在的,咱们能够看得见的内存条,可是关于数据存储,怎么存储,是否是还有点模糊,那么咱们抽象点来讲,这个内存其实就是一个个的小格子,就像这样:

这些小格子就是用来存放数据和指令的,并且每一个格子都有本身的编号,这个编号你们也熟悉,就是咱们常常说的内存地址。

另外你须要知道的是,计算机是只认识0和1的,因此存放在内存中的数据其实都是二进制文件了。

CPU是个重点

其实关于内存,先了解上面那些就足够了,内容比较多的就是CPU了,想必你们都据说过CPU就至关于人的大脑同样,对电脑来讲,相当重要,因此啊,CPU的结构是真的复杂,怎么办?

通常碰到这样的,咱们就须要有选择的进行掌握和学习,所以对于CPU,你必须了解的两个东西,一是寄存器,另一个就是运算器,为啥,这又是啥?

想要搞明白这个问题,我们须要先来看看以下这些知识点。

CPU的特色

首先,这家伙是真的复杂,除此以外嘞,你还须要知道对于CPU来讲,必需要把数据读取到寄存器中才能作相应的运算,另外CPU的数据读写的速度是真的快,内存和硬盘根本无法比,可能你没啥概念,举个例子吧

CPU这家伙执行一条指令大约须要耗时1ns,可是对于内存呢?它去硬盘读取数据至少8ms,在这段时间内,CPU能够执行大约800万条指令,说这个,主要是为了让你直观的感觉到CPU是真的快。

就像《码农翻身》一书中说的那样:

CPU的运算速度快的丧心病狂,可是它能作的事情简单的使人发指

啥?为啥作的事情简单的使人发指呢?

别看CPU那么牛,那么复杂,那么快,它作的事情真的挺无聊的,总结起来,CPU主要就干以下四件事情:

一、从内存中读取数据,而后放到寄存器中

二、把寄存器中的数据写入到内存

三、进行数学运算和逻辑运算(加减乘除,AND,OR)

四、依据相应的条件进行跳转,执行其余指令(一条指令跳转到另一条指令)

不知道你发现没,咱们彷佛一直在提寄存器,这又是什么玩意?这就要看看CPU的构造了

CPU的重点组成部分

咱们上面也说了,CPU的结构真的很复杂,可是咱们须要重点关注以下几个重要组成部分:

  1. 寄存器
  2. 运算器

没错就是这俩货,那他们是干啥的嘞,首先你得知道他们是CPU中的东西,这个寄存器啊,说白了就是存放数据的,是个存储部件,还记得以前说内存就是一个个的小格子吗?这个寄存器你就能够简单的想成也是小格子,放数据的。

寄存器

寄存器是存储部件,容量很是有限,能存储的数据的大小,如今来讲通常有两种,也就是咱们常据说的32位和64位,32位的寄存器就能存储4个字节的数据,64位的寄存器就能存储8个字节的数据,另外CPU也分为32位和64位其实就是由其中的寄存器的位数决定的,可想而知,即便是64位的寄存器也干不了啥大事啊,因此啊,如今的CPU通常都内置了不少的寄存器,依此来完成比较复杂的操做

运算器

另一个就是运算器了,这个是计算的核心,主要的做用就是用来作加减乘除这些运算的,不过嘞,这里你须要知道的一点就是,运算器是无法直接操做内存中的数据的,很容易想到,运算器操做的数据是寄存器中存放的数据。

CPU和内存的交互

简单的了解了内存和CPU以后,咱们就能够来看看程序代码是如何进一步被执行的,上面提到了,程序代码被读取到内存中了,如今要执行这段代码,那就须要CPU出马了,首先嘞,CPU会去读取须要进行操做的数据,对了,继续看这代码:

public class HelloWorld {
    public static void main(String[] args) {
        int a = 5;
        int b = 3;
        sum = a + b;
        System.out.println(sum); 
    }
}

也就是须要读取数据a和b,那么读取到的数据a和b存放在哪了呢?根据咱们上面对CPU简单的了解可知,数据a和b是被放到了CPU中的寄存器中了,看这个图

在CPU中有两个比较重要的组件就是运算器和寄存器,寄存器有不少个,再看内存,是一个个的小格子,每一个格子有编号,好比说如今数据a和b分别存放在#1和#2上,而后CPU将他们读取放在寄存器R1和R2上

这个时候就要计算a和b的和了,而后就轮到运算器出马了,它会拿到寄存器R1和R2,也就是拿到数据a和b,而后作加法运算

那么计算以后的结果也就是sum,运算器会再次把它放到寄存器,好比R1中,这个时候以前的数据b就会被覆盖,如此一来,CPU和内存就一块儿完成一次加法运算操做。

这里其实咱们把关注点聚焦到了加法运算操做,实际上,程序代码被装载近内存的时候会产生数据和指令两部分,数据咱们都知道是啥,指令嘞?

其实也好理解,指令就是说明程序该怎么执行,对于CPU来讲就是告诉CPU该作什么,好比告诉CPU,读取数据a和b,而后再将他们相加,说白了,CPU是根据指令干活,指令让怎么干,咱就怎么干。

所以,你必须告诉CPU该干啥,不然,CPU也很懵的呦。

通过上面的简单介绍,咱们再来看看CPU主要作的四件事情:

一、从内存中读取数据,而后放到寄存器中

二、把寄存器中的数据写入到内存

三、进行数学运算和逻辑运算(加减乘除,AND,OR)

四、依据相应的条件进行跳转,执行其余指令(一条指令跳转到另一条指令)

怎么样,是否是更加清晰明了!

总结一哈

这么一看,也没啥难的吗?总的来讲啊,就是咱们写的程序是放在硬盘中的,在运行的时候才会被调入到内存中,也就是说内存中的数据是从硬盘来的,而CPU中寄存器的数据又是从内存中装载进来的,而后CPU会根据相应的指令去操做寄存器中的数据,好比加减乘除什么的,以此来完成一个程序在计算机中的运行。

一句话总结:

自己程序是在硬盘上,须要把程序加载进内存,而后由CPU去执行

另外对于内存啊,CPU什么呢还有不少有趣有用的知识,咱们下次再讲!

感谢阅读

你们好,我是ithuangqing,一路走来积累了很多的学习经验和方法,并且收集了大量的精品学习资源,如今维护了一个公众号【编码以外】,寓意就是在编码以外也要不停的学习,主要分享java技术相关的原创文章,如今主要在写数据结构与算法,计算机基础,线程和并发以及虚拟机这块的原创,另外针对小白还在连载一套《小白的java自学课》,力求通俗易懂,由浅入深。同时我也是个工具控,常常分享一些高效率的黑科技工具及网站

对了,公众号还分享了不少个人学习心得,能够一块儿探讨探讨!

关注公众号,后台回复“庆哥”,2019最新java自学资源立马送上!更多原创精彩尽在【编码以外】

在这里插入图片描述

感谢各位大大的阅读🥰