做为一个程序员,CPU的这些硬核知识你必须会!

CPU对每一个程序员来讲,是个既熟悉又陌生的东西?java

若是你只知道CPU是中央处理器的话,那可能对你并无什么用,那么做为程序员的咱们,必需要搞懂的就是CPU这家伙是如何运行的,尤为要搞懂它里面的寄存器是怎么一回事,由于这将让你从底层明白程序的运行机制。python

随我一块儿,来好好认识下CPU这货吧程序员

把CPU掰开来看

对于CPU来讲,咱们首先就要搞明白它是怎么回事,也就是它的内部构造,固然,CPU那么牛的一个东西,构造必定是极其复杂的,毕竟是超高科技玩意,因此啊,咱们今天说的组成什么的,都是指的主要的,对咱们程序员有用的,须要了解的那一部分,切莫抬杠哦web

首先嘞,我但愿你先记住这句话:算法

CPU所负责的就是解释和运行最终转换成机器语言的程序内容数据结构

另外啊,提及CPU,必定离不开内存,在今天的介绍中,也会简单的说说内存,由于后期也会单独出一篇讲解下内存,毕竟了解这些对咱们程序员来讲很重要的,因此CPU和内存常常在一块来说,他们实际上是有不少的晶体管组成的,通常称他们为IC,也就是集成电路的意思。并发

接下来咱们就来看看CPU的组成,注意我以前说的,这里说的组成通常是指的主要部分,毕竟CPU结构复杂。svg

咱们须要知道的CPU结构

重点须要关注寄存器工具

运算器

字面意思理解就是跟运算有关的,简单说就是负责运算从内存读取到寄存器中的数据,能够看做一个数据加工厂,就是对寄存器中的数据作运算,这些运算包含基本的算术和逻辑运算学习

而后对于运算器来讲,咱们要了解其中的几个重要角色,接下来我会挨个介绍:

算术逻辑单元(ALU)

这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和逻辑运算

累计寄存器(AC)

一般叫作累计器,是一个通用寄存器,这个有啥用呢?上面说的ALU,当ALU处理完算术运算或者逻辑运算以后,会获得一个结果,这个结果就会保存在AC中

数据缓冲寄存器(DR)

这个DR也是存放数据的,存放的主要是从内存读取过来的数据,会暂时存放在这个DR中,这里就至关于内存和CPU之间作数据传送的一个中转站,为啥会有这个,你们都是到CPU和内存的速度是有很大差异的,中间引入一个DR,必定程度上起到了速度上的缓冲做用,不至于速度相差太猛

状态条件寄存器(PSW)

这个貌似有点很差理解,首先寄存器仍是保存数据的,因此PSW天然也是保存某一类数据的,它保存的主要是由算术指令和逻辑指令运行或者测试的结果创建的各类条件码内容,通常分为状态标志和控制标志,知道就行

咱们须要了解以上的这几个组成部分,这都是运算器的核心,另外须要特别说一下的就是它们每个其实都有一个英文缩写,好比ALU就是算术逻辑单元的意思,为啥要说这个嘞,由于英文缩写毕竟简便并且有逼格,因此咱们通常交流的时候会说ALU而不是算术逻辑单元,所以,记住他们的缩写也很重要哦。

否则跟别人交流起来的话,别人一出口就是ALU,DR啥的,你很容易跟不上节奏啊。

对CPU中的运算器有个基本认识之后,咱们再来看看另一个重要组成 控制器

控制器

控制控制,也就是起到一个控制做用,上面介绍的运算器只是起到了运算的功能,可是控制器就比较牛,它是控制整个CPU的工做,对于控制器,通常要可以保证程序的正确执行以及可以处理异常事件

一样的,对于控制器来讲,咱们须要重点关注以下几个:

指令寄存器(IR)

寄存器是保存东西的,指令寄存器天然就是保存指令的,也就是说CPU要执行一条指令的话,须要先把指令从内存上读取,而后放到咱们上面说的数据缓冲寄存器中,以后再从DR放到IR中,接着嘞,会有一个叫作指令译码器的东西根据IR的内容生成不少的微操做指令,从而去控制其余部件已完成相应的功能

程序计数器(PC)

这个学过Java内存结构的应该了解,它保存着下一条要执行的指令,也就是说当一个程序要执行的时候,会把这个程序的起始地址存到这个PC中,若是这个指令被执行的话也不用担忧,CPU会自动修改,使得PC存放下一条要执行的指令

地址寄存器(AR)

这个就是保存着CPU访问内存上的那一块内存的内存地址,为啥要保存这个,由于CPU和内存速度相差比较大,因此CPU要保存着正在访问的那块内存的地址,直到内存的读写操做完成,否则,找不到以前访问的是哪一个内存单元了啊

指令译码器(ID

简单点就是对指令作分析的,看看你这个指令要干啥

不知道你有没有发现,咱们上面不管再介绍运算器仍是控制器的时候,都大量说起寄存器,这足以说明寄存器的重要性,不是有句话说其实CPU就是寄存器的集合体,不过在说寄存器以前,咱们仍是颇有必要先来简单的看看内存。

简单说下内存(之后会单独说)

CPU和内存老是分不开的,这里简单对内存坐下介绍,方便对CPU的理解,内存天然而然是存储部件,存储的是啥呢?通常来讲,就是数据和指令,并且咱们常说的内存指的就是电脑中的内存条,就是用来存储程序啊,数据啊,指令啊这些东西。

形象点说,其实内存能够看做一个个的小格子,每一个格子都是用来存储数据的,并且每一个格子还有编号,也就是内存地址,根据它可与拿到对应内存存储的数据,还须要知道的就是,若是断电的话,内存中的数据会被清除的。

CPU的大部分都是寄存器

上面说了CPU其实由运算器和控制器两大部分组成,其实不管是运算器仍是控制器,都离不开寄存器,能够说,CPU就是寄存器的天下,所以,对于CPU,必定要掌握好寄存器,CPU作的一些运算其实就是经过寄存器来实现的,能够看看这篇文章:一个程序在计算机中是怎么运行的?

先记住一句话:

咱们使用的Java,python这些都是高级语言,编写的程序最终会转成机器语言,以后就会进入CPU运算,实质就是经过CPU内部的寄存器来作相应的处理的

寄存器

这个是咱们须要掌握的,寄存器这玩意,不一样的CPU中含有的寄存器数量和种类都不一样,不过大致有以下几种寄存器,按照功能来分的

另外其实就能够把CPU理解为是寄存器的集合体,而后你须要知道程序计数器,累加寄存器,标志寄存器,指令寄存器和栈寄存器只有一个,其余的寄存器通常会有多个。

说说这个程序计数器

为啥要说这个,由于这玩意决定着程序的执行流程,咱们进一步来看看

好比看这个,这个表示的是两个数相加的操做,关于这个操做涉及到的数据和指令都保存在了内存中,并且每一个数据和指令所在的内存单元都是有编号的,也就是内存地址,就是图中0100,0101那些,自上而下就是该操做的执行顺序。

上面也提到过,程序计数器是保存程序执行的指令的,准确说保存的是程序执行指令的地址值,怎么理解呢?也就是说程序的每一步操做,底层来讲都是有一系列指令对应着的,这些指令就是代表这一步该怎么操做,好比a+b这个操做,加载进内存后就是对应着一系列的指令。

首先就是一个指令,代表要把a这个数值作相加操做,须要先把a保存到累加寄存器,而这个指令被保存在内存中的一个内存单元中,这个内存地址好比说就是0100,而此时程序计数器就是保存的这个0100内存地址,要执行程序的时候,CPU去看看程序计数器保存的第一个地址,发现是0100,而后去内存这个0100的位置,看看保存的是啥,一看是一个指令,分析指令,原来是要把0105地址中的值保存到累加寄存器中,而后就开始干活……

因此说啊,程序计数器其实我是决定管理程序的执行流程的

CPU是如何作比较的

这个也须要了解一下,CPU的比较其实就是再内部作减法运算,什么意思呢?好比要比较a和b,就是再内部作一个a-b的操做,而后依据获得的结果来对a和b作比较,这里面确定是要借助寄存器来完成,好比获得的结果就会放到标志寄存器中。

CPU作的事其实很简单

咱们在以前的文章说过,CPU其实主要就是干以下的四件事情

  1. 从内存中读取数据,而后放到寄存器中
  2. 把寄存器中的数据写入到内存
  3. 进行数学运算和逻辑运算(加减乘除,AND,OR)
  4. 依据相应的条件进行跳转,执行其余指令(一条指令跳转到另一条指令)

咱们知道,CPU是依据指令作事情的,为何CPU只作上面的四件事情,主要就是看CPU 能执行的机器语言指令有哪些,主要就是以下这些

这么一看,CPU能干的事也没有那么复杂啊。

CPU指令执行过程

通过上面的讲解,咱们应该知道CPU就是看指令作事情的,那么关于指令,CPU又是怎么操做的呢? 咱们要知道的是几乎全部的冯·诺伊曼型计算机的CPU,其工做均可以分为5个步骤:取指令、指令译码、执行指令、访问取数、结果写回。

可能你不懂了,没啥,其实不就是这五个步骤嘛,搞清楚他们不就ok,接下来我们来看看:

第一:取指令

字面意思很好理解啊,不就是拿到须要的指令嘛,那么指令在哪嘞,必须是在内存啊,也就是须要从内存中取出咱们须要的指令,而后干吗,不就是把指令放到CPU中的寄存器嘛,这个取指令就是这么一个过程。

第二:指令译码

这个是否是很快想到咱们上面说的指令译码器,这个不就是对上一步拿到的指令作分析嘛,干吗要分析,我得看看你这个指令到底要干啥啊,否则CPU怎么干活嘞

第三:执行指令

这个不就更好理解了,就是开始干活啦,实现相应的功能了

第四:访问取数

直观上好像没有那么好理解,其实啊,说的就是,咱们根据上面的操做,有可能须要从内存中去拿数据,啥意思嘞,要知道,内存存放的是数据和指令,好比执行a+b的操做,咱们获得相加的指令,对于a和b都是操做数,它们也是存放在内存中的,是否是也须要去内存中去拿到它们

看上面那个图,0100对应的指令是否是要去0105对应的地址中去拿数据123,这不就是访问取数嘛。

第五:结果写回

这又是啥,通过上面那么些个步骤,作的运算确定得有结果啊,这结果咋弄,你不得保存在哪啊,一般是保存在CPU内部的寄存器中,通常是标志寄存器,这不是就是结果写回嘛

好啦,到这里,关于CPU的知识我们就介绍的差很少了,固然,CPU的知识远远不止如此,可是做为程序员的你,最起码也得知道这些啊。

感谢阅读

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

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

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

在这里插入图片描述