CPU是如何执行程序的

发布于:2025-07-01 ⋅ 阅读:(21) ⋅ 点赞:(0)

部分内容来源:小林coding 


冯诺伊曼模型

运算器

控制器

存储器(内存)

输入设备

输出设备

运算器和控制器是在CPU里面的

存储器就是常见的内存

输入输出设备是连接计算机的外设,例如键盘就是输入设备,显示器就是输出设备


 内存

程序和数据都是存储在内存中的,存储的区域是线性的

在计算机存储中,存储数据的基础单位是字节 byte

一字节等于八位 bit

每一个字节都对应一个内存地址

内存的地址都是从0开始编号的,然后地址自增排列,最后一个地址位内存总字节数-1

这样的结构就类似于数组,所以内存读写任何一个数据的速度是一样的


CPU-中央处理器

中央处理器也就是我们常说的 CPU,32 位和 64 位 CPU 最主要区别在于一次能计算多少字节数据

  • 32 位 CPU 一次可以计算 4 个字节
  • 64 位 CPU 一次可以计算 8 个字节

这里的 32 位和 64 位,通常称为 CPU 的位宽,代表的是 CPU 一次可以计算(运算)的数据量

之所以 CPU 要这样设计,是为了能计算更大的数值,如果是 8 位的 CPU,那么一次只能计算 1 个字节 0~255 范围内的数值,这样就无法一次完成计算 10000 * 500 ,于是为了能一次计算大数的运算,CPU 需要支持多个 byte 一起计算,所以 CPU 位宽越大,可以计算的数值就越大,比如说 32 位 CPU 能计算的最大整数是 4294967295

CPU 内部还有一些组件,常见的有寄存器、控制单元和逻辑运算单元等

控制单元负责控制 CPU 工作

逻辑运算单元负责计算

而寄存器可以分为多种种类,每种寄存器的功能又不尽相同

CPU 中的寄存器主要作用是存储计算时的数据,你可能好奇为什么有了内存还需要寄存器?

原因很简单

因为内存离 CPU 太远了,而寄存器就在 CPU 里

寄存器还紧挨着控制单元和逻辑运算单元,自然计算时速度会很快

常见的寄存器种类:

  • 通用寄存器,用来存放需要进行运算的数据,比如需要进行加和运算的两个数据。
  • 程序计数器,用来存储 CPU 要执行下一条指令「所在的内存地址」,注意不是存储了下一条要执行的指令,此时指令还在内存中,程序计数器只是存储了下一条指令「的地址」。
  • 指令寄存器,用来存放当前正在执行的指令,也就是指令本身,指令被执行完成之前,指令都存储在这里。

总线

总线是用于 CPU 和内存以及其他设备之间的通信,总线可分为 3 种:

  1. 地址总线:用于指定 CPU 将要操作的内存地址
  2. 控制总线:用于发送和接收信号,比如中断、设备复位等信号,CPU 收到信号后自然进行响应,这时也需要控制总线
  3. 数据总线:用于CPU和内存之间传输数据

CPU读写内存时总线传输流程:

  • 首先要通过「地址总线」来指定内存的地址;
  • 然后通过「控制总线」控制是读或写命令;
  • 最后通过「数据总线」来传输数据;


 输入输出设备

流程:输入设备向计算机输入数据,计算机经过计算后,把数据输出给输出设备

期间,如果输入设备是键盘,按下按键时是需要和 CPU 进行交互的,这时就需要用到控制总线了


线路位宽与CPU位宽

数据是如何通过线路传输的呢?

其实是通过操作电压

低电压表示 0

高压电压表示 1

如果构造了高低高这样的信号,其实就是 101 二进制数据,十进制则表示 5,如果只有一条线路,就意味着每次只能传递 1bit 的数据,即 0 或 1

那么传输 101 这个数据,就需要 3 次才能传输完成,这样的效率非常低

传输方式分为串行和并行
串行:只有一条线路,下一个 bit 必须等待上一个 bit 传输完成才能进行传输

并行:多条线路传输数据


线路位宽

为了避免低效率的串行传输的方式,线路的位宽最好一次就能访问到所有的内存地址

CPU 想要操作「内存地址」就需要「地址总线」

  • 如果地址总线只有 1 条,那每次只能表示「0 或 1」这两种地址,所以 CPU 能操作的内存地址最大数量为 2(2^1)个(注意,不要理解成同时能操作 2 个内存地址);
  • 如果地址总线有 2 条,那么能表示 00、01、10、11 这四种地址,所以 CPU 能操作的内存地址最大数量为 4(2^2)个

那么,想要 CPU 操作 4G 大的内存,那么就需要 32 条地址总线,因为 2^32 = 4G


CPU位宽

CPU 的位宽最好不要小于线路位宽

比如 32 位 CPU 控制 40 位宽的地址总线和数据总线的话,工作起来就会非常复杂且麻烦

所以 32 位的 CPU 最好和 32 位宽的线路搭配

因为 32 位 CPU 一次最多只能操作 32 位宽的地址总线和数据总线


 

如果用 32 位 CPU 去加和两个 64 位大小的数字,就需要把这2个64位的数字分成2个低位32位数字2 个高位 32 位数字来计算

先加个两个低位的 32 位数字算出进位

然后加和两个高位的 32 位数字,最后再加上进位就能算出结果了

可以发现 32 位 CPU 并不能一次性计算出加和两个 64 位数字的结果


 

对于 64 位 CPU 就可以一次性算出加和两个 64 位数字的结果,因为 64 位 CPU 可以一次读入 64 位的数字,并且 64 位 CPU 内部的逻辑运算单元也支持 64 位数字的计算。


 

但是并不代表 64 位 CPU 性能比 32 位 CPU 高很多,很少应用需要算超过 32 位的数字,所以如果计算的数额不超过 32 位数字的情况下,32 位和 64 位 CPU 之间没什么区别的,只有当计算超过 32 位数字的情况下,64 位的优势才能体现出来。

32 位 CPU 最大只能操作 4GB 内存,就算你装了 8 GB 内存条,也没用

而 64 位 CPU 寻址范围则很大,理论最大的寻址空间为 2^64


程序执行的基本过程

程序实质上是一条一条指令,所以程序运行的过程就是将指令一步一步执行,CPU是负责执行指令的

那 CPU 执行程序的过程如下:

  • 第一步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过「数据总线」将指令数据传给 CPU,CPU 收到内存传来的数据后,将这个指令数据存入到「指令寄存器」。
  • 第二步,「程序计数器」的值自增,表示指向下一条指令。这个自增的大小,由 CPU 的位宽决定,比如 32 位的 CPU,指令是 4 个字节,需要 4 个内存地址存放,因此「程序计数器」的值会自增 4;
  • 第三步,CPU 分析指令寄存器」中的指令,确定指令的类型和参数,如果是计算类型的指令,就把指令交给「逻辑运算单元」运算;如果是存储类型的指令,则交由「控制单元」执行;

简单总结:一个程序执行的时候,CPU 会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增 开始顺序读取下一条指令

CPU 的指令周期:CPU 从程序计数器读取指令、到执行、再到下一条指令,这个过程会不断循环,直到程序执行结束


快速复习

冯诺伊曼模型:运算器,控制器,存储器(内存),输入设备,输出设备

内存:线性存储的存储单元,基础单位是字节 byte,一字节等于8bit,内存读写任何一个数据的速度是一样的


CPU-中央处理器:

  1. CPU内部有寄存器,控制单元,存储单元
  2. CPU的位宽越大,可计算的值就越大
  3. 32位的CPU一次性可计算4个字节,64位的CPU一次性可计算8个字节
  4. CPU的寄存器用来存储运算时数据,因为内存离 CPU 太远了,而寄存器就在 CPU 里,寄存器紧挨着控制单元和逻辑运算单元,计算时速度会很快
  5. 寄存器分类:通用寄存器,程序计数器,指令寄存器

总线:

总线用于CPU与内存等其他设备之间的通信

三类总线:控制总线,地址总线,数据总线

CPU读写内存时总线传输流程:

  • 通过「地址总线」来指定内存的地址;
  • 通过「控制总线」控制是读或写命令;
  • 通过「数据总线」来传输数据;

输入输出流程:输入设备向计算机输入数据,计算机经过计算后,把数据输出给输出设备


线路位宽与CPU位宽

数据通过操作电压来进行线路传输,低电压表示0,高电压表示1

CPU 想要操作「内存地址」就需要「地址总线」

  • 如果地址总线只有 1 条,那每次只能表示「0 或 1」这两种地址,所以 CPU 能操作的内存地址最大数量为 2(2^1)个(注意,不要理解成同时能操作 2 个内存地址);
  • 如果地址总线有 2 条,那么能表示 00、01、10、11 这四种地址,所以 CPU 能操作的内存地址最大数量为 4(2^2)个

CPU 的位宽最好不要小于线路位宽

因为 32 位 CPU 一次最多只能操作 32 位宽的地址总线和数据总线

32 位 CPU 最大只能操作 4GB 内存,就算你装了 8 GB 内存条,也没用


程序执行基本过程:
程序运行的过程就是将指令一步一步执行

而CPU是负责执行指令的

一个程序执行的时候,CPU 会根据程序计数器里的内存地址,从内存里面把需要执行的指令读取到指令寄存器里面执行,然后根据指令长度自增 开始顺序读取下一条指令

CPU 的指令周期:CPU 从程序计数器读取指令、到执行、再到下一条指令,这个过程会不断循环,直到程序执行结束


网站公告

今日签到

点亮在社区的每一天
去签到