此系列为王道计算机考研组成原理精细笔记。
上节中,我们了解了计算机的基本概念金和计算机发展历程,这一节我们着重探讨计算机硬件的基本组成。我们需要掌握以下两种结构:早期的冯洛伊曼机的结构和现代计算机的结构(冯洛伊曼机的一个优化)
还记得世界上第一台计算机ENIAC,冯洛伊曼就是这台计算机设计的一个顾问,这一台计算机的缺点就是每一步的计算需要执行什么指令都需要程序员操作员们通过手动连接线缆的方式来告诉计算机,虽然这台计算机执行的速度很快,但是由于这些程序员们每一次都需要手动接线来告诉它下一步该怎么做,因此ENIAC的速度就被手动接线的时间抵消了,为了解决这个问题,冯洛伊曼这个天才第一次提出了**“存储程序”**这个概念:
冯洛伊曼计算机的一个硬件结构如下图:
我们的计算机其实就是用来处理一些数据的,所以要让计算机处理数据首先就需要一个输入设备,把数据输入到计算机中,这里的数据包含进行数学运算的数据也包含了程序,输入设备的作用就是将信息转换成机器能识别的形式(0101这些二进制数)。通过输入设备处理过的数据紧接着流向运算器,通过运算器(算术运算+逻辑运算+…)的中转,才会把这些程序数据存放到存储器中,再通过运算器的处理之后这些数据的结果会通过输出设备,把它转换成我们人类比较熟悉的形式,另外还有一个重要的部件-控制器,控制器用一些电信号来协调其它这些部件,相互配合着工作,另外控制器也会复负责解析存储器里那些存储的指令,计算机中的控制器就是用来指挥程序有条不紊的运行的。
我们可以看到图中,我们是输入的程序和数据就是软件的模块,框内的就是硬件的模块,在计算机系统中软件和硬件在逻辑上是等效的,什么意思呢?也就是说对于同一个功能,我们既能用软件来实现,也能用硬件来实现,不过通常来说用软件实现的成本更低,但是效率也会更低,用硬件来实现的成本更高,效率也更高。
比如,对于乘法运算,我们可以设计一个专门的硬件电路实现乘法运算,如果没有,我们也可以通过软件的方式,使用多次加法进行运算,显然前者更快。
操作码:加减乘除…,
地址码:就是指我们要操作的这些数据它存放在什么地址当中,那程序执行的过程中就是根据指令里面执行的这些地址码对特定的内存单元进行访存操作的。
冯洛伊曼机是以运算器为中心的,这就产生了一个问题,我们的运算器本来是用来处理这些数据的核心部件,但是现在所有的数据中转还需要通过它来帮忙完成,这样就会导致数据计算的效率降低。
来看这样一个例子,其实我们的计算机本质上就是一个数据的加工厂,我们看下图,原材料就相当于我们的程序数据,采购部门相当于输入设备,生产加工部门相当于运算器,总裁就是控制器,仓储部门是存储器,销售部门就如同输出设备,我们可以想象,当采购部门将原材料采购回来后,可以直接放入仓储部门,但现在还得经过生产加工部门再到仓储,同样的加工完成的产品也可以直接给到销售部门但是这里却又要给到生产加工部门再给到销售部门,这样做显然是低效率的。
看到这里,我们也意识到了这种结构的问题,由此就产生一种解决方案:也就是现代计算机的结构,其原理就是将存储器作为计算机的中心。
我们今天使用的手机、计算机基本上都是这种结构,由于运算器还有控制器它们之间的逻辑关系是十分紧密的,所以在大规模集成电路制作工艺出现之后,这两个部件通常是被集成在同一个芯片上的,那么整合了这两个部件的芯片就是我们现在熟知的CPU。
我们将上述结构框图简化一下,能够得到下图形式,CPU里面包含运算器和控制器,控制器通过控制线来告诉运算器你接下来应该执行的是加减乘除什么样的运算,另外控制器也会控制主存储器的读写,还有输入输出设备的一个启动、停止,那么主存储器和CPU之间会进行数据的交换,第一种就是那种需要进行运算的数据,比如x,y等一些变量,另外一种就是指令,指令会放到控制器中,通过控制器进行解析这条指令的含义,并且发出响应的控制信号,最右边我们的I/O设备也会和主存储器直接进行数据交换,主存储器和CPU统称为主机,所以我们计算机组成原理里面这种主机和我们熟知的主机是有区别的,我们生活中说的主句不仅有CPU和主存储器还有风扇、硬盘等东西。
另外我们需要区分的是主存储和副存储,主存指的是我们熟知的内存(运行内存),辅存就是我们电脑里面的机械硬盘、固态硬盘,虽然他们都是存储器,但是我们这里将主存是纳入主机范围的,而辅存则是纳入I/O设备,例如我们手机里面的APP,都是存在辅存里面的只有APP启动运行的时候才会把辅存里面APP的相关程序数据读到主存里边。
主存储器里面用于存放数据的东西叫做存储体,存储体就是由一系列的存储元件构成的,可以存放二进制0或者1,处理存储体外还有两个重要的寄存器一个叫MAR一个叫MDR。它们分别是存储地址寄存器和存储数据寄存器。从名字上看,MAR是用来存放和地址相关的一些二进制数据的而MDR则是用来存放实际的数据的,一会用例子理解。
主存储器里面这三个东西有什么用呢?
我们借用到菜鸟驿站取包裹的例子进行说明:
当我们去菜鸟驿站取包裹时,我们可以观察到菜鸟驿站有很多货架,货架有很多层,而我们的取件码则是根据第几个货架第几层第几个规划的,包裹按照取件号在货架上摆放,同时菜鸟驿站设有店员和柜台,我将取件码告诉店员,店员告诉后台的取货小哥,小哥根据取件码取到我的包裹放到柜台上,我就可以拿着包裹走了。
我为什么提起这个例子呢,因为上述菜鸟驿站的结构和我们主存储器的结构是一一对应的。
菜鸟驿站的货架是用来存放货物的,主存储器的存储体是用来存放数据的,数据就是计算机想要的货物。我会告诉店员我的取件号是多少,同时我的取件号反映出我的货物在货架上的位置,而对主存储器来说CPU要从主存储器里面取得一个数据,那么它会把它想要的数据存放到什么位置,这个存放的位置写到MAR中,主存储器会根据接收到的信息去存储体里面拿出想要的,回到菜鸟驿站,我想要的包裹会放到柜台上,对于存储器来说也是一样,刚才CPU给主存储器提供了一个它想要的数据的存放地址,主存储器里面的控制逻辑就会根据这个地址找到它想要的数据并把它先写到MDR中,最后CPU通过数据线路从MDR中取走它想要的数据。
当然主存储器和菜鸟驿站的功能还是有区别的,CPU既可以从中读出数据同时也可以写入数据,写入和读入数据其实很类似CPU会指明它要写入到哪一个位置,然后它要写入的数据放到MDR中,最后CPU会通过控制总线告诉主存储器这次我要执行的操作是写入操作而不是读操作,主存储器根据CPU发出的这三个信息,就可以往对应的位置写入CPU想写的数据了。通过这个例子应该大家就能知道MAR和MDR是做什么的了。
接下来我们把注意力放在存储体上,存储体是一个什么原理呢,我们刚才说过数据,我们要的的二进制数据是存放在存储体当中的,并且是按地址来进行存储,什么意思呢,就是我们这整个的存储体它会被分为一个一个的存储单元,每个存储单元里面存放一串二进制代码,这一串二进制代码我们就将它称为存储字,每一个存储字又包括多少个二进制位,这个信息我们把它称为存储字长,也就是每个存储单元里面能放得下多少个二进制位。
通常每个存储单元能够存放的二进制数都是8个bit的整数倍,每个这样的存储单元又会对应一个地址信息,地址是从0开始的,那么这个地址就是我们刚才我们所说的MAR里面应该指明的一个信息,如果我们要读取的是第二号存储单元,那么CPU就应该往MAR这个寄存器里面写入2这个信息。最后一个概念是存储元,也就是用于存储二进制数据的电子元件,这样的电子元件其实是用电容的原理来制造的,不知道大家好有没有映像我们高中里面学过电容相关的知识,电容可以用来存储电荷,因此我们可以用一个电容来存放一个二进制的bit位,那由多个存储元件和相应的线路就构成了一个存储单元。
之前我们说过MAR是指明了我们需要访问哪一个存储单元,是指明了这个存储单元的地址,这个MAR位数即它有多少个bit位反映存储单元的个数,另一方面我们从存储单元里面取出来的数据是放到MDR里的,所以MDR的二进制位数是需要和存储单元中保持一致的。即MDR位数=存储字长。
例如MAR地址寄存器只有4个bit位,那么它的存储体里面只有2的4次方个存储单元,因为4个二进制位最多只能表示2的4次方个数字(状态),也就是对于2的4次方这么多个地址,另外,MDR数据寄存器总共有16位,那么在这个主存储器中每一个字(word)的大小就是16bit,每个存储单元能够存储16个二进制位,16个bit的信息。
易混淆:1个字节是8个bit位,而一个字具体有多少个bit具体要看我们硬件的设计。我们在描述一个字节的时候用1B,描述一个bit一个二进制位的时候我们用1b。
举个例子:平时我们去办理宽带业务的时候,业务员如果推荐我们办理100Mbps的宽带它的意思的每秒钟可以传送100兆个bit位的数据,而当我们用电脑手机下载东西的时候这时一些下载工具是以B即字节作为计量单位的,所以要得到你真正的网速,应该要除以个8。
前面我们讲过运算器就是用来实现算术运算(如:加减乘除)、逻辑运算(如:与或非),而它的重要组成部分为:
ACC:英文全称为Accumulator,其实是一个寄存器,翻译为中文叫累加器,它能够存放我们进行算术运算和逻辑运算的操作数以及存放运算的结果。
MQ:乘商寄存器,这个寄存器只有在运算乘法和除法才能用的上,同样可以用来存放乘法除法的操作数和运算结果。
X:通用操作数寄存器简称为通用寄存器,其实这种通用寄存器可能在一个运算器中会有多个,但理论上我们只需要有一个通用寄存器就会实现我们想要的那些算术运算。它的作用就是存放操作数。
ALU:算术逻辑单元,它才是运算器的的核心部件,它里面集成了一些复杂的电路,这些电路能够实现算术运算和逻辑运算,这个部件相对于之前三个部件制造复杂所以制造它的成本最高。
接下来我们来看控制器:
一个是CU叫做控制单元,CU是控制器里面最核心的一个部件,它里面也集成了很复杂的一系列集成电路,可以完成分析指令并且可以给其他部件发出一些控制信号,所以我们把控制器比作霸道总裁可以控制其它部件,对于这个霸道总裁来说CU才是它的核心,CU就相当于霸道总裁的老婆,所以说霸道总裁还是得听老婆的。
IR:是指令寄存器,用来存放当前执行的指令。
PC:是程序计数器,这个寄存器是用来存放下一条指令的地址,并且有自动+1的功能。
我们的计算机最主要的功能就是执行一条一条的代码,而代码就是一条一条的指令,每完成一条指令要分为三个阶段:
取指令PC:根据程序计数器里面存放的地址从内存里取出那一条指令。
分析指令IR:取出的指令会放到IR这个部件中。
执行指令CU:CU就分析这条指令干嘛的,分析完之后,CU这个部件就会控制其它部件配合执行这条指令。
我们使用具体例子来理解这些抽象的概念
这个程序只是定义了a,b,c,y这些变量,以及执行一段简单的代码y=a * b + c
但是CPU不可能一次性完成这样的复合运算,它是先乘后加,这段程序经过编译后,可以把这些高级语言翻译为机器看得懂的机器语言,同时会把这段程序装入主存,它在主存里的样子如下图:
那么这段程序到底是怎么执行的?你且听我慢慢道来:
我们上面的指令(主存地址的0-4),和变量(5-8)都是存储在存储体中的。
这个程序要执行的第一个指令是存放在0号位置的,所以程序运行之前PC会指向0这个位置,接下来我们应该把0号位置的指令取出来执行:
Note:我们把一个寄存器带一个括号代码寄存器里面的内容M(MAR)代表主存储器里面MAR
计算机工作过程总结:
对于“取数指令”它分为取指令、分析指令、执行指令
无论我们执行什么样的指令取指令和分析指令都是必须的,是一模一样的,只有当分析完指令之后CU才可以知道这条指令到底是要做什么,于是接下来对于不同指令就有不同的步骤。
下一节是计算机系统中的多级层次结构,期待大家和我交流,留言或者私信,一起学习,一起进步!