CPU多级缓存结构以及缓存一致性协议MESI

CPU多级缓存结构

现代CPU分为物理核和逻辑核,比如我们日常办公电脑常见的4核8线程,就是指的4个物理核、8个逻辑核。超线程的技术使得一个物理核可以同时做两件事,也就是执行两个线程,但是能真正执行两个线程的场景很少。Java中API获取的核数,就是指的逻辑核。

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。现代CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构,常见的为三级缓存结构

  • L1 Cache,分为数据缓存和指令缓存,逻辑核独占。最接近CPU,容量最小(因为一级缓存制造成本很高),速度最快,存数据 L1-D Cache, 存指令 L1-I Cache;
  • L2 Cache,物理核独占,逻辑核共享
  • L3 Cache,所有物理核共享

缓存是由最小的存储区块-缓存行(cacheline)组成,缓存行大小通常为64byte。

CPU多级缓存结构图

存储器存储空间大小:内存>L3>L2>L1>寄存器; 存储器速度快慢排序:寄存器>L1>L2>L3>内存。

当CPU访问存储设备时,首先去L1寻找它所需要的数据x,然后去L2,然后去L3。如果三级缓存都没找到数据x,则从内存里获取数据x传递给寄存器进行运算,同时依次存在L3、L2、L1。当L1满了,就删除x,再次使用x时L1没有数据但是L2有数据,就从L2中获取避免从内存中获取。

在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。

  • 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。
  • 空间局部性(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。

CPU有4个运行级别,分别为ring0~ring3。

Linux与Windows只用到了2个级别:ring0、ring3,操作系统内部内部程序指令通常运行在ring0级别,操作系统以外的第三方程序运行在ring3级别,第三方程序如果要调用操作系统内部函数功能,由于运行安全级别不够,必须切换CPU运行状态,从ring3切换到ring0, 然后执行系统函数。

缓存锁定机制

当两个处理器同时操作内存中的变量X进行修改(写操作),可能会因为顺序的不同造成结果不一致。假设CPU1:X=2;CPU2:X=3,如果是1先修改成功,那么内存中的数据会是2修改的3;如果2先修改成功,那么内存中的数据会是1修改的2,无法保证缓存一致性。

总线锁

CPU与内存的通信通过总线,CPU如果要访问内存,先占据总线,在总线上发出一个LOCK#信号,此时其他处理器就不能访问内存,自己可以对内存数据进行读写操作。但是总线锁在锁定期间,其他处理器不能操作其他内存地址的数据,性能很低,无法发挥多核的并行处理能力,就相当于单核。类似于互斥锁。

缓存一致性协议MESI

早期的CPU遇到LOCK#信号会直接触发总线锁来保证缓存一致性,但是性能低。所以后来进行优化,会先触发缓存一致性协议MESI。

MESI分别代表了一个变量在缓存行中的4个不同状态:

  • M:已修改Modified
  • E:独占Exclusive
  • S:共享Share
  • I:无效Invalid

当CPU启动之后,会启用监听机制来监听总线中消息的传递。任何处理器通过总线获取内存中的变量,CPU都能感知到。

当处理器1经过总线读取内存变量X时,X状态变为E:

MESI1

当处理器2经过总线也要读取内存变量X时,会被CPU监听到,CPU把X状态变为S,意味着当前变量存在几个副本,分别属于不同的处理器操作:

MESI2

如果其中一个处理器要对X进行修改,假设CPU1:X=2;CPU2:X=3,因为读取到的变量都是在缓存行(64byte)中,此时两个处理器对各自的缓存行进行加锁(原子性),谁加锁成功谁就可以修改变量X。加锁的同时向外部发送本地写消息(Local write)给总线,总线进行总线裁决。假设总线判定处理器2加锁成功,那么2中的X变量状态变为M,锁住缓存行;1中的X变量状态变为I:

MESI3

等到处理器2修改成功到内存之后,处理器1再重新从内存中读取最新的变量X。

当一个变量被volatile修饰后,就会在汇编语言中加LOCK前缀,触发缓存一致性协议MESI,所以即使同时有多个线程操作该变量,也可以保证其内存可见性。

如果一个变量大于64byte,需要两个或以上的缓存行来存放时,此时会触发总线锁来保证缓存一致性,因为对多个缓存行加锁不能保证原子安全性。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值