0x1 硬件的体系结构


image.png

0x2 cpu流水线


原理

cpu每执行一条指令大致至少需要经过以下三个时钟周期:

  • 取指令
  • 译码
  • 执行

(注:现代cpu的流水线其实更加复杂,一般在10几级)
那么很显然如果指令是一条条执行的,会出现等待的情况,指令译码阶段,这个时候取指令模块就得等待,不然后面就出错了。而且由于每一条指令的执行速度均不一致,比如加法和浮点运算显然有质的区别,如果一条条执行,显然后面的指令需要等待前面指令结束。因此现代cpu为了提高性能都是流水线执行,即每一条指令分为多个阶段,每个阶段并行执行。

影响

  • 性能
    • 分支预测:对于具有高度可预测性的控制流,流水线能保持在满的状态。但是对于难以预测的控制逻辑,流水线需要停顿等待(等待取指令,内存访问较慢),或者需要冲刷之前超前计算的结果(之前的结果可能保存到了寄存器)。
      • 代码中有许多循环,且循环计数很小
      • 代码中有很多分支,跳转比较远

分支预测通常需要程序员根据业务逻辑辅助cpu进行预测。

  • 逻辑性

由于流水线的存在,导致代码的执行顺序可能发生变化

0x3 内存引用


内存引用即通过指针访问内存(随机内存访问)。

由于普通的RAM访问速度比较慢,因此现在的cpu里面一般会集成高速缓存,随机内存访问会导致缓存命中率下降,从而导致cpu性能下降。常见的内存访问比如链表。

  1. struct list {
  2. struct list *prev;
  3. struct list *next;
  4. }

0x4 原子操作


原子操作依赖于cpu提供的lock指令,该指令需要锁住内存总线,从而导致其他的cpu性能下降。

0x5 内存屏障


内存屏障会阻碍指令的并行执行。

0x6 Cache Miss


0x7 I/O操作