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

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

如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。

随我一起,来好好认识下CPU这货吧

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

首先嘞,我希望你先记住这句话:

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

另外啊,说起CPU,一定离不开内存,在今天的介绍中,也会简单的说说内存,因为后期也会单独出一篇讲解下内存,毕竟了解这些对我们程序员来说很重要的,所以CPU和内存经常在一块来讲,他们其实是有很多的晶体管组成的,一般称他们为IC,也就是集成电路的意思。

接下来我们就来看看CPU的组成,注意我之前说的,这里说的组成一般是指的主要部分,毕竟CPU结构复杂。

我们需要知道的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其实主要就是干如下的四件事情

从内存中读取数据,然后放到寄存器中
把寄存器中的数据写入到内存
进行数学运算和逻辑运算(加减乘除,AND,OR)
依据相应的条件进行跳转,执行其他指令(一条指令跳转到另外一条指令)
我们知道,CPU是依据指令做事情的,为什么CPU只做上面的四件事情,主要就是看CPU 能执行的机器语言指令有哪些,主要就是如下这些

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

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

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

第一:取指令

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

第二:指令译码

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

第三:执行指令

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

第四:访问取数

直观上好像没有那么好理解,其实啊,说的就是,我们根据上面的操作,有可能需要从内存中去拿数据,啥意思嘞,要知道,内存存放的是数据和指令,比如执行a+b的操作,我们得到相加的指令,对于a和b都是操作数,它们也是存放在内存中的,是不是也需要去内存中去拿到它们 郑州男科医院哪家好:http://www.zztongjiyiyuan.com/郑州那里看男科医院专业:http://www.zztongjiyiyuan.com/郑州同济男科医院:http://www.zztongjiyiyuan.com/

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

第五:结果写回

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

好啦,到这里,关于CPU的知识咱们就介绍的差不多了,当然,CPU的知识远远不止如此,但是作为程序员的你,最起码也得知道这些啊。

感谢阅读
大学的时候选择了自学Java,工作了发现吃了计算机基础不好的亏,学历不行这是没办法的事,只能后天弥补,于是在编码之外开启了自己的逆袭之路,不断的学习Java核心知识,深入的研习计算机基础知识,所有心得全部书写成文,整理成有目录的PDF,持续原创,PDF在公众号持续更新,如果你也不甘平庸,那就与我一起在编码之外,不断成长吧!

其实这里不仅有技术,更有那些技术之外的东西,比如,如何做一个精致的程序员,而不是“屌丝”,程序员本身就是高贵的一种存在啊,难道不是吗?

非常欢迎你的加入,未来的日子,编码之外,有你有我,一起做一个人不傻,钱很多,活得久的快乐的程序员吧!

原文地址:https://www.cnblogs.com/sushine1/p/12642798.html

时间: 2024-08-10 14:58:16

作为一个程序员,CPU的这些硬核知识你必须会!的相关文章

[转帖]程序员需要了解的硬核知识之磁盘

https://www.cnblogs.com/cxuanBlog/p/11776310.html 此篇文章是 <程序员需要了解的硬核知识>系列第四篇,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 我们大家知道,计算机的五大基础部件是 存储器.控制器.运算器.输入和输出设备,其中从存储功能的角度来看,可以把存储器分为内存和 磁盘,内存我们上面的文章已经介绍过了,那么此篇文章我们来介绍一下磁盘以及内存和磁盘的关系. 认识磁盘 首

程序员需要了解的硬核知识之压缩算法

此篇文章是<程序员需要了解的硬核知识>第五篇文章,历史文章请戳 程序员需要了解的硬核知识之内存 程序员需要了解的硬核知识之CPU 程序员需要了解的硬核知识之二进制 程序员需要了解的硬核知识之磁盘 之前的文章更多的介绍了计算机的硬件知识,会有一些难度,本篇文章的门槛会低一些,一起来看一下计算机中都有哪些压缩算法 认识压缩算法 我们想必都有过压缩和 解压缩文件的经历,当文件太大时,我们会使用文件压缩来降低文件的占用空间.比如微信上传文件的限制是100 MB,我这里有个文件夹无法上传,但是我解压完成

程序员不得不了解的硬核知识大全

我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以为框架就是一切,以为应用层才是最重要的,你错了.在当今计算机行业中,会应用是基本素质,如果你懂其原理才能让你在行业中走的更远,而计算机基础知识又是重中之重.下面,跟随我的脚步,为你介绍一下计算机底层知识. CPU 还不了解 CPU 吗?现在就带你了解一下 CPU 是什么 CPU 的全称是 Central Processing Unit,它是你的电脑中最硬核的组件,这种说法一点不为过.CPU 是能够让你的计算机叫计算机的核

程序员需要了解的硬核知识之内存

我们都知道,计算机是处理数据的设备,而数据的主要存储位置就是磁盘和内存,并且对于程序员来讲,CPU 和内存是我们必须了解的两个物理结构,它是你通向高阶程序员很重要的桥梁,那么本篇文章我们就来介绍一下基本的内存知识. 什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁.计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为主存,其作用是存放 CPU 中的运算数据,以及与硬盘等外部存储设备交换的数据.只要计算机在运行中,CPU 就

[转帖]程序员需要了解的硬核知识之内存

https://www.cnblogs.com/cxuanBlog/p/11751609.html 我们都知道,计算机是处理数据的设备,而数据的主要存储位置就是磁盘和内存,并且对于程序员来讲,CPU 和内存是我们必须了解的两个物理结构,它是你通向高阶程序员很重要的桥梁,那么本篇文章我们就来介绍一下基本的内存知识. 什么是内存 内存(Memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁.计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为主存,其

每一个程序员都必须阅读的10篇文章

原文:10 Atricle Every Programmer Must Read by Javin Paul 作为一名Java程序员和软件开发者,我已经从那些名为<关于XXX,每个程序员都应了解的>的文章中学了很多东西,这些文章倾向于提供许多关于某一个特定主题的实用的.有深度.难以发掘的信息.在我的学习过程中,我读到了不少非常有用的文章,我会收藏这些文章以便日后参考和再次阅读.我个人认为所有程序员可以从这些文章中获益,这也是促使我发帖,并与你们分享这些<关于XXX,每个程序员都应了解的&

(小说)那些年,那些事——一个程序员的奋斗史

转自:http://blog.csdn.net/x283930450/article/details/9072223 第01章    段伏枥,一个瘦小,矮小,根本和“帅”这个字粘不上任何关系的普通人 .名字的来源在于其多读了几年书的老爹,总抱着有一天要出书出名乃至于名流千古的 美好理想,但可惜现实总是给予他无情的而又现实的打击,于是就将理想寄望于自己的 儿子,起了个“伏枥”的名,寓意为“老骥伏枥,志在千里”,表达自己不到黄河不死 心的良好的愿望.     只可惜段伏枥这家伙完美地遗传了来自于老爹

论一个程序员的自我修养

在<喜剧之王>中,周星驰扮演的尹天仇,一直梦想成为一名演员,而他不管是在扮演跑龙套,或者在街坊中开设演员训练班,亦或成为主角时,他对待演员的态度,始终是认真,热爱而又投入的.而那一本他随身携带的书--<演员的自我修养>,尽管不知道里面具体写的是什么,但我猜,他对待演员的态度和行为,就是书中内容显示的. 于是,不禁问了问自己,作为一名程序员,一个“程序员的自我修养”是什么? 尽管我们不一定要像尹天仇那么的认真对待自己的事业,但,一些基本的修养,作为一名新时代的码农,总应该是要具备的吧

[心情琐记]-为什么我选择做一个程序员?【谨以此文献给初入技术之路的纯白少年】

前言:此文又臭又长,废话连篇.某段言论激进,但绝无偏见.兄弟伙伴们看过且一笑置之. 人总是会变得,人也是最善变的动物.而我们要坚定的去努力不变成曾经厌恶的人! 那些年我们书生意气,伴着朗朗的读书声.'"大江东去浪淘尽,千古风流人物...","...惜秦皇汉武,略输文采,唐宗宋祖,稍逊风骚...",仿佛自己便是那些指点江山,激昂文字的主人公了,那些年我们是一群天真烂漫的纯白少年. 此去经年,应是良辰好景虚设,便纵有千种风情更与何人说?每当临近了六月,空气中弥漫的都是这