CPU 执行程序的秘密,藏在了这 15 张图里( 三 )


  • 数据总线 , 用于读写内存的数据;
  • 控制总线 , 用于发送和接收信号 , 比如中断、设备复位等信号 , CPU 收到信号后自然进行响应 , 这时也需要控制总线;
  • 当 CPU 要读写内存数据的时候 , 一般需要通过两个总线:
    • 首先要通过「地址总线」来指定内存的地址;
    • 再通过「数据总线」来传输数据;
    输入、输出设备输入设备向计算机输入数据 , 计算机经过计算后 , 把数据输出给输出设备 。 期间 , 如果输入设备是键盘 , 按下按键时是需要和 CPU 进行交互的 , 这时就需要用到控制总线了 。
    CPU 执行程序的秘密,藏在了这 15 张图里文章插图
    线路位宽与 CPU 位宽数据是如何通过线路传输的呢?其实是通过操作电压 , 低电压表示 0 , 高压电压则表示 1 。
    如果构造了高低高这样的信号 , 其实就是 101 二进制数据 , 十进制则表示 5 , 如果只有一条线路 , 就意味着每次只能传递 1 bit 的数据 , 即 0 或 1 , 那么传输 101 这个数据 , 就需要 3 次才能传输完成 , 这样的效率非常低 。
    这样一位一位传输的方式 , 称为串行 , 下一个 bit 必须等待上一个 bit 传输完成才能进行传输 。 当然 , 想一次多传一些数据 , 增加线路即可 , 这时数据就可以并行传输 。
    为了避免低效率的串行传输的方式 , 线路的位宽最好一次就能访问到所有的内存地址 。 CPU 要想操作的内存地址就需要地址总线 , 如果地址总线只有 1 条 , 那每次只能表示 「0 或 1」这两种情况 , 所以 CPU 一次只能操作 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 执行程序的秘密,藏在了这 15 张图里文章插图
    程序执行的基本过程在前面 , 我们知道了程序在图灵机的执行过程 , 接下来我们来看看程序在冯诺依曼模型上是怎么执行的 。
    程序实际上是一条一条指令 , 所以程序的运行过程就是把每一条指令一步一步的执行起来 , 负责执行指令的就是 CPU 了 。
    CPU 执行程序的秘密,藏在了这 15 张图里文章插图
    那 CPU 执行程序的过程如下: