计算机组成原理的学习day01

一 计算机系统层次结构

1 计算机硬件的基本组成

好的,上个小节中我们了解了计算机系统的概念,还有计算机的一个发展历程,那这个小节中我们会着重的探讨计算机硬件的一个基本组成。我们需要掌握这样的两种结构,第一种是早期的冯诺依曼结构,另一种是现代计算机所普遍采用的结构,其实也是冯诺依曼结构的一个优化。 

1.1问题1:好,那首先来看一下什么是冯诺依曼结构的计算机,

还记不记得上个小节中我们说过世界上第一台计算机是ENIAC?当时冯诺依曼就是这台计算机设计的一个顾问。那这台计算机一个很大的缺点就是每一步的计算需要执行什么指令都需要这些程序员,操作员们通过手动连接这些线缆的方式来告诉计算机,

所以虽然这台计算机它执行运算的速度很快,但是由于这些程序员们每一次都需要手动的接线,来告诉他下一步应该怎么做?因此,ENICA的计算速度就被手工操作的所需要的这个耗时给抵消了,所以为了解决这个问题,冯诺依曼这个天才,他第一次提出了存储程序的概念。所谓存储程序,就是指可以把我们需要执行的一系列指令以二进制编码的方式,提前把它输入到计算机的主存储器当中,也就是我们熟悉的内存里边。然后计算机会根据存储器里边存储的这一系列的指令来一条一条的执行。直到程序执行结束,也就是说,对于安尼亚克这台计算机,是程序员们告诉他一条指令,他就往下执行一条指令说一句做一句,而冯诺依曼提出的存储程序的这种实现方式,就意味着我们可以把我们想要让计算机执行的一系列指令全部一口气告诉他,全部先放到主存里,然后接下来会由计算机一条一条的来执行这些指令,程序员们就不需要每一步都进行手工连接的操作。这就可以大幅提升计算机的一个计算速度,那基于他提出的这个设计方案,世界上第一台具有冯诺依曼结构的计算机就诞生了。这台计算机的英文缩写叫EDVAC啊,这是一个英文的全称

1.2冯诺依曼机的组织结构

那冯诺依曼计算机的一个硬件结构是这个样子的,在这个图中,我们用这种实线箭头来表示,数据线也就是说数据可以跟着这个实线箭头的流动方向来相互的传递传输,那像这种双箭头就意味着两个部件之间有你来我往的这种数据传输。另外,我们会用这种虚线来表示控制线和反馈线。

好来具体分析一下这个图是什么意思?我们的计算机其实就是用来处理一些数据的,所以要让计算机处理数据,那么我们首先需要有一个输入设备把数据输入到计算机当中,那这儿的数据包含我们要进行数学运算的数据,也包含了程序,也就是指令集合。所以输入设备的一个作用就是把计算机要处理的这些信息转换成机器能够识别的形式。也就是零一零一这样的二进制数,那可以看到我们输入的这些数据程序,通过输入设备处理之后。这些数据事先流向了运算器,然后通过运算器的中转,才会把这些程序数据把它放到内存,也就是这儿所谓的存储器当中。所以这个存储器就是用来存放,我们要处理的数据,还有程序指令的,而中间的这个运算器,它最主要的一个功能是实现算术运算还有逻辑运算,算术运算就是加减乘除那些运算逻辑,运算指的就是与或非这些运算。那经过运算器的处理之后,这些数据的运算结果会通过输出设备把它转换成我们人类比较熟悉的形式。

另外还有一个非常重要的部件,叫控制器,控制器会用一些电信号来协调其他这些部件相互配合着工作。另外,控制器也会负责来解析存储器里存储的那些程序指令。所以我们会看到这儿有一条存储器到控制器的一个数据线,那这条数据线其实就是控制器从存储器当中,读取出一条指令的呃,一个数据流,比如说读入的是一个加法指令还是乘法指令,那控制器解析了这条指令之后,它才会来指挥这个运算器,执行相应的加减乘除之类的运算,所以程序指令的解析是由控制器来完成的。因此,计算机中的控制器就是用来指挥程序有条不紊的运行的

那我们输入计算机的这些数据和程序,其实就是所谓的软件的模块。那这个框里边的这些部分其实就是计算机的硬件部件,那在计算机系统中其实软件和硬件在逻辑上是等效的。什么意思呢?也就是说,对于同一个功能,我们既可以用软件来实现,也可以用硬件来实现。不过,通常来说,用软件实现的成本更低,但是效率也会更低。而用硬件来实现,成本会更高,当然效率也会更高。比如说,如果我们要实现乘法运算,那么我们完全可以在运算器里边设计一个专门的硬件电路,来实现这种乘法运算。我们只需要给出一条乘法指令,运算器就可以得到最终的结果,但是如果我们没有这个硬件部件,其实也可以实现乘法。因为乘法其实可以用多次的加法运算来模拟,那么我们完全可以使用加法运算的这个指令。执行多次加法,用这样的方式来等效的呃模拟出乘法运算,所以我们才说软件和硬件在逻辑上其实是等效的。显然,用硬件的方式乘法,电路直接计算肯定是更快一些。用软件的方式进行多次加法,那就需要消耗更长的时间。好的,那到目前为止,我们就搞清楚了什么是冯诺依曼机

 1.3冯诺依曼计算机的特点

对于这些什么控制线,数据线,现在理解的不是很透彻,也没有关系,我们之后还会用更详细的例子带大家来分析。那总的来说,冯诺依曼结构的计算机有这样的一些特点,

第一个特点计算机有五大部件组成,也就是这儿画的这五个部件,那其中输入设备和输出设备。我们可以把它们统称为IO设备,那I的意思是in put的意思是output好,这是冯诺依曼基的第一个特点。

第二个特点指令和数据同样都是以二进制的方式,同等的地位存放在存储器当中。我们可以根据存储单元的地址来进行访存的操作,那这个内容我们留在之后再来解释。

第三个特点,指令和数据都是用二进制表示的,采用二进制表示的原因是我们可以很方便的用电信号来表示零和一这样的两种状态。

第四个特点,指令由操作码和地址码组成,那操作码就是指明了这条指令它要进行的是什么样的操作,比如说。加减乘除这些就是操作码来指明的,而地址码是指明了我们要操作的这些数据,它存放在内存的什么地址当中?那程序执行的过程中,其实就是根据指令里边指明的这个地址码,对特定的一个内存单元进行访存操作的。

好,第五个特征就是存储程序,这个我们之前解释过,就是说会提前的把指令和数据存储到存储器当中。

好,第六个特征就是冯诺伊曼计算机是以运算器为中心的啊,什么意思呢?你看我们的运算器,它处在整个结构的中间位置,无论是输入设备,输入数据。还是输出设备,输出数据都肯定需要经过运算器的一个中转,虽然说我们刚开始输入的这些数据和程序本来就是想要放到这个存储器里的。但是冯诺依曼这种结构的计算机都是会通过运算器作为中转站把它转存到这个存储器里边的所以,由于数据的传送必须经过运算器来完成,因此我们说这种结构是以运算器为中心

那这就产生了一个问题,我们的运算器本来是用来处理这些数据的核心部件。但是现在所有的数据中转,还需要通过它来帮忙完成,那这样的话会导致数据计算的效率降低。

来看这样的一个例子,其实我们的计算机它本质上就是一个数据的加工厂,数据输入到计算机当中,然后处理完了之后输出。

那对于现实世界当中的加工厂呃,通常会有一个采购部门负责采购一些呃,它需要加工的原材料,那这其实就是我们输入的数据。另外,我们会有一个生产加工的部门,对这些原材料来进行加工处理,那还有一个部门是仓储部门,这个部门其实就是用来存放我们接下来要处理的这些原材料物资的。那当我们加工完成之后,会由销售部门把产品卖出去,另外我们还会有一个霸道总裁来负责指挥各个部门的运行。所以在我们的这些例子当中,采购部门它采购的这些原材料本来是可以直接放到仓储部门的,但是现在他偏偏要先把这些东西先交给这个加工部门。

然后让加工部门再来把它转运到仓储部门去,同样的加工完的这些产品,我们其实本来可以直接放到仓储部门,然后直接由销售部门从仓储部门。取走这些产品,但是当销售部门要取走最终的成品的时候,还需要由这个生产加工部门来进行一个中转,把这些东西交给他,那这显然是低效的。那讲到这儿,相信大家脑子里应该已经有一个解决方案了

 1.4 现代计算机的结构

解决方案很简单,那这个解决方案其实就是现代计算机的一个结构。传统的冯诺依曼结构的计算机都是以运算器作为核心。数据的传输,都需要通过运算器作为中转。但是,现代计算机通常是以存储器为中心,也就是说,输入设备它的数据是直接放到这个存储器里边的。当运算器处理完这些数据之后,输出设备也会直接从存储器当中取走,最终的数据进行计算结果的输出。那这样的话就可以更多的解放运算器的时间,可以让运算器进行更多的运算,那我们现在使用的手机计算机基本上都是呃,这样的一个结构。那由于运算器还有控制器,它们之间的逻辑关系十分紧密,所以在大规模集成电路制作工艺出现了之后。这两个部件通常是被集成在同一个芯片上的,那整合了这两个部件的芯片就是我们现在熟悉的CPU,所以CPU里边既包含了运算器,也包含了控制器。

因此,如果把这个结构框图给简化一下,就可以表现成这样的形式。CPU里边包含了运算器和控制器,控制器通过控制线来告诉运算器,你接下来应该执行的是加减乘除。什么样的运算,另外控制器也会来控制主存储器的一个读写,还有输入输出设备的一个呃启动停止。那主存储器和CPU之间会进行数据的交换,第一种就是需要参与运算的那些数据。比如xy之类的一些变量,

另外一种数据就是指令,那么指令会放到控制器当中,由控制器来解析这条指令的含义。并且发出相应的控制信号,那最右边这个双向的箭头是说我们的IO设备也就输入输出设备会直接的和主存储器进行数据的交换。那主存储器和CPU统称为主机,所以我们计组里边提到的主机和大家平时熟知的这种主机是有区别的。我们平时生活中呃,所谓的这个主机,它里面除了CPU主存储器之外,还会包含其他的,比如硬盘啊,还有风扇啊之类的这些设备。所以这个概念大家需要注意一下。

那另外一个大家比较容易混淆的概念是主存和辅存这两个东西,

那这两个东西都可以统称为存储器。主存就是主存储器,也就是我们熟知的内存而辅存就是辅助存储器,在电脑里边就是我们的机械硬盘,固态硬盘。需要注意的是,虽然它们都是存储器,但是我们这儿所谓的主机是只包含了主存。而辅存我们应该把它归为IO设备,像我们平时手机里安装的APP,其实它就是存放在辅存里边的,只有这个APP需要启动运行的时候。才会把辅存里边的APP相关的程序数据代码的数据把它读到主存里边。所以辅存应该把它看作是一种IO设备。

像之前我们给的这个图,华为这个手机,它这儿所谓的运行内存8 GB指的就是主存储器的大小容量是8 GB,然后机身存储是128 GB,这个指的就是辅存。所以主存储器还有辅助存储器,然后机组里边主机这几个概念,大家需要特别的注意一下,比较容易混淆。

好的,那这个小节当中,我们简单的介绍了计算机硬件的基本组成分为五大部分,分别是输入设备,输出设备,还有主存储器,

运算器和控制器。后边这三个硬件部件组成了所谓的主机,那这一小节中我们学习了两种计算机硬件的结构,第一种就是传统的冯诺依曼结构。冯诺依曼这个人,他首次提出了存储程序的概念,应用了这个概念。我们的计算机才实现了自动化的执行代码,这样的一个事情。另外,冯诺依曼结构的计算机是以运算器为中心的,而现代计算机的硬件结构通常是以存储器为中心。那运算器和控制器这两个硬件部件现在一般都会被集成在同一个芯片里面,这个芯片就是大家熟悉的CPU。

 

好的,上个小节我们学习了现代计算机的基本构成,都是基于冯诺依曼结构的思想来设计的,主要有五个啊,硬件部件。那这个小节我们要做的事情是来看一看我们主机内部的这三个硬件部件,它们的一些内部细节以及它们之间是如何协调着来工作的?那我们先看主存储器,之后看运算器,最后是控制器。 

 

好,首先来看主存储器的基本组成。主存储器里边用于存放数据的东西叫做存储体。存储体就是由一系列的存储元件来构成的,可以存放二进制零或者一。

除了存储体之外,还有两个重要的寄存器,一个叫mar,一个叫mdr,它们分别是存储地址,寄存器,还有存储数据,寄存器的一个英文缩写。那很多跨考的同学不知道寄存器是什么意思?寄存器其实也是用来存放数据的,存放二进制数据。只不过这两个寄存器,它们存放的数据各不相同,从名字可以看出mar它应该是存放和地址相关的一些二进制数据。而mdr是用于存放实际的数据的,

这个我们一会儿会用一个具体的例子带大家再来理解好,那主存储器里的这三个重要部件,它们分别有什么用呢?诶,刚好今天早上我到菜鸟驿站去取了一个包裹,那我发现菜鸟驿站它的一个基本组成,其实和我们主存储器是有很多异曲同工的地方。每一个菜鸟驿站里面都会有一个货架,大概长这个样子,他们会给这个货架进行一个编号,什么11号货架,然后一层二层三层,然后我去的这家菜鸟驿站,他们的包裹编号。就是根据货架号,

然后呃在货架里的第几层,这一层的第几个包裹用这样的规则来给我的快递编号的,所以这家店这些一个一个的包裹货物。其实是有规律的,按照取件号摆放到货架上的,那我去取包裹的时候,我得告诉前台的店员,我的取件号是多少,然后店员说啊,你好帅啊。啊,不是这个,是彭于晏啊,不是我。好,

那店员知道了,取件号之后他就可以知道我的这个包裹是存放在11号货架的第一层。的第42个包裹。于是这个店员会告诉后台的啊,小哥让他去这个位置帮我找,于是在取件号所对应的位置就找到了我想要的啊包裹。那找到之后,他们会把我的包裹放到柜台上,我就可以从柜台上拿走我的包裹,因此菜鸟驿站的这个模型当中,货架电源。柜台与我们主存储器的这三个部分都是一一对应的,菜鸟驿站的货架是用来存放货物的,一个一个的包裹。然后主存储器里的存储体是用来存放数据的,

那数据不就是计算机想要的货物吗?好,另外我会告诉店员我的取件号是多少,同时我的取件号也反映出了我想要的货物,它在货架上的存放位置。而对于主存储器来说,CPU想要从里边取得一个数据,那么它会把它想要的数据存放在什么位置?这个存放地址。写到mar这个寄存器当中。那接下来主存储器是不是就可以根据mar这儿接收到的地址信息去存储体里边拿出CPU想要的数据?好再回到菜鸟驿站,我想要的包裹从货架上找到之后会被放到柜台上,然后最终我是从柜台上取走这个包裹的。那对于存储器来说也是一样,

刚才CPU给他提供了一个他想要的数据的存放地址,那么主存储器里边的一些控制逻辑会根据这个地址找到他想要的数据,并把他想要的。数据先写到mdr这个寄存器当中,最后CPU就可以通过数据线路从mdr当中取走,他想要的数据。好所以主存储器和菜鸟驿站的这个呃模型是有很多相通的地方的,当然也有不一样的地方,对于菜鸟驿站来说,呃我们通常只能从呃他的货架上取走我们的包裹。而对于存储器来说,CPU既可以从其中读出数据,同时也可以写入数据,那写入数据的过程其实和读入数据是很类似的。那CPU会指明他想要写入到哪个位置,

然后他想要写入的具体数据会放在mdr当中。最后CPU会通过控制总线告诉主存储器说,这次我想要执行的操作是写操作,而不是读操作,那么主存储器根据CPU发出的。这三个信息就可以往对应的位置写入CPU,想要写的数据了好,那通过这个例子,相信大家就能够理解mar和mdr这两个寄存器的一个作用。

好,接下来我们把注意力放到存储体上,存储体是什么一个原理呢?我们刚才说过数据,我们要的二进制数据是存放在存储体当中的。并且是按地址来存储,

什么意思呢?就是说我们的这个一整个存储体,它会被分成一个一个的存储单元。每一个存储单元会存放一串二进制代码,那每一个单元里边存储的这一串二进制代码,我们就把它称为一个存储字。呃,英文的话就是word。而每一个存储字包含多少个二进制位?这个信息我们把它称为存储字长。也就是每一个存储单元里边可以放得下多少个二进制位,通常每一个存储单元可以存放的二进制数啊,都是八个比特的整数倍。也就是八比特或者16比特或者32或者64,这是比较常见的一些存储字长。

好,那每一个这样的存储单元会对应一个呃地址信息,地址是从零开始的。那这个地址信息就是刚才我们所说的mar,这里边应该指明的一个信息。如果我要读取的是第二号的存储单元,那么CPU就应该往mar这个寄存器里边写入二这个信息。好,那最后还有一个概念叫做存储源,也就是用于存储二进制数据的电子元件。那这样的电子元件其实是用电容的原理来制造的,不知道大家还有没有印象,我们高中里边学过电容相关的知识。电容可以用来存储电荷,因此我们可以用一个电容来存放一个二进制的比特位。

那由多个存储元件,还有相应的线路,就构成了一个存储单元好,那关于存储元件的物理特性,我们不需要过度的深究,我们只需要知道每一个存储元件,每一个存储元可以存放一个比特就可以了。可以了好,那之前我们说过mar是指明了我此次要访问哪一个存储单元?是指明了存储单元的地址,所以mar这个寄存器它的位数,它到底有几个比特位?这个信息就直接的反映了我们的存储体里边到底有多少个存储单元?另一个方面,我们从存储单元里边取出来的数据是要放到mdr当中的,

所以mdr它的二进制位数应该和存储单元是保持一致的。也就是要等于存储磁场,比如这个主存储器,它的mar地址寄存器只有四个比特位。那么,也就意味着它的存储体里边总共只有二的四次方,这么多个存储单元,因为四个二进制位最多也就只能表示这么多个呃数字。也就是对应二的四次方,这么多个地址,另外如果它的mdr这个数据寄存器总共有16位16个比特位,那么就说明在这个主存储器当中。一个字的大小就是16个比特,换一个角度说,每一个存储单元可以存放16个二进制位,

16个比特的信息。那这一点也是比较容易,作为考题来考察的,大家需要注意,那这儿还要给大家补充一个比较容易混淆的点。就是这儿,我们给出了所谓一个字的概念,用英文说的话就是一个word,很多同学容易把字和字节混为一谈,那如果看英文的话,其实它们是很不一样的。但是中文的翻译确实很像一个字节,指的是八个比特位,而一个字到底有多少个比特?这个具体得看我们的计算机,

它的结构是怎么样的?也就说一个字的大小,有可能是16个比特,有可能是八个比特,也有可能是32或者64个比特,具体要看我们计算机硬件是怎么设计的?那除了字和字节之外,还有一个呃需要强调的点,就是我们在描述一个字节的时候,经常会用一,然后加一个大b大b。大写的b来表示。但是当我们在描述一个比特,一个二进制位的时候,一般是用一+1个小b来表示小写的b,

所以很多初学者会忽略这个细节。大b和小b其实是不一样的,那说一个大家都会有体会的生活经验,当我们去办那个宽带的时候,你会跟业务员说我要办一个100M。100M的一个呃宽带,那么你会发现它的这个b是小写的b,所以它的这100M的宽带。其实指的是每秒钟per second,每秒钟可以传送100M个比特位,是这样的一个速率。那当你用100M的宽带来下载东西的时候,我们的迅雷之类的下载器一般是以大b,也就是字节作为这种计量单位的。所以你会发现你用100M的宽带来下载东西的话,

那最多就是10M多一点的,这种速度,因为你的下载器里边用的是大b。也就是字节。其实并不是运营商骗了你,他承诺你的理论峰值100M,你把它换算成大b的话,应该是用100再除以一个八,这才是你有可能获得的呃,最快的一个下载速度。好了,扯了一堆东西,也是为了加深大家的印象,注意字和字节,还有大b和小b的一个区别。

好,那到此为止,我们了解了主存储器的基本组成

 

 

接下来我们进入下一个硬件部件就是运算器的基本组成,我们先用大家最讨厌的念PPT的方式来简单的聊一下。之后我们再用一个具体的例子带大家来理解我们这儿给出的这些呃文字性的描述,那一个运算器最主要的部件有这样的四个呃a cc mq。还有一个叫x,还有一个你看它形状不太一样,叫alu那上小节,我们说过运算器就是要来实现算术运算加减乘除,还有逻辑运算的。其中ACC它其实是一个寄存器,翻译为中文,一般叫做累加器,

那这是它的英文全称。累加器可以用来存放,我们进行加减乘除或者逻辑运算的那些操作数,同时也会用于存放运算的结果。第二个寄存器叫mq。就是乘商寄存器,乘和商其实也就对应着乘法和除法,所以顾名思义,这个寄存器只会在乘法除法呃这样的运算的时候才会用得到。同样的,会用来存放乘法除法的操作数或者运算的一个结果好,第三个寄存器x它叫通用的操作数,寄存器或者我们可以把它简称为通用寄存器。其实这种通用寄存器一般在运算器里边呃,是可能会有多个,

但理论上我们只需要有一个通用寄存器就可以实现我们想要的那些算术运算。那大家如果看王道叔给的运算器的结构的话,那你会发现它里面就画了多个这种通用寄存器。那通用寄存器的作用就是用来存放一些操作数好,最后这个长相很不一样的家伙alu,它叫算术逻辑单元。那alu才是运算器的核心部件,它里边集成了一些复杂的电路。用这些复杂的电路可以实现算术,运算或者逻辑运算,前边我们说的这三个寄存器其实就是用来存放一些呃数据的。这些寄存器的硬件构造并不复杂,而alu的硬件构造就很复杂了,所以运算器里边啊,制造成本最高的一个部件就是alu。

那刚才说的这三个寄存器在进行加减乘除不同的运算的时候,它们的作用会各不相同,这个我们一会儿结合具体的例子来理解好,那这是运算器的一个基本组成。有三个不可或缺的寄存器,另外还有一个核心部件alu来实现算术运算和逻辑运算,

 

接下来我们再来看控制器。控制器里边有三个必不可少的呃部件,一个叫cu就是控制单元,控制单元是控制器里边最核心的一个部件。它里边也集成了很复杂的呃,一系列的电路可以完成分析指令,并且可以给其他的部件发出一些控制信号。所以上个小节我们把控制器比喻成霸道总裁,它会控制其他的部件,

但是对于这个霸道总裁来说CEO才是他真正的核心。就相当于cu是霸道总裁的老婆,其实总裁还是得听老婆的啊,那除了cu之外,还有另外的两个寄存器。ir是指令寄存器就是用来存放当前执行的指令的PC,是程序计数器,它是program counter的一个缩写。我们平时说的PC 1般是个人电脑。那不要和这里的PC混为一谈,那这个寄存器的作用是用来存放下一条指令的地址。并且有自动加一的功能好,那我们的计算机最主要的工作就是执行代码,而我们的所谓的代码其实就是一条一条的指令,对吧?

那每完成一条指令,需要分为这样的三个阶段,第一个阶段是取指令会根据PC,也就是程序计数器里边所记录的这个指令地址。根据这个地址,从内存里边取出那一条指令,那取出的指令会被放在ir,也就是指令寄存器当中。然后cu这个部件就可以分析这条指令到底是要干什么的,那当它分析完了之后cu这个部件就会控制着其他部件来配合着完成指令的具体执行。好,那这是完成一条指令的三个阶段,当然很多地方也会把前边的这两个阶段统一的称为取指的阶段,然后最后的这些阶段把它称为执行的阶段。好,

那运算器和控制器的功能都是很抽象的,要把抽象的知识变具体最好的方法是让他们跑起来,

 

 

所以接下来我们用一个具体的例子来看一下我们熟悉的一段代码是怎么执行的?比如我们可以用C语言写这样的一段程序,定义ABC y这样的四个变量。然后这个程序里面只是执行了一句简单的代码y=a×b+c,这是我们高级语言程序员看到的一个视角。但事实上,我们的CPU不可能一次性完成这样的一个复合运算,它只能先进行乘法,然后再进行加法,分为这样的呃两大步骤。所以我们这段程序在经过编译链接一系列的骚操作之后,可以把这个高级语言翻译成机器能读得懂的机器语言。同时,

会把这段程序装入主存,那它在主存里的样子就是这样的,最左边的这一溜是指明了啊,主存的地址,这是零号存储单元,这是一号存储单元,好以此类推,一直到八号。那我们定义了ABC y这样的四个变量,我们a这个变量,它是存放在地址为五的,这个存储单元当中的。当然,在主存当中,是以二进制的形式来存放那b,

这个数据是存放在六啊c,存放在七,然后最后我们要计算的这个y。它是存放在八,这个存储单元当中,那除了这些数据之外,前边零到四这几个存储单元存储的就是我们这一段程序。它所对应的机器指令。你看我们用高级语言写的,短短的一行代码呃,经过编译之后丢给计算机的,其实是这么多条复杂的指令。那每一条指令会分为操作码和地址码这样的两个部分,对了,大家可以数一下我们这儿每一个存储单元是16个比特。

也就是存储字长为16个比特,然后每一条指令它的两个部分,总共也是占16个比特。只不过,在执行这些指令的时候CPU会自动的把它们拆解成操作码和地址码,这样的两个部分。

 

好,下面来看一下这个程序的运行,那接下来的这段演示,希望大家认真的听,这有助于大家理解各个硬件部件的作用,还有它们之间是怎么配合着工作的?能帮助大家形成一个对计算机运行原理的一个全局观。好,我们把刚才的这个图补上主存,

还有运算器,控制器,然后运算器和控制器共同集成在CPU里面。另外还有一些IO设备,当然这个例子当中IO设备不重要,那首先我们的这些指令还有呃变量的数据都是存放在存储体当中的。这个程序要执行的第一个指令应该是存放在零号呃位置的这条指令。所以,在程序运行之前PC,它会指向零这个位置。接下来,我们应该把这个位置存放的这条指令给取出来执行。首先PC存放的内容需要通过地址总线把它传送到mar这个地址寄存器当中。那刚才我们说了,此时PC是零,

那这个操作就会导致mar这个寄存器的值变为了零,也就是说控制器向主存指明了。我接下来要访问的是零号地址所对应的这一串数据。同时,控制器会通过控制总线告诉主存储器,说我这次要进行的是读操作好,那接下来主存储器会根据mar记录的这个地址信息去存储体里边。找出零号地址所对应的这些二进制数据,并且把这些二进制数据放到mdr,也就是这个数据寄存器当中。那么,这就导致了mdr这个寄存器当中,现在里边存放的就是我们想要读取的第一条指令。对了,这儿解释一下,

我们呃把一个寄存器的名字外面打一个括号,指的是呃这个寄存器里边的内容。然后这儿一个m表示的是memory,也就是主存储器,主存储器里边mar这个地址所指明的存储单元里边的数据。放到mdr这个寄存器当中,是这样的一个意思。好,我们继续现在CPU想要的货物已经放到mdr这寄存器当中了,那接下来它就可以取走这个货物,那这一次要取走的货物其实就是一条指令。所以这条指令会通过数据总线把它放到ir,也就是指令寄存器当中,那这就导致控制器的ir这个寄存器里边。已经存放了,

此次要执行的指令好,接下来这条指令的前边六个比特,也就是操作码这六个比特会被送到cu控制单元里边。然后CEO会分析这个操作码,他就可以知道零零零一它对应的是一条取数的指令。所以接下来要把这个地址码所指明的内存单元里的这个数据把它给取出来,并且放到ACC这个寄存器当中,这是取数指令要做的事情。那既然要读取主存的这个地址的信息,于是就需要把这个地址码放到主存的mar当中。这就导致此时mar是等于五,因为这个二进制数转换成十进制就是五。那五号存储单元所指向的刚好就是a这个变量,它所存放的位置好,接下来主存储器根据mar指明的这个地址。

去存储体当中找出五号单元的这些数据,并且把这些数据放到mdr当中。也就是把a这个变量的值,现在放到了mdr里,那a的值是二好,最后在控制单元的指挥下。mdr里的数据会被传送到ACC,也就累加寄存器当中。那到此为止,我们就完成了一个取数的指令,最终导致a这个变量的值已经被我们放到ACC这个寄存器当中了。那这个图里边画的呃一二三四这几步其实就是对应了我们之前说的取指令的一个过程。然后第五步是对应了分析指令的过程。后边的六到九步才是实际执行,这个取数指令的一个过程。

所以你看,虽然我们只是给出了这样的一条呃机器语言描述的指令,但是我们的硬件确实还挺忙的,它要完成这条指令背后其实还是需要做很多很多事情。好,那之前我们说过程序计数器PC,它有自动加一的功能,其实在取指令这个动作完成之后PC的值就。就会自动的加一了,它以前是零,那自动加一,它就会指向一,

 

 

 

也就是指明了下一条我们要执行的指令,应该是在一这个单元这儿。好,

所以之前这条指令执行之后导致的效果就是PC,此时等于一让ACC=2,也就是等于a的值。接下来,根据程序计,数器PC所指向的位置取得第二条指令。那么,取指令的过程和之前是类似的。通过这样的四个步骤,把第二条指令放到ir寄存器当中,那取完指令之后就需要分析指令,那和之前一样会把操作码这个部分。送到cu控制单元,然后经过cu分析之后,它可以知道零零零一零零。

这个操作码对应的是一个乘法操作,所以这是一条乘法指令,因此接下来cu会指挥其他部件来协调的完成这个乘法操作。还记不记得我们写的程序y=a×b+c现在这一步,我们要完成的是a×b的操作,而a这个变量之前已经被我们送到ACC。啊,这些寄存器里边了,所以现在这条乘法指令它的地址码指明的是另一个乘数b,它的存放位置。那b存放在六这个位置,刚好这个地址码把它翻译成十进制数也是等于六。所以这条指令的地址码会被送到mar当中,指明我要取出的是六号存储单元里边的数据。所以接下来主存会根据mar所指明的这些地址,

取出相应的这个数据。也就是把b这个变量的值放到了mdr当中。接下来b的值会从mdr再通过数据总线送到mq,也就是乘商寄存器当中,所以现在b的值已经放到mq里边了。好,接下来还需要把a的值先放到通用寄存器x当中,也就说当这个CPU执行乘法操作的时候,它会把被乘数。放到x这个通用寄存器里边,然后把乘数放到mq这个乘商寄存器里边。接下来cu会通过控制线告诉alu算术逻辑单元,让它进行乘法运算。那alu会把x和mq里边存储的这两个数,把它们进行一个相乘的操作,

然后把最终乘得的结果放到ACC里边。那这个操作导致ACC里边得到了a×b的值二三得六。在我们这个例子当中,进行相乘的这两个数很小,但是如果说这两个数很大的话,那么有可能ACC啊,这个寄存器里边是存不下的。这种情况下就需要mq陈商寄存器的一个辅助存储。mq里边会用来存放啊,乘法运算结果的低位。好,那这样我们就完成了第二条指令,也就是乘法指令,那大家会发现和前边那条指令相比,其实第。

第一步到第五步,这几个步骤每一步要做的事情都是一模一样的,只有当CEO控制单元分析出这条指令是乘法指令的时候。接下来的操作就会产生一些区别。另外,和之前说的一样,当取指令结束之后PC的值也会自动加一

 

 

所以。这条指令执行结束之后,得到的效果就是PC指向了二,也就指向了下一条要执行的指令,然后ACC里边此时存放了我们上一个运算的结果。也就是a×b的值a×b=6。好,接下来执行二这个地址存放的这条指令,

那前边的几个步骤都是一样的,通过五个步骤。可以完成。取指令和分析指令的操作,那CEO发现,这次要执行的操作码应该是零零零一一,这个操作码对应的是一个加法操作。所以这是一条加法指令,那接下来CEO会根据加法指令的这个执行步骤来指挥着其他部件协调工作。好,那这次要计算的是a×b+c,而a×b的结果,我们是已经存放在ACC当中,所以这个加法指令的地址码。指明的是c这个变量,

它的存放地址那c是存放在七这个位置的,刚好把这个二进制数转换成十进制就是七。因此,接下来要取出七这个地址所存放的数据,那么就需要把这个地址码把它放到mar地址寄存器当中。接下来,主存根据mar指明的地址,取出相应的这个数据。也就是把c的值放到了mdr当中。然后接下来这一步会把mdr的值再传送到通用寄存器x当中,也就是说当我们进行加法运算的时候。ACC里边会先存入被加数,然后通用寄存器x当中会存放加数,也就是c的值。好,

接下来控制单元会向alu发送一个信号,告诉他你此次要执行的是加法操作,那么alu算术逻辑单元就会把ACC和x里边存放的值进行一个相加。并且把加得的结果再次存回ACC当中,因此这就导致了ACC=7,也就是把a×b+c的值。存放到了ACC里边,好,那到此为止,我们完成了第三条指令,也就是这个加法指令。同样的,前边的五个步骤,其实和之前的两条指令。没有任何区别,

另外在取完指令之后,同样的也会自动的进行PC呃加一的操作,也就是PC会指向下一条我们应该执行的指令。

好,接下来这条指令的执行,前边的这些步骤都是一样的。根据PC记录的这个地址,取出这条指令,并且放到ir指令寄存器当中。然后第五个步骤会把这个指令的操作码把它送到CEO当中进行分析,然后CEO分析之后发现。零零零一零,这是一条存储的指令,也就是要把ACC里边的数据把它存到地址码所指明的存储单元当中。那这个d值码转换成十进制,

应该是八而八,这个存储单元刚好对应的是y这个变量的存储位置。那现在ACC里边存的是七,也就是a×b+c的值。好,接下来执行这个存数指令,首先会把这个指令的地址码部分把它送到mar里边。用来指明,此次我要存入的是哪一个存储单元,另外还需要把ACC里边的运算结果通过数据总线把它送到mdr当中。也就说,此时mdr里边保存了a×b+c的值。并且此时mar里边指明了这个值是要存到内存地址为八的这个地方。然后接下来CEO控制单元会通过控制总线告诉呃主存储器,说我此次要进行的是一个存一个写的操作,

于是主存储器会根据mar所指明的地址。把mdr当中的这个数据放到相应的位置当中,这就导致了八号存储单元。它的值变为了七,也就是我们最终想要得到的这个结果y=a×b+c。那同样的存数指令的执行取指和分析指令的阶段做的事情和前面那些指令没有什么区别。只有分析出了指令之后,才会在cu控制单元的控制之下执行不一样的一些操作。同样,此时PC会加一指向下一条应该执行的指令,

 

 

那么接下来执行这条指令啊,和之前一样,首先需要取出指令,把这个指令。把它取到ir指令寄存器当中,

然后接下来要把操作码部分送到cu里边,然后cu 1分析发现诶。零零零一一零。这个操作嘛,对应的是停机指令,所以执行到这一步就知道我们的这段程序运行结束了。那学过操作系统的同学知道要停止一个进程的运行,需要通过系统调用,或者说通过中断机制来通知操作系统来终止这个进程。于是,接下来执行的指令就不是这一系列指令,而是操作系统相关的那些指令。那后续的部分,我们就不需要再关心了。好,

那到此为止,我们就一步一步模拟了这个程序的执行过程。同时,相信通过这个例子,大家就能够真正的理解运算器,控制器和主存储器,它们的各个部件分别有什么作用?另外,它们之间是如何相互协调着来工作的?

 

好的,那我们再来进行一个小小的总结啊,这是我们的第一条,也就是取数指令的一个执行过程。分为取指令,分析指令和执行指令这样的三个阶段,

任何一条指令的执行一定都是这样的三个阶段。那无论我们执行的是什么指令,前边取指令和分析指令的这些步骤其实都是一模一样的,只有分析完指令之后CEO才可以知道这条指令到底是要做什么。于是接下来的这些步骤啊,对于不同的指令来说,就有可能不一样,那在取指令的阶段mdr里的数据肯定是要传送到ir指令寄存器当中。而在执行指令的阶段,CEO会根据具体的这条指令来决定m di里的数据,应该是放到ACC还是放到mq还是放到其他的通用寄存器里边。所以,根据指令,执行周期的不同,它处于不同的阶段。

CPU就可以区分出我们这次从内存里取出的,到底是指令?还是数据了。这个大家可以好好体会一下,

 

好的,那么这一小节当中我们介绍了很多很硬核的东西主存。运算器,控制器这三大部件构成了主机,那这三大部件的内部又分别有一些细分的小的部件,每一个部件完成了不一样的功能,但是相信通过之前的。那个程序运行的例子,大家能够体会到每一个部件的具体作用。运算器的核心部件是alu,控制器的核心部件是cu,

那在CPU里边这两个部件的制造成本也是最高的。另外,关于存储体里边所涉及的这些概念,大家也一定要捋清楚,这些都是选择题的高频考点。需要注意字和字节的区别。也需要注意,大b和小b的一个区别。好,那具体的各个部件做了什么事,我们就不再赘述,大家可以自己呃暂停来消化一下。那这个小节的后半部分,我们用一个程序的执行来说明了计算机的一个工作过程。刚开始,

我们需要把指令和数据把它们存到主存里边,然后PC程序计数器会指向第一条指令在内存中的存放地址。接下来就是对一条一条指令的执行,首先需要从主存中取出一条指令,放到ir指令寄存器当中,同时PC+1指向下一条应该执行的指令。接下来CEO会分析指令,根据指令的操作码来确定这条指令应该做一些什么具体的事情。那最后CPU会指挥其他的部件来共同的配合着完成这条指令的执行,那这就是我们计算机的一个工作过程。对了,再补充一点mar和mdr这两个寄存器,它逻辑上是属于主存的,但是其实现代的计算机当中。这两个寄存器通常会被集成到CPU里边,

所以如果接下来的学习当中大家看到了mar和mdr这两个寄存器被。被我们画到了CPU这个部件里边,那也不要觉得奇怪。好的,那以上就是这一小节的全部内容,

 

那在学习了这一小节之后,大家可以再回头看一下,我们上一小节提到的弗诺伊曼计算机的这几个特点。第二个特点,指令和数据以同等的地位存入存储器。这个可以理解了吧,刚才我们给的那个例题就是把指令和数据无差别的,以同等的地位放到了存储器里边,只只不过存储的位置不一样而已。对于指令和数据,

我们都可以按照地址来寻找和访问。无论我们是要读出一条指令,还是要读出一个数据,我们肯定都需要给出啊,它在内存里边的地址。所以这是按地址寻访的意思,那第三个特点,指令和数据用二进制表示,这也不用说好第四个特点,指令由操作码和地址码组成。那这个肯定也能理解了,只不过我们这个小节给的例子当中,每一条指令只有一个操作码,一个地址码,但是有的计算机它所支持的指令。

可能是有多个地址码的,比如说一条指令包含两个地址,那这种指令就称为2d指的指令。具体的我们会在之后的章节当中再遇到。好,第五个特点,存储程序在程序运行之前指令和数据都会被提前存到主存里边,这是存储程序好,所以经过这个小节的学习,相信大家对冯诺依曼计算。计算机的这些特点就有了更深的认识。好的,这个小节的内容有点多,比较硬核啊,还是有点难消化的,

大家今天可以多吃一点健胃消食片。希望大家可以好好的消化吸收。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41657.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP 应用HTTP.SYS短文件文件解析Access 注入数据库泄漏

#ASP- 默认安装 -MDB 数据库泄漏下载(路径是知道的话可以直接下载) 由于大部分 ASP 程序与 ACCESS 数据库搭建,但 ACCESS 无需连接,都在脚本文件中定 义配置好数据库路径即用,不需要额外配置安装数据库&#x…

Redis 版本演进及主要新特性

Redis 版本发布历史 稳定版本时间线 Redis 2.6 (2012年)Redis 2.8 (2013年11月)Redis 3.0 (2015年4月) - 首次支持集群Redis 3.2 (2016年5月)Redis 4.0 (2017年7月)Redis 5.0 (2018年10月)Redis 6.0 (2020年4月)Redis 6.2 (2021年2月)Redis 7.0 (2022年4月) - 最新稳定版(截至…

从 MySQL 到时序数据库 TDengine:Zendure 如何实现高效储能数据管理?

小T导读:TDengine 助力广州疆海科技有限公司高效完成储能业务的数据分析任务,轻松应对海量功率、电能及输入输出数据的实时统计与分析,并以接近 1 : 20 的数据文件压缩率大幅降低存储成本。此外,taosX 强大的 transform 功能帮助用…

NVM安装速通使用手册(Windows版)NVM管理node版本命令手册 NVM使用手册

nvm(Node Version Manager)是一个用于管理Node.js版本的命令行工具。通过nvm,你可以在同一台机器上安装和切换多个Node.js版本,非常适合开发和测试在不同Node.js版本上运行的应用程序 一、安装地址 1. 官方下载: &…

qt QQuaternion详解

1. 概述 QQuaternion 是 Qt 中用于表示三维空间中旋转的四元数类。它包含一个标量部分和一个三维向量部分,可以用来表示旋转操作。四元数在计算机图形学中广泛用于平滑的旋转和插值。 2. 重要方法 默认构造函数 QQuaternion::QQuaternion(); // 构造单位四元数 (1…

Axure项目实战:智慧城市APP(四)医疗信息(动态面板、选中交互应用)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP医疗信息模块 主要内容:医疗信息模块原型设计与交互 应用场景:医疗信息行业 案例展示: 案例视频&…

DeepSeek助力文案,智能音箱如何改变你的生活?

你好,我是三桥君 你有没有为写智能音箱的宣传文案而抓耳挠腮过?三桥君在这方面可是有些感想,今天就来给你唠唠怎么用DeepSeek写出超赞的智能音箱宣传文案。 首先,你得给DeepSeek喂足“料”。这就好比做饭,你得准备好各…

二叉树的前,中,后序遍历

我们来了解一下二叉树的遍历,话不多说 二叉树的遍历的概念: 二叉树有四种遍历方式,分别为前序遍历,中序遍历,后序遍历和层序遍历,但我们今天谈谈前三种,并实现它 前序遍历: 按照根…

Linux网站搭建(新手必看)

1.宝塔Linux面板的功能 宝塔面板是一款服务器管理软件,可以帮助用户建立网站,一键配置服务器环境,使得用户通过web界面就可以轻松的管理安装所用的服务器软件。 2. 宝塔Linux面板的安装 宝塔官网地址:宝塔面板 - 简单好用的Linu…

secp256k1的模数P是如何选择的?

在区块链和现代密码学中,secp256k1 椭圆曲线以其高安全性和高效运算性能而著称。你可能注意到,secp256k1 的曲线方程为 而其中的模数 p 被定义为 那么,为何会选择这样一个看似复杂的数呢?本文将从多个角度为你详细解析这一选择背后…

本地文生图使用插件(Stable Diffusion)

1. 插件下载(github) 1.1 直接Avaliable中点击安装(方案一) 1.2 Install from URL中输入URL(方案二) 1.3 直接下载复制到extensions目录(方案三) 2. 模型下载(Huggingf…

鸿蒙-全屏播放页面(使用相对布局)---持续更新中

最终实现效果图: 实现步骤 创建FullScreenPlay.ets全品播放页面 并将其修改为启动页面。 全屏播放,屏幕必然横过来,所以要将窗口横过来。 编辑 src/main/ets/entryability/EntryAbility.ets 若写在/EntryAbility.ets中,则所有…

C++ 多线程简要讲解

std::thread是 C11 标准库中用于多线程编程的核心类,提供线程的创建、管理和同步功能。下面我们一一讲解。 一.构造函数 官网的构造函数如下: 1.默认构造函数和线程创建 thread() noexcept; 作用:创建一个 std::thread 对象,但…

每天认识一个设计模式-建造者模式:复杂对象的“装配式革命“

一、前言 在软件开发的广袤领域中,随着项目规模日益庞大、业务逻辑愈发复杂,对象的创建过程也变得千头万绪。 早期简单的对象创建方式,在面对复杂对象时,逐渐显露出代码臃肿、耦合度高、可维护性差等弊端,设计模式的…

动态IP与静态IP该如何选?

一、当IP地址成为"网络身份" 2023年亚马逊封号潮中,某杭州卖家因登录IP频繁切换(早8点在纽约,午间瞬移到东京),触发平台风控导致账号冻结。这类"时空错乱症"揭示了跨境电商的生存法则&#xff1a…

蓝桥与力扣刷题(蓝桥 蓝桥骑士)

题目:小明是蓝桥王国的骑士,他喜欢不断突破自我。 这天蓝桥国王给他安排了 N 个对手,他们的战力值分别为 a1,a2,...,an,且按顺序阻挡在小明的前方。对于这些对手小明可以选择挑战,也可以选择避战。 身为高傲的骑士&a…

Linux--文件

ok,我们今天了解一下Linux中的文件 理解“文件” 狭义理解 ⽂件在磁盘⾥磁盘是永久性存储介质,因此⽂件在磁盘上的存储是永久性的磁盘是外设(即是输出设备也是输⼊设备)磁盘上的⽂件本质是对⽂件的所有操作,都是对外…

Linux-数据结构-哈夫曼树-哈希表-内核链表

一.哈夫曼树 哈夫曼树(Huffman Tree)是一种特殊的二叉树,其定义和原理如下: 【1】定义 哈夫曼树是一种带权路径长度最短的二叉树。给定一组权值,将这些权值作为叶子节点的权值构造一棵二叉树,若该树的带…

前端抽象化,打破框架枷锁:统一路由的设计

个人博客原文地址 此文章并不适合初级前端来看,它是抽象的架构设计,需要一定的TS基础和抽象思维,若带着思考的读完本文章相信会让你感到充实 当然你也可以复制,然后在自己项目中去实现它,然后用起来 只要你是在写前端…

Docker 搭建部署 仓库的搭建以及网络设置

安装docker 一、关闭防火墙和SELinux 1.1systemctl stop firewalld 1.2setenfoce 0 二、配置内核转发以及网桥过滤 2.1vi /etc/sysctl.d/k8s.conf [rootopeneuler system]# vi /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables 1 net.bridge.bridge-nf-call-ip…