大家好,我们在前面介绍了 从逻辑到基本逻辑运算到基本逻辑门电路 以及由他们组合出来的各种逻辑电路 学习这些的目的 实际上我们并不是希望大家一定要会设计多么复杂的逻辑电路 至少在我们这门课里达不到这样的目标 但是通过前面这些介绍 我们希望大家理解基本逻辑运算和逻辑门 同时我们希望大家从我们的一系列的描述中 大家逐渐理解或者说至少是了解一个硬件系统是如何由 这样作为原子细胞的基本逻辑门来通过 组合封装抽象再组合再封装再抽象 最后构造出各种各样复杂的逻辑电路 那么最终构成了我们的计算机 那么今天我们这一讲以及我们的下一讲 将会在以及由系统构造的这样的一个情况下 我们来解释计算机这样一个系统它的基本的工作过程 或者说它的工作原理 我们已经知道,计算机实际上能够做的事情只有一件事情 就是执行程序,而程序这个概念,本身大家都应该不陌生了 那么什么叫程序呢? 程序实际上由一系列的指令来组成的 那么下面我们先来说一下,到底什么是指令 指令可以描述成这样,就是由控制计算机完成某项工作 并且能够被计算机所识别的命令 这里有两个短语是大家一定要了解的 第一就是说控制计算机完成某项操作 谁控制计算机完成了,显然是我们人 所以指令的第一件事一定是 或者说指令的第一个特征就是首先是人能够认识的 第二个短语是能够被计算机所识别的命令 那么意味着你所写的指令计算机也要认识 所以我们所有的指令,是我们人要认识,计算机也要认识 这里的计算机能够认识的是什么 计算机能够认识的只有0和1 所以我们这里所说的指令,是用0和1来表述的指令 而不是我们这门课的后半部分将给大家讲的C语言编写的程序 c语言编写的程序是我们人能够认识的 严格的来讲,计算机是不认识的 那么你说我们编的程序为什么计算机能够运行呢 是因为有人编写了一个大大的软件 这个软件起着一种翻译的作用 它把我们所用c语言编写的程序 翻译成了计算机硬件认识的这种用0和1表示的程序 这个翻译的软件我们叫编译系统 当然这个在后边我们来讲 那么我们在这里所说的计算机硬件能够识别就是 只有是0和1这样的指令了 当然能够被计算机识别不是能够计算机的存储器识别 更不被它的接口识别,当然显然是被cpu所识别 那么这就带来了一个问题 我们是不是所有的cpu所认识的指令都是一样的呢 显然不是的,所以不同的cpu它能够认识的指令是不一样的 比如我们因特尔生产的cpu,他可能能够认识这样一种类型的指令 而另外苹果公司他们 另外的一些公司比如说我们其他的型号的一些cpu 比如我们因特尔公司生产的cpu 它可能认识这样一些指令,而其他公司生产的一些cpu 它可能认识就是另外的一些指令 所以不同的cpu它能够认识的指令是不一样的 那么还有一个意思 就是说着一个cpu是不是能够认识所有的指令 或者说cpu认识的指令数量是不是可以是无限的呢 肯定不是的,一个cpu所认识的指令一定是有限的 那么一个cpu所认识的所有的指令的集合,我们称为指令系统 显然cpu如果认识的指令越多,它的功能就越强 假设一个cpu它如果只能够认识加法运算指令 那么它就只能做加法,你要想让他做别的运算 你只能够通过软件想办法去实现 这样的cpu功能显然是很弱很弱的 那么如果这个cpu既能认识加减乘除还能认识与或非异或 甚至还能认识其他的各种各样的操作的指令 那么这cpu的功能就显然比较强 所以cpu能够认识的指令的集合 或者说它的指令集的多少 也是cpu的一个主要的性能指标之一 好,归结到最后 我们说程序是按一定的顺序组织在一起的指令序列 那么根据刚才我们的指令的描述或者指令的定义 我们马上想到指令的一般的格式是这样 就首先我们要有表述这个指令是干什么的 这样一个部分叫指令码 所以指令里边有两个大部分组成 指令码表述指令执行什么样的功能 操作数表示指令对谁来做 就是它的操作对象是什么.这个就是指令的一般格式 一条指令,在因为计算机能够做的工作就是执行程序 而程序又是指令的序列 所以计算机的工作实际上就是执行指令的工作 那么在计算机中间 一个指令或者程序它的工作过程是个什么样的呢 详细的过程我们等一下来说 为了描述清楚这里指令的执行过程 所以我们先来看先来假设一下 我们编写的程序不论我们用什么样的语言来编写 编写完了以后我们一定是要把它存放在硬盘上的 那么不管存放在硬盘的c盘也好 d盘也好那都是硬盘的分区 但是存放在硬盘上的程序是没有办法直接执行的 这一点我们到操作系统这一部分再来解释 那么程序要想被执行,它一定要放在哪里 要放在内存中,到了内存中以后,谁来执行程序呢 或者说谁来执行这些指令那,显然是cpu 所以cpu要想要来执行程序,或者要来执行指令的时候 它首先要到内存中间去把指令和指令的操作对象 也就是它的数据要取过来取到cpu里 然后执行完了以后它把结果再送回到内存中 这个是整个计算机它执行程序最基本的一个过程 那么从程序归结到指令 那么这样一个过程我们来怎么描述它 我们可以来想象一下 cpu到内存要读取过来,所以第一件事 从内存里把指令读取过来,读取过来以后呢 我们要知道这条指令是干什么的 也就是说到底是做加法的还是做减法的等等 所以第二步我们要去分析一下这条指令的功能是什么 比如我们分析完了发现它是做加法 好那么谁加谁,它的加的对象是谁 加数和被加数我们要去取过来,取过来以后 当然我们就要去求和了,对吧,所以就是执行 执行完了以后我们是不是要把和送回去 所以这就要传送结果 这就是一条指令它执行的全部的过程 就是这个五个步骤,首先要取指令 第二件事情我们要知道指令是干什么的 我们称为分析指令或者指令译码都是这样一个意思 分析完了或者译码完了以后,我们要去获取操作对象 然后要去执行这个指令,最后传送结果 在这样五个完整的步骤里头 有三个步骤是必须要有的,我们称为核心步骤 为什么这三个步骤是核心,其他两个不是呢 我们加减乘除显然是需要取操作数要有结果送回去 但是有一些指令它的执行对象就是cpu自己 也就是相当于你肚子饿了 其实你是不需要给别人说的 你是在自己身体内部 就构成一个一个神经反应到大脑然后一个循环过程 在你体内就完成了,那么也就是说别人是不知道的 那么你的这个过程就不需要再告诉人家 但是这三个步骤,比如取指令我们是一定要去取回来 不取就没有指令可执行 取回来之后我们一定要知道它是干什么的 然后这条指令的取回来的目的是一定要执行的 所以这三个步骤是一定要有的 那么就像刚才我们说我们饿了 在这个的反应在体内的过程是一定要有的 但是因为我们不需要告诉别人 所以我们不需要到外面取操作对象 所以我们也就不需要去把结果拿回去 所以下边,我们就以这样三个基本的或者核心的步骤为例 来描述整个计算机里头指令的执行过程 或者说它的运行方式 指令在cpu里的执行方式可以说总体有这样两种 一种我们称为顺序的方式,一种是并行的方式 所以顺序的方式,就是这三个步骤描述的这一条指令的执行 执行完了以后再去执行下一条指令,在今天的cpu里头 取指令是由专门的取指令部件来做的来完成的 分析指令是用专门指令分析或者指令译码部件来来完成的 那么执行指令由专门的执行部件也就是alu来做的 那么也就是说这是三个独立的部件 就相当于我们一件事由三个人来完成一样 这三个人来完成,可以说第一个人做完的事情的结果 它负责把指令取过来,由第二个人来分析指令 第二个人分析完了以后把结果再送回去 送给第三个人第三个人负责指令的执行 大家是一个顺序的过程 然后这三个人依次把这样一条指令的执行结果 执行完了以后,好,第一个人再去取下一条指令过来 然后第二个人再去分析第二条指令 第三个人再执行第三条指令,这就是所谓的顺序过程 顺序的过程里边 大家可以看到任意一个时刻实际上是有两个人在闲着 一个人在执行,那么这种听上去效率就不是很高 那么并行,就是我们三个人同时在工作 或者说在这里的三个部件同时在工作 具体怎么样并行,怎么样顺序 我们下面来用图来描述它 顺序执行就是刚才我们举的这个例子 取指令部件去取第一条指令,然后交给分析指令的部件 然后由它来分析,然后交给执行指令部件,由它来执行 好就此第一条指令执行结束,然后开始第二条指令 这样子的过程我们如果假设这三个部件所花的三个时间 都是完全一样的话,我们执行n条指令 所需要的时间可以是这样子 如果每一个部件所花去的时间都是一个Δt的话 执行n条指令显然需要有三个3n个Δt这个表达式似乎很短 那么如果这个n就表示我们指令的条数 如果n大家想象如果是一个百万级的指令的话 就是100万条指令的话,一个Δt那么是一个微秒 它所花的时间也是比较长的 那么相应的并行执行我们来看一下,所谓并行执行 也就是说我们还是以这三个基本核心步骤为例来讲 假设我们对第一条指令来讲 因为一开始,对吧所以取指令部件先要去取第一条指令 取过来以后它把它交给分析指令部件去分析 然后再交给执行部件去执行 那么因为它交给分析指令部件分析的时候 取指令部件就空闲了那么这个时候它就可以去取第二条指令 假设它把第二条指令取过来正好第一条指令分析结束 那么这个时候它就可以分析指令了 那么第一条指令那个就可以被执行 假设第二条指令分析完了第一条指令正好执行完 执行部件空闲那么执行部件就可以拿来执行第二条指令 以此我们第三条第四条一直到第n条都可以是这样 这就是并行执行的一种工作方式 大家看这个图,只有第一条指令它确定的需要这样三块时间 那么从第二条指令开始每一个时间里头 就会有一条指令的结果被输出 或者说每一条就会有一条执行结束 还是跟像刚才那样,假设我们分析指令 执行指令和取指令每一个的时间都是一样 那么它的每一个时间都是一个Δt的话 那么按照这样并行的方式,它的执行时间就是这样的一个表达 第一条指令是3个Δt其余的n-1条指令都只需要一个Δt就完成了 这样子的方式大家可以想象成 是不是有点像我们水管里的水一样的 就是说一打开水龙头,只有第一滴水它需要时间长一点 之后那它就会依次的哗哗的流下来 假设我们每一个执行的时间都准确的 完全相同的一个Δt时间的话 那么整个程序的执行过程就像水管里的水一样 会源源不断的将结果从最后这个点输出 这个其实就是一个我们今天计算机里 非常经典的一种原理叫流水线原理 当然大家看这个图我们会发现 我们有太多的假设首先我们要假设 我们每一个部件所用的时间完全一样 第二个假设我们每一条指令都没有牵扯到 取操作对象就是操作数也没有牵扯到存结果 所以我们事实上按照这样子的简单的方法 我们是没有办法达到流水线这样一直流下去 也就是说我们的水是会断流的 当然今天计算机为了保证这个流水线不断流 它用了各种各样在硬件和软件上 采用了各种各样的方法 那个是我们后续课程里学习的时候再给大家解释 好,下边我们来对比一下顺序和并行执行他们的效率 最简单的从人类社会的工作原理 顺序一个人做完再给下一个人做 这就像我们电视里演的流水线上的工人一样 每个人只做一个简单的操作然后他做完给下一个 下一个人做完再往下一个下去,那么这种时候 任意一个时刻如果要完成一个工作 我们都会只有一个人实际上在这样一个时间点上只有一个在忙 其他人都是空闲的,那么这样子的方式显然是效率比较低 但是它控制很简单 但是并行是同时有多个人大家都是工作 那么显然它的效率就会高 当然了因为同时要工作显然就有一个协调的问题 所以它的复杂度就会更高 并行处理是今天计算机里头 非常重要的一种处理技术 不论软件也好硬件也好 我们都是需要都是希望能够并行的进行的 并行工作比如今天大家都可能听到过的 多核处理器这样一个多核的概念 像今天手机里的很多cpu也都是多核的 多核的意思就是多个运算器在同时工作 这样我们今天的处理的速度或者计算机的速度才会越来越高 我们手机的性能也才越来越强 所以并行是我们今天非常流行 或者也是非常重要的一种技术或者一种概念 希望通过这样一个简单的指令的这样一个描述 给大家先建立一个入门级的了解就是什么叫并行 好了为了加深这个并行它所带来的这种效率上的提高 我们来和顺序执行进行一下比较 就是顺序执行和并行执行它们之间的优势 我们用一个名字叫做加速比的指标来表示 加速比的意思是顺序执行所花费的时间 与并行执行所花费的时间的比值 我们用刚才那个例子我们刚才那个例子里头 顺序执行是执行n条指令用了3n个Δt 而并行顺序执行用了3n个Δt而并行执行是3个Δt加上n-1个Δt 好,它们的相除下来的结果就是这样一个结果3n除以2+n 随着n值的增大我们会发现加速比会越来越大 加速比越大说明我们的并行的效率就越高 好有关指令和程序的概念以及指令的执行方式 我们今天就讲到这里 这种指令的执行方式实际上在我们下一讲的冯诺依曼结构 里面我们会进一步的用到今天所讲的一些概念和原理 好,谢谢大家