总线嗅探与缓存一致性
一开始看内存安全的时候,了解到从电路上窃取信息这种操作是真实存在的,专业术语称作Bus Snooping
总线嗅探。然后当时就理所当然地认为,嗅探属于网络攻击的一种,应该尽可能防范。
然而gem5又给我上了一课(没错还是它)。在阅读代码的时候,看到src/mem/packet.hh
的注释里提到了Snoop Flags。这是个啥?难道gem5还支持安全攻击建模的,之前咋没听说过?
查阅资料后,咕果搜索结果中出现了缓存一致性这个关键词。进一步了解后发现,嗅探是当今多核时代下,一种朴素而常见的、确保缓存一致性的通信手段。
根据英文wiki,对于内存来说,有两种常见的内存一致性的级别:
一是Cache Coherent
缓存一致。在这种一致性级别下,要求对于单一内存地址的数据,满足程序所有线程的执行顺序(反过来想,我们是否可以理解为,某些内存地址的数据操作是不需要遵循全局顺序的,比如只有单个线程使用的私有内存区块?)。另一种定义是,如果对于同一内存地址的写操作是顺序排列的(即同一时刻只有一个写操作),那么该系统具有缓存一致性。
另一个则是Sequentially Cosistent
顺序一致。在这种一致性级别下,要求程序的整个内存区块中的内存操作都必须满足所有线程的总体执行顺序。
然后看到了一篇介绍缓存一致性的文章(原文/译文),了解到了在MESI缓存一致性协议中,是如何通过总线嗅探来实现缓存区块的状态转移的。
MESI协议的名称由协议本身定义状态机的四个状态首字母缩写组成,其中M
Modified、S
Shared、I
Invalid三个状态分别对应单核系统下缓存的三种状态:脏(dirty)、干净(clean)和无效(invalid)。MESI遵循了缓存一致性的原则,对于同一内存地址,同一时刻只允许一个线程具有写的权利(处于M
状态)。
由于要尽可能地提升多核系统的工作效率,经典设计方案是为每个核分配一块独占的缓存空间,而这也是导致传统缓存状态机出现问题的关键所在:若是继续使用单核的强同步策略(写入即同步)的话,同步缓存的操作将大幅降低处理器运行效率;不使用同步策略的话,则会带来经典的写前读/写后读问题。
MESI协议则可以视作一种弱同步策略,仅在特殊事件发生的时候执行同步操作。这个特殊事件直接映射成了MESI中的第四个状态E
Exclusive,也就是独占状态。MESI规定,只有在进入E
状态后,才能进入M
状态。在MESI中,需要嗅探的内容就是进入这个E
状态的内存操作。
关于MESI协议的具体内容可以参见wiki,这里就懒得写了