CPU是如何执行程序的?
图灵机的工作方式
- 图灵机的基本组成
- 纸带:纸带由一个个连续的格子组成,每个格子可以写入字符,纸带就好比内存,而纸带上的格子的字符就好比内存中的数据或程序
- 读写头:可以读取只带上任意格子的字符,也可以把字符写入到纸带的格子
- 读写头上的部件-存储单元、控制单元、运算单元
- 存储单元用于存放数据
- 控制单元用于识别字符是数据还是指令、以及控制程序的流程等
- 预算单元用于执行运算指令
冯诺依曼模型
- 计算机的基本结构:运算器、控制器、存储器、输入设备和输出设备
- 运算器、控制器是在中央处理器里面的
- 存储器:内存
- 输入、输出设备是计算机外接的设备,键盘、显示器
- 内存
- 程序和数据是存储在内存,存储的区域是线性的
- 存储数据的基本单位是字节,一个字节等于8位bit,每一个字节都对应一个内存地址
- 内存的地址是从0开始编号的,然后自增排列,最后一个地址为内存总字节数-1,类似于数组,所以内存的读写任何一个数据的速度都是一样的
- 中央处理器-CPU
- 中央处理器就是CPU,32位CPU和64位CPU最主要的区别是一次可以计算多少字节的数据
- 32位CPU一次可以计算4个字节
- 64位CPU一次可以计算8个字节
- CPU内部还有一些组件:寄存器、控制单元、逻辑计算单元
- 控制单元:负责控制CPU工作
- 逻辑运算:负责计算
- 寄存器:很多种类,每种寄存器不一样
- 主要作用是存储计算时的数据
- 通用寄存器:用来存放需要进行运算的数据
- 程序计数器:用来存储CPU要执行下一条指令(所在的内存地址),注意部署存储了下一条要执行的指令,此时指令还在内存中,程序计数器只是存储了下一条指令的地址
- 指令寄存器:用来存放当前正在执行的指令,也就是指令本身,指令被执行完成之前,指令都存储在这里
总线
- 总线是用于CPU和内存以及其他设备之间的通信
- 地址总线:用于指定CPU将要操作的内存地址
- 数据总线:用于读写内存的数据
- 控制总线:用于发送和接收信号,比如中断、设备复位等信号,CPU收到信号后自然进行响应,这个时候也需要控制总线
- 当CPU读写内存数据的时候,一般需要通过下面这三个总线
- 地址总线来指定内存的地址
- 控制总线控制是读或写命令
- 数据总线用于传输数据
输入、输出设备
- 输入设备向计算机输入数据,计算机经过计算后,将数据输出给输出设备
- 如果输入设备是键盘,按下按键的时候是需要和CPU进行交互的,这个时候就会用到控制总线
线路位宽与CPU位宽
- 数据是通过线路进行传输的,通过操控电压,低电压表示0,高电压表示1
- 构造了高低高这样的信号,其实就是101二进制数据,十进制则表示5,如果只有一条线路,就意味着每次只能传递1bit的数据,即0或1,那么传输101这个数据,就需要三次才能完成,效率很低
- 一位一位传输的方式,称为串行,下个bit必须等待上一个bit传输完成才能进行传输,当然,一次想多传一些数据,增加线路即可,这时数据就可以并行传输
- CPU想要操作内存地址,需要地址总线
- 如果地址总线只有1条,那每次只能表示0或1这两种地址,所以CPU能操作的内存地址最大数量为2(2^1)个
- 如果地址总线有2条,那每次能表示00、01、10、11这四种地址,所以CPU能操作的内存地址最大数量是4(2^2)个
- 想要CPU操作4G大的内存,那么就需要32条地址总线2^32=4GB
- CPU位宽
- CPU的位宽最好不要小于线路位宽,32位的CPU最好和32位宽的线路搭配
程序执行的基本过程
- CPU执行程序的过程如下
- CPU读取程序计数器的值,这个值是指令的内存地址,然后CPU的控制单元操作地址总线指定需要访问的内存地址,接着通知内存数据准备数据,数据准备好之后通过数据总线将指令数据传给CPU,CPU收到内存传来的数据后,将这个指令数据存储到指令寄存器
- 程序计数器的值自增,表示指向下一条指令
- 这个自增的大小由CPU的位宽决定
- CPU分析指令寄存器中的指令,确定指令的类型和参数,如果是计算类型的指令,就把指令交给逻辑计算单元;如果是存储类型的指令,则交由控制单元执行
- 总结:一个程序执行的时候,CPU会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增,开始顺序读取下一条指令
- CPU的指令周期:CPU从程序计数器读取指令到执行再到下一条指令,这个过程会不断循环,直到程序执行结束
a=1+2执行具体过程
- 需要把程序翻译为汇编语言的程序,这个过程称为编译汇编代码
- 汇编代码需要汇编器翻译成机器码,这些机器码由0和1组成的机器语言,这一条条机器码,就是一条条的计算机指令,这个才是CPU能够真正认识的东西
- 程序编译过程中,编译器通过分析代码,发现1和2是数据,于是程序运行时,内存会有专门的区域来存放这些数据,这个区域就是数据段
- 注意:数据和指令是分开区域存放的,存放指令区域的地方称为正文段
- 指令
- 指令的内容是一串二进制数字的机器码,每条指令都有对应的机器码,CPU通过解析机器码来知道指令的内容
- 不同的CPU有不同的指令集,也就是对应着不同的汇编语言和不同的机器码
- MIPS的指令
- R指令:用在算数和逻辑操作,里面有读取和写入数据的寄存器地址,如果是逻辑位移操作,后面还有位移操作的位移量,而最后的功能码则是在前面操作码不够的时候,扩展操作码来表示对应的具体指令的
- I指令:用在数据传输、条件分支等,这个类型的指令,就没有了位移量和功能码,也没有了第三个寄存器,而是把这三部分直接合并成一个地址值或一个常数
- J指令:用在跳转,高6位之外的26位都是一个跳转后的地址
- 编译器在编译程序的时候会构造指令,这个过程叫做指令的编码
- CPU执行程序的时候,就会解析指令,这个过程叫做指令的解码
- 一个指令周期:取得指令--指令译码--执行指令--数据回写
- 取得指令:通过程序计数器读取对应内存地址的指令
- 指令存放在存储器里面
- 程序计数器和指令寄存器取出指令的过程是由控制器操作的
- 指令译码:CPU对指令进行解码
- 由控制器进行的
- 执行指令:CPU执行指令
- 算数操作、逻辑操作、数据传输、条件分支操作:算术逻辑单元操作的,也就是由运算器处理的
- 一个简单的无条件地址跳转,是直接在控制器里面完成的
- 数据回写:CPU将计算结果存回到寄存器或将寄存器的值存到内存中