计算机原理(一)——冯诺依曼体系和CPU工作原理
冯诺依曼体系结构
- 现代计算机,大部分都是基于冯诺依曼体系结构。
- 冯诺依曼的核心是:存储程序,顺序执行。
冯诺依曼体系结构的特点
- 计算机处理的数据和指令一律用二进制数表示;
- 指令和数据不加区别混合存储在同一个存储器中;
- 顺序执行程序的每一条指令;
- 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
冯诺依曼体系结构的计算机必须具有如下功能:
- 把需要的程序和数据送至计算机中;
- 必须具有长期记忆程序、数据、中间结果及最终运算结果的能力;
- 能够完成各种算术、逻辑运算和数据传送等数据加工处理的能力;
- 能够根据需要控制程序走向,并能根据指令控制机器的各部件协调操作;
- 能够按照要求将处理结果输出给用户。
计算机工作原理
对于现代计算机来说,最关键的2个部件就是CPU和内存。内存存储了要执行的程序指令,而CPU就是用来执行这些指令。CPU首先要知道这些指定存放在存储器的那个区域,然后才能执行,并且把执行的结果写入到执行区域。
CPU指令和编程语言
CPU指令
计算机中指令和数据都用二进制来表示,也就是说它只认识0和1这样的数字。最早期的计算机程序通过在纸带上打洞来人工操操作的方式来模拟0和1,根据不同的组合来完成一些操作。后来直接通过直0和1编程程序,这种称之为机器语言。这里就会有一个疑问,计算机怎么知道你这些组合的意思?
于是就出现了CPU指令。CPU指令其实就对应了我们这里说的0和1的一些组合。每款CPU在设计时就规定了一系列与其硬件电路相配合的指令系统。有了CPU指令集的文档你就可以通过这个编写CPU认识的机器代码了。所以对于不同CPU来说可能会有不同的机器码。
汇编语言
使用0和1这样的机器语言好处是CPU认识,可以直接执行,但是对于程序本身来说,没有可读性,难以维护,容易出错。所以就出现了汇编语言,它用助记符代替操作码指令,用地址符号代替地址码。实际是对机器语言的一种映射,可读性高。
把汇编语言转换为机器语言需要一个叫做汇编器的工具。对于目前的CPU厂商,在推出的CPU指令时都会同时推出新的汇编器。
高级语言
汇编语言的出现大大提高了编程效率,但是有一个问题就是不同CPU的指令集可能不同,这样就需要为不同的CPU编写不同的汇编程序。于是又出现了高级语言比如C,或者是后来的C++,Java,C#。 高级语言把多条汇编指令合成成为了一个表达式,并且去除了许多操作细节(比如堆栈操作,寄存器操作),而是以一种更直观的方式来编写程序,而面向对象的语言的出现使得程序编写更加符合我们的思维方式。我们不必把尽力放到低层的细节上,而更多的关注程序的本身的逻辑的实现。
对于高级语言来说需要一个编译器来完成高级语言到汇编语言的转换。
小结
程序最终都将变成机器认识的二进制可执行程序,然后加载到内存顺序的执行。
C#和JAVA程序编译出来的文件不是二进制的机器码,而是中间语言,那么他们又是怎么运行的呢?
首先是预处理器,如果在项目中有头文件和宏表达式,那么它将负责包含头文件和翻译所有的宏观表达式。
接下来是编译器,它不是直接生成二进制代码,而是生成汇编代码(.s),这基本上是所有现代的非结构化语言的共同基础。
然后,汇编程序把汇编代码翻译成目标代码(.o和.obj文件,机器指令)。
最后链接器,它把所有彼此相关的目标文件和生成的可执行文件或库链接起来。
CPU工作原理
CPU功能
- 指令控制: 指令控制也称为程序的顺序控制,控制程序严格按照规定的顺序执行。
- 操作控制: 将取出的指令的产生一系列的控制信号(微指令),分别送往相应的部件,从而控制这些部件按指令的要求进行工作。
- 时间控制: 有些控制信号在时间上有严格的先后顺序,如读取存储器的数据,只有当地址线信号稳定以后,才能通过数据线将所需的数据读出,否则读出的数据是不正确的数据,这样计算机才能有条不紊地工作。
- 数据加工: 所谓数据加工,就是对数据进行算术运算和逻辑运算处理。
CPU基本组成
以前CPU主要由运算器和控制器两大部分组成,随着集成电路的发展,目前CPU芯片集成了一些其它逻辑功能部件来扩充CPU的功能,如浮点运算器、内存管理单元、cache和MMX等。
对于一个通用的CPU来说,我们只需要关注他的核心部件算数逻辑单元和操作控制单元。
1、控制器的组成和功能: 控制器由程序计数器、指令寄存器、指令译码器、时序产生器和操作控制器组成。它是计算机指挥系统,完成计算机的指挥工作。尽管不同计算机的控制器结构上有很大的区别,当就其基本功能而言,具有如下功能:
- 取指令 :从内存中取出当前指令,并生成下一条指令在内存中的地址。
- 分析指令 :指令取出后,控制器还必须具有两种分析的功能。一是对指令进行译码或测试,并产生相应的操作控制信号,以便启动规定的动作。比如一次内存读/写操作,一个算术逻辑运算操作,或一个输入/输出操作。二是分析参与这次操作的各操作数所在的地址,即操作数的有效地址。
- 执行指令: 控制器还必须具备执行指令的功能,指挥并控制CPU、内存和输入/输出设备之间数据流动的方向,完成指令的各种功能。
- 发出各种微操作命令 :在指令执行过程中,要求控制器按照操作性质要求,发出各种相应的微操作命令,使相应的部件完成各种功能。
- 改变指令的执行顺序: 在编程过程中,分支结构、循环结构等非顺序结构的引用可以大大提供编程的工作效率。控制器的这种功能可以根据指令执行后的结果,确定下一步是继续按原程序的顺序执行,还是改变原来的执行顺序,而转去执行其它的指令。
- 控制程序和数据的输入与结果输出: 这实际也是一个人机对话的设计,通过编写程序,在适当的时候输入数据和输出程序的结果。
- 对异常情况和某些请求的处理 :当计算机正在执行程序的过程中,发生了一些异常的情况,例如除法出错、溢出中断、键盘中断等。
2、运算器的组成和功能: 运算器由算术逻辑单元(ALU)、累加寄存器、数据缓冲寄存器和状态条件寄存器组成,它是数据加工处理部件,完成计算机的各种算术和逻辑运算。相对控制器而言,运算器接受控制器的命令而进行动作,即运算器所进行的全部操作都是由控制器发出的控制信号来指挥的,所以它是执行部件。运算器有两个主要功能:
- 执行所有的算术运算:如加、减、乘、除等基本运算及附加运算;
- 执行所有的逻辑运算:并进行逻辑测试,如与、或、非、零值测试或两个值的比较等。
CPU工作流程
CPU的基本工作是执行存储的指令序列,即程序。程序的执行过程实际上是不断地取出指令、分析指令、执行指令的过程。
几乎所有的冯·诺伊曼型计算机的CPU,其工作都可以分为5个阶段:取指令、指令译码、执行指令、访存取数和结果写回。
指令周期
- 指令周期: CPU取出一条指令并执行该指令所需的时间称为指令周期。指令周期的长短与指令的复杂程度有关。
- CPU周期:从主存读取一条指令的最短时间来规定CPU周期。指令周期常常用若干个CPU周期数来表示。
- 时钟周期:时钟周期是处理操作的最基本时间单位,由机器的主频决定。一个CPU周期包含有若干个时钟周期。
从上面的定义可以知道,对于CPU来说取出和执行任何一条指令所需的最短时间为两个CPU周期。所以频率越高,那么时钟周期越短,这样CPU周期和指令周期也就越短,理论上程序执行的速度也越快。但是频率不能无限的提高,而且频率的提高也带来了功耗,发热等问题,所以目前也有超线程,流水线等技术来提高CPU执行的速度。
时序发生器
- 时序信号: 在计算机高速运行的过程中,计算机内各部件的每一个动作都必须严格遵守时间规定,不能有任何差错。计算机内各部件的协调动作需要时间标志,而时间标志则是用时序信号来体现的。计算机各部分工作所需的时序信号,在CPU中统一由时序发生器来产生。
- 时序发生器: 时序信号发生器是产生指令周期控制时序信号的部件,当CPU开始取指令并执行指令时,操作控制器利用时序信号发生器产生的定时脉冲的顺序和不同的脉冲间隔,提供计算机各部分工作时所需的各种微操作定时控制信号,有条理、有节奏地指挥机器各个部件按规定时间动作。
小结
CPU要顺序执行一个程序的指令,首先是控制器获得第一条指令的地址,当CPU取得这个指令并执行后,控制器需要生成下一条要执行的指令的地址。ALU单元负责一些运算操作。
指令和数据都存放在内存中,那么CPU怎么区分是指令还是数据呢?
从时间上来说,取指令事件发生在指令周期的第一个CPU周期中,即发生在“取指令”阶段,而取数据事件发生在指令周期的后面几个CPU周期中,即发生在“执行指令”阶段。
从空间上来说,如果取出的代码是指令,那么一定送往指令寄存器,如果取出的代码是数据,那么一定送往运算器。