冯诺依曼模型
根据 冯诺依曼模型 的定义,最简单的计算机基本结构由5部分组成:控制器、运算器、存储器、输入、输出。
在现代计算机中,控制器和运算器都是内嵌在CPU中,而存储器通常指的是内存,输入和输出则通常指的是键盘和显示器。
-
CPU有哪些组件?
CPU通常由
控制单元、逻辑运算单元、寄存器组成。-
控制单元:负责根据指令控制CPU工作,例如从内存中读取数据到寄存器,将寄存器中的两个数据进行加和运算等。 -
逻辑运算单元:负责计算 -
寄存器:包括通用寄存器、程序计数器、指令寄存器-
通用寄存器:用于存放需要运算的数据 -
程序计数器:用于存储下一个要执行指令的内存地址 -
指令寄存器:用于存放正在执行的指令
-
-
-
明明有了内存为什么CPU还需要寄存器?
因为CPU 从内存中读取数据的速度 与 直接从寄存器中读取数据的速度 差异是很大的!这是效率和造价等权衡下的层次化设计。
-
内存扮演什么角色?
在程序运行时,我们的 "程序本身" 和 "程序数据" 都是存储在
内存中,这是一段连续的线性区域。
一个基本的内存存储单位为1字节(8bit), 每一个字节对应一个内存地址。 -
总线扮演什么角色?
总线是将
CPU、内存、以及其他设备关联起来,负责他们之间的通信,总线可分为 3 种:地址总线、数据总线、控制总线-
地址总线,用于指定 CPU 将要操作的内存地址 -
数据总线,用于读写内存的数据 -
控制总线,用于发送和接收信号,比如中断、设备复位等信号,CPU 收到信号后自然进行响应,这时也需要控制总线
image.png当 CPU 要读写内存数据的时:
- 首先要通过「地址总线」来指定内存的地址
- 然后通过「控制总线」控制是读或写命令
- 最后通过「数据总线」来传输数据
-
线路位宽 和 CPU位宽
-
数据是如何通过线路传输的呢?线路位宽对效率有哪些影响?
其实是通过操作电压,低电压表示 0,高压电压则表示 1。
如果构造了"高低高"这样的信号,对应的二进制数据就是"101" ,十进制则表示"5"。如果只有一条线路,那么二进制数据"101"的需要传输3次,这样的效率通常是不可接受的。
那怎么办呢?只要多条线路一起传输就好!32位CPU 的[数据总线]位宽通常是
32条,意味着一次性能从内存读取4字节的数据。
32位CPU 的[地址总线]位宽通常是32条或36条, 意味着cpu最大的内存寻址能力是2^32=4G或2^40 -
CPU通常有
32位和64位, 它们的差异是啥?这里的位指的是"位宽", 即CPU一次运算能计算的数据量。
这里以32位CPU为例,32位CPU一次能计算4字节,能计算的最大整数 =
2^32 - 1=4294967295当然,这并不意味着32位计算机只能进行小于
4294967295的计算!
例如使用32位CPU进行加和2个64位大小的数字,CPU会先把原数字拆为高位低位2个数字,先进行低位数字加和,算出进位,然后再进行高位数字加和,再加上低位数字加和的进位,最后拼接得到结果。
程序执行的基本过程
程序实际上是一条一条指令,所以程序的运行过程就是把每一条指令一步一步的执行起来,负责执行指令的就是 CPU 了。
-
CPU 执行程序是怎么样的?
CPU 执行程序的过程如下:
- 第一步:
- CPU读取
[程序计数器]的值, 这里的值是下一个指令的内存地址。 - CPU的
[控制单元]操作[地址总线]指定需要访问的内存,并通知内存设备准备数据 - 数据准备好后通过
[数据总线]将指令数据传给 CPU - CPU 收到内存传来的数据后,将这个指令数据存入到
[指令寄存器]
- CPU读取
- 第二步:
-
[程序计数器]的值自增,表示指向下一条指令。这个自增的大小,由 CPU 的位宽决定,比如 32 位的 CPU,指令是 4 个字节,需要 4 个内存地址存放,因此「程序计数器」的值会自增 4;
-
- 第三步:
- CPU 分析
[指令寄存器]中的指令,确定指令的类型和参数 - 如果是计算类型的指令,就把指令交给
[逻辑运算单元]运算 - 如果是存储类型的指令,则交由
[控制单元]执行
- CPU 分析
简单总结一下就是,一个程序执行的时候,CPU 会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增,开始顺序读取下一条指令。
CPU 从程序计数器读取指令、到执行、再到下一条指令,这个过程会不断循环,直到程序执行结束,这个不断循环的过程被称为 CPU 的指令周期。
- 第一步:
参考: CPU 是如何执行程序的?
