好,大家好,这一讲我们来学习冯诺依曼结构 如果说图灵奠定了计算机的理论基础 那么另外一位科学家冯诺依曼则是计算机体系结构的奠基者 冯诺依曼这一辈子最大的贡献就是提出了 现在的计算机的体系结构,所以我们也称他为计算机之父 事实上大家都知道第一台计算机是 1946年在普林斯顿大学诞生的 那么这些实际的研究者向默里奇、埃里克等等这些 计算机之父的桂冠并没有戴在他们的头上 而是戴在了冯诺依曼这样一个数学家的头上 为什么这样呢?就是因为冯诺依曼提出了现在计算机的体系结构 这个体系结构从第一台计算机到 今天已经历经将近70年的时间了 计算机的技术和它的性能等等各个方面 都已经发生了巨大的变化 我们今天的一台普通的微型计算机它的性能 已经远远高出于当初的一台巨型机了 但是它的整个主流的体系结构依然还是冯诺依曼结构 所以我们说冯诺依曼是现代计算机之父 冯诺依曼计算机的一个结构有什么样的一个特点呢 它主要有这样三个方面的特点 第一:他提出了二进制,或者说他采用了二进制 我们在前面的课程中,我们已经详细的给大家讨论过 计算机为什么要选择二进制或者说为什么 要采用二进制的这样的一个理由 那么冯诺依曼这样一个体系结构 或者冯诺依曼计算机它就是采用的二进制 这样的使得整个的计算机在结构上或 它的性能上都相对十进制计算来讲 有了更大的一个质的飞跃,第二 冯诺依曼提出计算机的硬件是由这样五个部分来组成的 即运算器,控制逻辑单元或者说是控制器,存储器 输入设备和输出设备,那么还有一点更重要的 就是它在工作原理上,他提出了存储程序原理 下面我们来简单的来介绍一下,这样三大特点中的后两大 第一大采用二进制我们前面有过详细的讨论 这就是冯诺依曼体系结构的一个特点 以运算器为核心由这样五个部分来构成的这样一个结构示意图 所有的输入和输出也就是包括程序,包括数据 它们都通过输入设备 首先进入到运算器或者说首先进入到cpu 然后经过处理之后,再到输出 那么有可能通过输入设备的进来的数据会很多 那么cpu里头,我们前面已经讲了 cpu里头能够存放数据的地方很少 只有一些内部的寄存器组 那么这些数据不论它是最终存放在哪里 是存放在内存里还是存放在外存里 实际上它都先通过cpu再转发出去 同样的如果要把一个数据输出 不论这个数据曾经在哪里,在内存还是在外存 那么它都必须从内存拿过来再到输出设备送出去 所以这就是冯诺依曼结构的特点 由这样子五个部分构成,所有的输入和输出都是要通过cpu的 所有的运算都是以运算器为核心来进行的 这个是它的一大特点,中间的这一部分 实际上大家看就是我们前面讲的所谓的主机系统 那么冯诺依曼基本工作原理是什么样的 首先在讲这个原理之前,我得给大家声明一下 仅仅靠这里几分钟的描述或者是十几分钟的描述 我们实际上很难理解它的确定的或者说 把它的工作原理真正变成自己能够理解的内容 我们在这里只能给大家一个简单的描述 让同学们从思想上或者从概念上 理解一下冯诺依曼到底他的计算机是怎么工作的 如果大家真正要想理解它工作过程 实际上我们需要后续课程通过不断的学习程序 编制或者甚至在汇编级别上的程序编写 大家才能逐渐的去理解它,现在我们所学的这些内容 实际上是后续课程的一个基础 就像我们第一次课大家讲的那样 我们大学计算机实际上所有计算机课程的第一门课它的基石 所有在这里我们先简单的为大家奠定一点基础 冯诺依曼的基本原理,我们刚才提到它叫存储程序原理 那么何为存储程序原理,也就是这样描述的 他说将计算机或者说将计算的过程 用一些指令按照一定的顺序编写成程序 并且存放在存储器中保存起来 然后在执行的时候 按照指令在这个程序中的顺序被一条一条的取出来执行 然后整个的执行过程是由控制器来控制的 这就是它的存储程序原理 这个原理今天我们听起来似乎非常的正常 本来就应该是这样的大家可能心里会这样想 我们今天的程序实际上编完了以后 计算机就是按我们的程序所设计的 这样一种顺序一条一条的这样子取出来执行 但是事实上这就是因为冯诺依曼奠定了这样的基础 今天才会有这样的效果,在他之前不是这样子工作过程 好下面我们来通过它的这个一个图 我们来描述一下,我们上一讲里头已经讲过 程序是由指令的序列来组成的 也就是说程序里面是一条一条的指令 那么指令按照这种顺序构成了程序 那么我们编写程序的时候 我们编完了以后一定是以某一种文件的形式放在硬盘里头 那么在执行的时候这个程序是一定要进入到内存里 它才能够执行,那么现在我们就看它已经到了内存这样情况 到了内存里头以后, 这个程序就按照这样的顺序在里头放好了 那么我们上一讲里头还提到一个部件叫程序计数器 程序计数器就相当于一个指挥棒一样 当我们的程序进入到了内存之后 这个程序如果要开始运行的时候 程序计数器它自然的就会把这个指挥棒指向了 我们现在程序中的第一条指令 所以我们上次说它叫指令指针 就是说这个程序计数器本身是个寄存器 里边放的实际上是一个二进制编码 这个二进制编码它的性质是一个地址的性质 就像我们门上的这个门牌号码一样 它属于一种地址的含义,就是指向了某一个房间 这个房间在哪呢? 就是内存的存放第一条指令这样的一个单元 好了,指向这里以后,cpu开始到内存里去取指令 因为我们指令必须取回来 这上次我们讲过了必须取回来以后 到了cpu里头要进行分析也就是指令的译码 然后才能决定去执行还是取操作数等等这样的过程 所以cpu第一件事要把它取出来 取出来以后下面的步骤就是我们上一讲提到过的 指令的执行过程,首先进行分析,其次分析完了以后 才能知道它是干什么的,比如它是要做加法运算 那么我们就需要去取操作对象 这个操作对象也在内存里头,取完操作对象过来好了 然后我们现在开始去执行,比如求加法求和 执行完了以后,它的和数还是要取回去要送回去 所以它的结果一定是要放回去的 这就是一条指令的执行这样的过程就结束了 那么执行完了以后 下面按我们的设计应该接着就是执行第二条指令 所以紧接着第二条会被取出来分析执行 然后第三条指令再分析执行等等这样的过程 一直到结束为止 这个是我们存储程序原理用一个示意图 来描述就是这么一个简单的过程 我们用文字来描述一下,它是这样子的描述 首先从内存里取数据然后送到cpu里头进行译码 或者说对指令进行分析确定要执行哪一种操作 如果决定了以后如果需要的话 我们去取操作的对象,取完了以后我们进行执行这条指令 执行完了以后,我们再存放结果 然后去判断一下我们的程序执行完了没有 也就是说我们所有的指令是不是都执行结束 如果说没有执行结束,我们继续回到上一条第一条 就是这样子一直循环下去往复直到结束为止 这个就是它刚才我们用这个图所描述的计算机执行程序的过程 也就是这样一个过程 这个过程就是存储程序原理的一种描述方式 我们下边就来看用这样 另外一张图来描述一下某一条指令它的在计算机内部 它是有怎么样的一个过程 刚才我们是从宏观的角度我们说一个程序有多条指令来组成 每一条指令都是取出来然后分析 执行 分析 执行 这样过程 那么某一条指令它该怎么做呢,比如现在这样一条指令 它经过翻译之后变成了二进制的代码 当然我们在这里假设用十六进制数来表示的话 B1H放在内存这个地方 假设这就是我们现在的程序里头的第一条指令 那么计算机该怎么做呢,这些程序被放进内存之后 首先存放这个B1H的这个单元的地址会自动的 由系统设定到pc就是指令指针里边 假设这个地址就是1000FH 然后开始以后这个指令指针或者说程序计数器pc 就会把这个地址下移暂存到那里要送给地址寄存器 送给地址寄存器寄存器是一个存放数据的含义 所以送到里边的目的是什么呢,实际上要它把它自己腾出来 腾出来干什么它自己立刻做一个加一的工作 比如这里1000F再加一等于多少是1001FH对吧 加一加一的目的是什么加一的目的是 准备这一条指令叫B1H的这条指令被取走以后 下边就接着到了1001H,就是下一个单元里去取下一条指令 主要就是为了这个目的 好了这个程序计数器pc把这个地址送到了地址寄存器以后 地址寄存器就负责把指令把这个地址指向内存的这个单元 就是存放这条指令的这个单元 指向它以后就相当于有人告诉了你 在1号教室上课好已经告诉了你 现在就往那边走,能不能进到这个门里头呢 能不能走进教室那,那不一定,因为教室门还必须得开着 所以下边我们地址指向的这个单元 单元里头的这个B1H能不能被拿出来那还需要有人说话 谁来说话呢,计算机要发出也就是cpu里头还有控制器的吗 控制器要发出各种控制信号其中 最主要的也是大家马上就能想得来的一种 就是要去发出一个读命令,读存储器的命令 我们在前面的课程中 我们已经介绍过对存储器的操作就只有两种 读就是从那里头拿出来,写就是把东西放进去,就这两种 那么现在我们这个地址指向这个单元的目的 是要把这个B1H这个东西拿出来 所以我们现在要发出一个读存储器的命令 好这个命令一旦发出去当然还有其他 各种辅助相关的控制命令我们这里就不说了 假设把这些命令都发出来了 好下面这一步就是这个单元的内容B1H就被拿出来 拿出来以后送给谁呢 因为我们如果这个前提是我们B1H是指令的话 我们就拿回去送给指令译码了,就是让它去分析了 看看这条指令是做加法的还是做减法的 这就是一条指令的执行过程 那么这条一旦送走我们现在回来看 这个时候pc这个程序计数器里的值就已经被加过1了 被加了1了以后后 那么意思是说接着它要把它的内容再往 地址寄存器送的时候就不会再送的是1000F了 而是送的1001H了,因为它已经加一了,对吧 所以1001H指向的是哪个呢? 是现在内存单元底下的那个单元 所以下次要取的就是第二条指令 所以这个就是一次一次的我们指令就按照 这样的顺序一步一步的被取出来