一、冯诺依曼模型

定义计算机基本结构为5个部分:存储器、运算器、控制器、输入设备、输出设备。

运算器和控制器在中央处理器(CPU)里,存储器就是常见的内存,输入输出设备就是计算机外接的设备,比如键盘是输入设备,显示器是输出设备。

1、内存

 程序和数据存储在内存里,存储数据的基本单位是字节,1字节等于8位,每个字节对应一个内存地址。

2、中央处理器(CPU)

32位和64位表示位宽,表示CPU一次可以计算的数据量

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

2.1 寄存器

  • 通用寄存器:用来存放需要进行运算的数据
  • 程序计数器:存储CPU下一条指令的内存地址
  • 指令寄存器:存放当前正在执行的指令

2.2 控制单元

负责控制CPU工作

2.3 逻辑运算单元

负责计算

2.4 CPU cache

在CPU里,分为L1、L2、L3 这样的三层高速缓存

 

3、总线

用于CPU和内存以及其它设备之间的通信

  • 地址总线:用于指定CPU将要操作的内存地址
  • 数据总线:用于读写内存的数据
  • 控制总线:用于发送和接收信号,比如中断、设备复位等信号

 

4、输入、输出设备

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

 

二、CPU执行程序的过程

第一步:CPU读取程序计数器的值,然后CPU的控制单元操作地址总线指定需要访问的内存地址,接着通知内存设备准备数据,数据准备好后通过数据总线将指令数据传给CPU,CPU收到后将指令数据保存到指令寄存器。

第二步:程序计数器的值自增,表示下一条指令。

第三步:CPU分析指令寄存器中的指令,确定指令的类型和参数,如果是计算类型的指令就把指令交给逻辑运算单元运算,如果是存储类型的指令,则交由控制单元执行。

 

三、存储器的层次结构

 1、寄存器

在CPU里,存储正在运算的数据

2、CPU cacle

在CPU里,分为L1、L2、L3 这样的三层高速缓存,L1离CPU最近访问速度最快,L3最慢。是SRAM静态随机存储器芯片,只要有电数据就可以保持存在,断电就失去数据。

3、内存

是DRAM动态随机存储器,比SRAM容量大,造价便宜。需要定时刷新电容才能保证数据不会丢失。

4、SSD/HDD硬盘

SSD就是固体硬盘,断电后数据还是存在的。HDD是机械硬盘。

 

四、CPU缓存一致性

如果数据写入 Cache 之后,内存与 Cache 相对应的数据将会不同,这种情况下 Cache 和内存数据都不一致了,于是我们肯定是要把 Cache 中的数据同步到内存里的。将cache写回内存的两种策略:
1、写直达

把数据同时写回内存和cache:

  • 如果数据已经在 Cache 里面,先将数据更新到 Cache 里面,再写入到内存里面;
  • 如果数据没有在 Cache 里面,就直接把数据更新到内存里面。

写直达的问题是无论数据是否在cache里,每次写操作都会写回到内存,这样会花费大量时间。

2、写回

当发生写操作时,新的数据只写到cacle里,只有当修改过的cache被替换的时候才写回内存。这样减少了数据写回内存的频率。

 

CPU是多核的,每个CPU都有独立的cache,如何保证多核CPU的缓存一致性?

要解决这一问题,就需要一种机制,来同步两个不同核心里面的缓存数据。要实现的这个机制的话,要保证做到下面这 2 点:

  • 第一点,某个 CPU 核心里的 Cache 数据更新时,必须要传播到其他核心的 Cache,这个称为写传播Write Propagation);
  • 第二点,某个 CPU 核心里对数据的操作顺序,必须在其他核心看起来顺序是一样的,这个称为事务的串行化Transaction Serialization)。

写传播的实现方法:

基于总线嗅探机制的协议:MESI协议

MESI 协议,是已修改、独占、共享、已失效这四个状态的英文缩写的组合。整个 MSI 状态的变更,则是根据来自本地 CPU 核心的请求,或者来自其他 CPU 核心通过总线传输过来的请求,从而构成一个流动的状态机。另外,对于在「已修改」或者「独占」状态的 Cache Line,修改更新其数据不需要发送广播给其他 CPU 核心。