微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 谢宝友教你学Linux:深入理解Linux RCU之从硬件说起

谢宝友教你学Linux:深入理解Linux RCU之从硬件说起

时间:08-04 来源:电子发烧友网工程师 点击:

处于"modified"状态的缓存行是由于相应的CPU最近进行了内存存储。并且相应的内存确保没有在其他CPU的缓存中出现。因此,"modified"状态的缓存行可以被认为被CPU所"拥有"。由于该缓存保存了"最新"的数据,因此缓存最终有责任将数据写回到内存,也应当为其他缓存提供数据,并且必须在缓存其他数据之前完成这些事情。

"exclusive"状态非常类似于"modified"状态,唯一的差别是该缓存行还没有被相应的CPU修改,这也表示缓存行中的数据及内存中的数据都是最新的。但是,由于CPU能够在任何时刻将数据存储到该行,而不考虑其他CPU,因此,处于"exclusive"状态也可以认为被相应的CPU所"拥有"。也就是说,由于物理内存中的值是最新的,该行可以直接丢弃而不用回写到内存,也不用通知其他CPU。

处于"shared"状态的缓存行可能已经被复制到至少一个其他CPU的缓存中,这样在没有得到其他CPU的许可时,不能向缓存行存储数据。与"exclusive"状态相同,此时内存中的值是最新的,因此可以不用向内存回写值而直接丢弃缓存中的值,也不用通知其他CPU。

处于"invalid"状态的行是空的,换句话说,它没有保存任何有效数据。当新数据进入缓存时,它被放置到一个处于"invalid"状态的缓存行。这个方法是比较好的,因为替换其他状态的缓存行将引起大量的缓存缺失。

由于所有CPU必须维护缓存行中的数据一致性视图,因此缓存一致性协议提供消息以标识系统中缓存行的动作。

六、MESI消息

MESI协议需要在CPU之间通信。如果CPU在单一共享总线上,只需要如下消息就足够了:

  • 读消息:"读"消息包含要读取的缓存行的物理地址。

  • 读响应消息:"读响应"消息包含较早前的"读"消息的数据。这个"读响应"消息可能由物理内存或者其他CPU的缓存提供。例如,如果一个缓存处于"modified"状态,那么,它的缓存必须提供"读响应"消息。

  • 使无效消息:"使无效"消息包含要使无效的缓存行的物理地址。其他的缓存必须从它们的缓存中移除相应的数据并且响应此消息。

  • 使无效应答:一个接收到"使无效"消息的CPU必须在移除指定数据后响应一个"使无效应答"消息。

  • 读使无效:"读使无效"消息包含缓存行要读取的物理地址。同时指示其他缓存移除数据。因此,它同时包含一个"读"消息和一个"使无效"消息。"读使无效"消息同时需要"读响应"消息以及"使无效应答"消息进行答应。

  • 写回:"写回"消息包含要回写到物理内存的地址和数据。(并且也许会"探测"其他CPU的缓存)。这个消息允许缓存在必要时换出处于"modified"状态的数据以腾出空间。

再次重申,所有这些消息均需要在CPU之间传播电信号,都面临霍金提出的那两个IT难题。

七、MESI状态转换

  • Transition (a):缓存行被写回到物理内存,但是CPU仍然将它保留在缓存中,并在以后修改它。这个转换需要一个"写回"消息。

  • Transition (b):CPU将数据写到缓存行,该缓存行目前处于排它访问。不需要发送或者接收任何消息。

  • Transition (c):CPU收到一个"读使无效"消息,相应的缓存行已经被修改。CPU必须使无效本地副本,然后响应"读响应"和 "使无效应答"消息,同时发送数据给请求的CPU,标示它的本地副本不再有效。

  • Transition (d):CPU进行一个原子读—修改—写操作,相应的数据没有在它的缓存中。它发送一个"读使无效"消息,通过"读响应"消息接收数据。一旦它接收到一个完整的"使无效应答"响应集合,CPU就完成此转换。

  • Transition (e):CPU进行一个原子读—修改—写操作,相应的数据在缓存中是只读的。它必须发送一个"使无效"消息,并等待"使无效应答"响应集合以完成此转换。

  • Transition (f):其他某些CPU读取缓存行,其数据由本CPU提供,本CPU包含一个只读副本。数据只读的原因,可能是由于数据已经回写到内存中。这个转换开始于接收到一个"读"消息,最终本CPU响应了一个"读响应" 消息。

  • Transition (g):其他CPU读取数据,并且数据是从本CPU的缓存或者物理内存中提供的。无论哪种情况,本CPU都会保留一个只读副本。这个事务开始于接收到一个"读"消息,最终本CPU响应一个"读响应"消息。

  • Transition (h):当前CPU很快将要写入一些数据到缓存行,于是发送一个"使无效"消息。直到它接收到所有"使无效应答"消息后,CPU才完成转换。可选的,所有其他CPU通过"写回"消息将缓存行的数据换出(可能是为其他缓存行腾出空间)。这样,当前CPU就是最后一个缓存该数据的CPU。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top