我命由我,不由天!


  • 搜索
prometheus docker golang linux kubernetes

CPU cache结构和缓存一致性

发表于 2021-02-05 | 分类于 linux | 0 | 阅读次数 679

CPU cache结构和缓存一致性

一、cache

1.cache的意义

​ 为什么需要CPU cache?因为CPU频率太快,为了缓解CPU和内存之间速度的不匹配问题(结构:cpu->cache->memory)。

​ A. 时间局部性:如果某个数据被访问,那么在不久的将来它很可能被再次访问;

​ B. 空间局部性:如果某个数据被访问,那么与它相邻的数据很快也可能被访问;

2.cache和寄存器

  1. 寄存器存放的是你当前正在思考的内容

  2. cache存放的是与该问题相关的记忆

  3. 主存则存放无论与该问题是否有关的所有记忆

  4. 所以,寄存器存放的是当前CPU执行的数据,而cache则缓存与该数据相关的部分数据,因此只要保证了cache的一致性,那么寄存器拿到的数据也必然具备一致性。

二、CPU cache结构

image.png

为了缓解CPU指令流水中cycle冲突,L1分成了指令(L1P)和数据(L1D)两部分,而L2则是指令和数据共存。多了所有CPU共享的L3三级缓存。

三、MESI(缓存一致性)

缓存一致性:在多核CPU中,内存中的数据会在多个核心中存在数据副本,某一个核心发生修改操作,就产生了数据不一致的问题。而一致性协议正是用于保证多个CPU cache之间缓存共享数据的一致。

cache的写方式

​ A. write through(写通):每次CPU修改了cache中的内容,立即更新到内存,也就意味着每次CPU写共享数据,都会导致总线事务,因此这种方式常常会引起总线事务的竞争,高一致性,但是效率非常低;

​ B. write back(写回):每次CPU修改了cache中的数据,不会立即更新到内存,而是等到cache line在某一个必须或合适的时机才会更新到内存中;

无论是写通还是写回,在多核环境下都需要处理缓存cache一致性问题。为了保证缓存一致性,处理器又提供了写失效(write invalidate)和写更新(write update)两个操作来保证cache一致性。

cache line

cache line是cache与内存数据交换的最小单位,根据操作系统一般是32byte或64byte。在MESI协议中,状态可以是M、E、S、I,地址则是cache line中映射的内存地址,数据则是从内存中读取的数据。

状态介绍

MESI协议将cache line的状态分成modify、exclusive、shared、invalid,分别是修改、独占、共享和失效。

  1. modify:当前CPU cache拥有最新数据(最新的cache line),其他CPU拥有失效数据(cache line的状态是invalid),虽然当前CPU中的数据和主存是不一致的,但是以当前CPU的数据为准;
  2. exclusive:只有当前CPU中有数据,其他CPU中没有改数据,当前CPU的数据和主存中的数据是一致的;
  3. shared:当前CPU和其他CPU中都有共同数据,并且和主存中的数据一致;
  4. invalid:当前CPU中的数据失效,数据应该从主存中获取,其他CPU中可能有数据也可能无数据,当前CPU中的数据和主存被认为是不一致的;

对于invalid而言,在MESI协议中采取的是写失效(write invalidate)。

cache操作

MESI协议中,每个cache的控制器不仅知道自己的操作(local read和local write),每个核心的缓存控制器通过监听也知道其他CPU中cache的操作(remote read和remote write),今儿再确定自己cache中共享数据的状态是否需要调整。

  1. local read(LR):读本地cache中的数据;
  2. local write(LW):将数据写到本地cache;
  3. remote read(RR):其他核心发生read;
  4. remote write(RW):其他核心发生write;
  • 本文作者: Dante
  • 本文链接: https://gaodongfei.com/archives/cpu-cache
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# linux
mutex
goroutine 状态轮转
  • 文章目录
  • 站点概览
Dante

Dante

119 日志
5 分类
5 标签
RSS
Creative Commons
0%
© 2023 Dante
由 Halo 强力驱动
|
主题 - NexT.Pisces v5.1.4
沪ICP备2020033702号