当今的计算机,绝大部分是冯诺依曼式计算机
冯诺依曼机的特点
冯诺依曼最早提出了程序存储的思想,并运用在计算机设计中,我们把根据这一原理结构设计的机器,都称之为冯诺依曼计算机
冯诺依曼计算机报告中提到,计算机应该具有5大部分组成,简单理解为:
- 运算器,计算是计算机的核心
- 控制器,控制计算的内容
- 存储器,冯诺依曼是存储型计算机,有存储器
- 输入设备,我们的数据要输入到计算机当中
- 输出设备,计算机计算的结果要给人看,能看懂
那么,这样的计算机具有什么特点?(6个)
- 计算机有5大部件组成
- 数据和指令以同等地位存储于存储器,可按地址寻访
- 指令和数据用二进制表示
- 指令由操作码和地址码组成
- 存储程序
- 以运算器为中心
具有存储能力的计算器,均称为冯诺依曼计算机,
那么我们能不能设计出不同的部件计算机呢?比如5大部件之间合并?比如数据和指令分别存储?(在很多缓存cache中,数据和指令是分离的),是否可以按内容进行查找?更多的问题需要大家去思考
如何理解以运算器为中心?
输入设备需要通过运算器,再送到存储器中
要输出内容,也要先从存储器送给运算器,再送到输出设备中
控制器控制什么?
控制器指挥,和控制程序的运行
在执行指令前,要先把数据(指令)从存储器送到控制器,控制器分析指令,完成一条指令的执行,完成指令先后顺序的控制
那么,冯诺依曼计算机有什么缺点?
运算器为5大部件的核心,全术运算,逻辑运算都要经过运算器运算,就连输入输出也得经过运算器,运算器非常繁忙,成为了计算机发展的瓶颈,我们能否对它进行一些改进?
冯诺依曼机改进
冯诺依曼计算机,具有2个明显的缺点,
- 以运算器为中心,导致运算器非常繁忙
- 5大部件之间没有层次关系
以存储器为中心,是对冯诺依曼计算机的一种改进
以存储器为中心,输入设备,输出设备能直接与存储器传输,控制器仍能对整个系统控制,运算器也能直接与存储器交换数据
但是这样的改进还不够完善,层次感依然比较低。
我们知道,5大部件可以组成以下结构
- 运算器ALU,控制器CU组成了CPU
- 主存和辅存组成了存储器
- CPU和存储器组成了主机
- 输入设备和输出设备组成了IO设备
- 主机和IO设备构成了计算机
那么大概可以分成主机系统,和IO系统,后续我们将以计算机完成一个具体问题分析,讲计算机结构细分为更小的模块
实际问题的解决
一个现实中的问题,如何用计算机来解决?是不是所有的问题都能用计算机来解决?
可计算行理论,是研究计算的可行性与函数算法的理论,又称为算法理论,设函数定义域为D,值域为R,如果存在一种算法,对定义域D中给定的任意一个X,都能够给出一个对应的值f(x),那么称这个函数可计算,计算算通常表示该问题是否可以被计算机解决
假设我们后续的问题不涉及到是否可计算,假设我们的问题都可以被计算机计算,如何用计算机来解决这个问题呢?
也许我们想到的,是”编写程序”,但实际上我们往往要做的更多,比如
- 建立数学模型(比如计算正弦交流电流)
- 确定计算方法(指令集中往往没有sin图像指令集,最终通过数学公式计算)
- 编写程序解题(程序指指运算的全部步骤,指令为一个步骤)
编程举例
需求: 计算ax^2+bx+c
假设我们的计算机,是一个累加器型的机器,即有2个操作数,一个操作数来自于累加器,另一个操作数来自于主存储器,此外假设机器包含了6条指令(①加法,②乘法,③取数,即从内存取数,④存数指令,存到寄存器上,⑤打印指令,到屏幕⑥停机指令),那么开始计算
- 取x至运算器中 ==》 x
- 乘以x在运算器中 ==》x^2
- 乘以a在运算器中 ==》ax^2
- 存ax^2在存储器中
- 取b至运算器中 ==》b
- 乘以x在运算器中 ==》bx
- 加上ax^2 ==》 ax^2+bx
- 加上c ==》 ax^2+bx+c
在上述算法中,我们可以进行一些优化,比如ax^2+bx+c ==》(ax+b)x+c
- 取x至运算器中 ==》x
- 乘以a至运算器中 ==》 ax
- 加b至运算器中 ==》 ax+b
- 乘以x至运算器 ==》 (ax+b)x
- 加c至运算器 ==》 (ax+b)x+c
优化后的算法,比原算法更简单,步骤更少,这是算法上的优化,接下来我们编写一个模拟的程序清单
内存地址 | 指令(操作码+地址码) | 注释 |
0 | 000001 0000001000 | 取x至acc |
1 | 000100 0000001001 | 乘a得ax至acc |
2 | 000011 0000001010 | 加b得ax+b至acc |
3 | 000100 0000001000 | 乘x得(ax+b)x至acc |
4 | 000011 0000001011 | 加c得(ax+b)x+c至acc |
5 | 000010 0000001100 | 将结果存放至内存 |
6 | 000101 0000001100 | 打印 |
7 | 000110 | 停机 |
8 | x | 原始数据x |
9 | a | 原始数据a |
10 | b | 原始数据b |
11 | c | 原始数据c |
12 | 存放结果 |
程序的清单有了, 如何把指令和数据存放到存储器中?存储器的结构是怎样的?如何进行访问?每次获得的数据的位数又是多少呢?
存储器是用于保存数据的,核心结构就是一个存储体,由若干个存储单元组成,存储单元又由若干个存储元件组成,这里有一些名词需要解释
- 存储单元 ==》 存放一串二进制数据(通常1字节)
- 存储字 ==》 存储单元中二进制数据的组合(通常2字节)
- 存储字长 ==》 存储单元中二进制数据的位数(通常8)
在存储器中,不单有存储体,还有一些寄存器
- MAR ==》 存储器地址寄存器,保存指令或操作数的地址,反映存储单元的个数
- MDR ==》存储器数据寄存器,保存了cpu要送入、从存储器取出的数据,反映了存储字长大小
MAR如何反映存储单元的个数?设MAR=4,则存储单元为4*4=16
你可以理解为存储体是一个长方体,而存储单元是一个底面积,存储字长是存储体的高
已知存储体的基本结构和工作过程,那么运算器的结构是什么?运算器是如何工作的?如何进行程序的运算?
运算器的功能是什么?加法?乘法?如何根据运算器的功能推断结构?
运算器的基本功能是完成运算,则运算器的基本组成是算数逻辑单元(ALU),ALU通常是一个组合逻辑电路,ALU要能够运算,首先能读取数据,则还必须有2个寄存器保存参与运算的数据,分别是ACC和X,对于乘法指令数据会增大一倍需要一个临时存储器MQ(也叫乘商寄存器),下面我们模拟简单算数运算
ACC | MQ | X | |
加法 | 被加数 和 | 加数 | |
减法 | 被减数 差 | 减数 | |
乘法 | 乘积高位 | 乘数 乘积低位 | 被乘数 |
除法 | 被除数 余数 | 商 | 除数 |
在计算机中,可以使用移位实现加法,而不是简单的累加,关于更多乘法会在后续的章节中介绍
一个算数操作有几个步骤,例如加法操作过程?
首先需要一个加法指令,由于加法中需要2个数,那么初态中需要把被加数送到寄存器ACC中,接着把加数从指定的内存地址中取出,送到X中,然后执行加法运算,最后把结果存放在ACC中
那么控制器的基本结构如何呢?
控制器的基本功能是:解释指令。要完成一条指令,首先要取指令,然后是分析指令,把操作码部分送给控制单元进行分析,最后是执行指令
要取指令,指令保存在哪?它需要一个地址,那么控制器中有一个寄存器pc保存预指令的地址,执行完一条指令,它应该能指向下一个功能,所以应该有一个计数功能(pc不一定是+1,而+1仅表示计数操作,不代表实际数字)
分析指令, 把指令从内存单元中取出,送到控制单元中分析,要把指令锁存起来再取操作码部分,那么需要一个寄存器IR保存指令,区分IR中保存的是当前预执行的指令,而pc是预执行指令的内存地址,当IR取指后,PC就会+1
最后的执行指令,则由cu控制完成
运算器、控制器、存储器构成了什么?一条指令是如何在主机上构成的?一个程序是如何在主机完成的?
例如取数指令过程:
- PC =》MAR,
- MAR =》存储体
- 存储体 =》 MDR
- MDR =》IR
- IR =》CU
- IR =》MAR
- MAR =》存储体
- 存储体 =》MDR
- MDR =》 ACC
无论是取数、存数,都是差不多的,那么对于ax^2+bx+c程序是如何完成的?
- 将程序通过输入设备送至计算机
- 程序首地址 =》 PC
- 启动程序运行
- 取指令, PC =》 MAR =》M(表示存储体) =》MDR =》IR,pc+1
- 分析指令,OP(IR)=》CU
- 执行指令,Ad(IR)=》MAR =》M =》MDR =》ACC
- 下一条指令,乘法指令,略
- …
- 打印结果
- 停机