本文分5个小结,分别是图灵机工作方式,冯诺依曼结构,总线线路位宽和CPU位宽,程序执行的基本过程, a=1+2的具体执行过程。
一 图灵机的工作方式
图灵机由纸带,读写头组成。读写头上有一些部件例:存储单元,控制单元,运算单元。
存储单元用来存储存放数据,存储单元也叫图灵机的状态。控制单元用来判断字符是数据还是指令,运算单元用来数据的运算。
纸带就好比内存,由一个个连续的小格子组成了纸带,就好比多个存储单元构成了内存。每个小格子都可以写入字符。字符就是数据。
举个例子:计算1+2,图灵机怎么做处理?
1)读写头将[1,2,+]三个字符写入到三个纸带的小格子上。读写头处在1的位置。
2)读写头将1写入到存储单元(图灵机的状态),右移读写头,将2也写入到存储单元。再次右移,发现是+运算符,读写头将运算符加入到控制单元,控制单元发现是个运算符便会通知运算单元做运算。
3)将运算结果返回给控制单元,控制单元再把结果传给读写头,读写头右移将结果写入格子中。
二 冯诺依曼结构
采用冯诺依曼结构是因为:用较少的钱可以做出速度不错的计算机。
冯诺依曼和其他科学家规定了沿用图灵机的设计并将二进制进行计算和存储。并将计算机基本结构定义为5个部分,中央处理器(CPU),内存,输入输出设备,总线。
2.1 内存
内存: 启动的程序和数据都存在内存中,内存的存储单位是字节。每个存储单元里面存储的就是一串二进制数字。内存的地址是从全0开始编号,自增长排序,最后一个位置的地址自然就是内存大小转化为字节数-1。
2.2 CPU
CPU: 平常谈到的CPU大致就是32位宽和64位宽。区别在于32位宽的CPU一次可计算32位,也就是4字节大小的数字,64位一个意思,一次可计算8字节大小的数字。CPU内部还有一些比较重要的组件,寄存器,控制单元,逻辑运算单元。控制单元负责控制CPU工作,逻辑运算单元负责计算的。
额外补充:寄存器分类: 1)通用寄存器,存放运算数据。 2)程序计数器,pc指针,eip,存储下一条二进制指令在内存的地址。 3)指令寄存器,存储程序计数器指向的指令的具体内容。 为什么有了内存了,还要寄存器? 因为CPU和内存很远,为了提高效率所以就有了寄存器。
2.3 总线
总线分类: 地址总线,数据总线,控制总线。用于CPU和内存之间或者是CPU和其他设备之间的通信。 1)地址总线:CPU将要操作的内存的地址是哪个 2)数据总线:同于读写发送和接收的数据 3)控制总线:接收发送信号。举个例子,输入设备将数据输入到计算机,计算机将数据输出到输出设备就需要用到控制总线。
2.4 输入输出设备
输入输出设备:不用说,就是外设。
输入输出设备是计算机系统中用于与外部世界交换信息的设备。它们可以帮助用户输入数据到计算机系统中,或者将计算机系统处理的数据输出给用户或其他设备。
三 总线线路位宽和CPU位宽
数据的传输就是通过操作电压,高电压是1低电压是0,高低电压构成的信号,就是类似 1010 这样的二进制数据。十进制就表示为10。
如果只有一条线路,一次就只能有一个高电压或者低电压,就说明一次只能表示一个1或者只能表示一个0。那么想传输1010就得进行四次的高低电平的转换。一次一位这样的传输称为串行(学过初中物理都知道电路有串联和并联两种,这里就和电路一个意思),这样传输时非常慢的,上一个1或者0传输完才轮到下一个1或者0传输。
为了提高效率就不能串行,就得并行。所以总线线路的位宽最好能一次就可以访问到所有的内存地址,CPU想要操作内存地址就需要用到地址总线。所以如果一个内存的大小时是4GB,那么就需要用到32条线路。因为2的32次方是4G。
CPU的位宽:指的是中央处理器(CPU)一次能够处理的数据位数。例如,一个32位CPU可以一次处理32位的数据。CPU的位宽不要小于线路位宽。比如32位宽的CPU控制40位宽的地址总线和数据总线的话,就要考虑到兼容什么的,所以一般CPU位宽和线路位宽一样就行。 注意:64位宽的CPU不一定比32位宽的就快,因为很少的程序能计算比4字节还大的数字。其次,如果是CPU是32位宽,装8GB的内存条也是浪费的,因为32为CPU只能计算4字节的数字,8GB的内存条地址范围太大。
四 程序执行的基本过程
指令是由CPU一条一条执行的。大致分四步。
1) CPU读取程序计数器中的下一条二进制指令在内存的地址。然后CPU的控制单元操作地址总线访问指定的内存地址,接着通过数据总线将地址存储的二进制指令存入指令寄存器中。
2) CPU利用解码单元对代码解码,由代码解析为汇编再解析成二进制机器码。
3) CPU分析指令寄存器中的值,确定指令的类型和参数,如果是计算类型的指令就交给CPU的逻辑运算单元,如果是存储类型指令,就交给控制单元。做完工作将结果存回寄存器或者将寄存器的值写回到内存。
4) CPU执行完后,程序计数器的值自增,自增的大小,由CPU的位宽决定,32位宽的CPU就自增4。64位宽的CPU就会自增8.。
这四步称为一个CPU指令执行周期。
补充:汇编语言中,常见的指令可以按照其功能进行分类,包括数据传输指令、运算指令、跳转指令和其他类型的指令。这些分类是为了更好地组织和理解不同类型的指令。
1) 数据传输指令:比如store/load是内存和寄存器间数据传输的指令。mov是将一个地址的数据动到另一个地址中。
2) 运算指令:这类指令用于进行各种算术和逻辑运算操作。它们可以包括加法、减法、乘法、除法、位操作等。
3) 跳转指令:这类指令用于控制程序的执行流程,编程中if-else/switch-case。
4) 信号类型指令:这类指令用于与硬件设备进行通信,控制输入输出等操作。例如,读取或写入设备寄存器、发送中断请求等。
5)其他类型指令
补充:指令的执行速度: GHZ是指时钟频率,1GHZ的CPU意思是1秒会产生1G(十亿)次数的脉冲信号,脉冲信号的本质是高低电平之间的转换。每一次的脉冲信号就是一个周期,称为是时钟周期。
对于CPU来说,一个周期CPU只能完成一个最基础的动作,时钟频率越高,时钟周期就越短,工作速度就快。 通常一条指令在一个周期是不能被执行完的。
那怎么程序跑的更快呢?
程序执行时消耗的CPU时间少就是快,对于程序占据CPU的时间可拆解为,时钟周期数量*时钟周期时间 = 指令数目*指令平均时钟周期(CPI)*时钟周期时间。 时钟周期时间就是前面提到的CPU主频,GHZ越高,主频越高,速度就快。 指令数:执行程序所需要多少指令,这基本就是靠编译器优化,同样代码在不同的编译器编译出来的二进制机器指令不同。 CPI:现代CPU一般都是用的流水线技术,让一条指令需要的时钟周期尽量少点。 时钟周期时间:表示计算机主频(GHZ),取决于计算机硬件,有的CPU支持超频技术,超频就是把CPU内部的时钟调快了(永杰无间超频的话,出刀快)。有好处也有坏处,超频的话,CPU的散热压力大了,容易崩溃。
一些题外话: 32位的软件,64位的软件是什么意思?
代表指令是64位还是32位的,比如软件要在内存存储数据,这个在内存的地址就是64位。
64位的操作系统可以运行在32位的电脑上吗,反过来呢?
操作系统也是一个软件,32和64就是代表指令的位数,64位的操作系统通常无法在32位的电脑上正常运行,因为64位操作系统需要兼容64位处理器架构才能正确工作。一些旧的32位操作系统可能可以在支持64位处理器的计算机上运行,但性能可能会受到限制.32位的指令在64位机器上运行需要一套兼容机制,64位指令在32位机器上指令可以是可以,不过很困难,因为计算要分很多步骤。
总之,硬件说的64位和32位指的是CPU的位宽,软件说的是指令的位宽和总线线路的位宽。指令的位宽:指的是处理器每次能够处理的指令的位数。例如,一个64位指令集的处理器每次可以处理64bit位的二进制指令。指令的位宽直接影响处理器对指令的解析和执行能力。 地址总线的位宽:指的是处理器能够寻址的内存地址空间的大小。
五 a=1+2的具体执行过程
CPU是不认识a=1+2形式的,这只是为了方便程序员看的。要想让这段代码跑起来,就得转换成CPU能看的语句。所以要把程序翻译成汇编语言,这个过程叫做编译成汇编代码。 这还不够,之前说过冯诺依曼结构是让二进制作为机器语言,所以还要将汇编代码转化为二进制机器代码。这一条条的二进制代码才是CPU要执行的代码。
在程序运行时,要执行的二进制代码在进程地址空间的代码段存储二进制指令。具体的数据存在进程地址空间的其他区。
顺便说一下,不同的CPU由不同的指令集,就是不同的汇编代码转化成什么二进制机器指令的说明书。比如最简单的MIPS指令集。