是缺点也很明显,由于每次都须要访问内存,所以速度会比较慢。还有一种方法就是,当 CPU 更新了缓存之后并不立刻更新到内存中去,在适当的时候再执行写入内存的操作,因为有许多的缓存只是存储一些中间结果,没必要每次都更新到内存中去,英文称之为write back,这种方式的优点是 CPU 执行更新的效率比较高,缺点就是实现起来会比较困难。
上面说的在适当的时候写入内存,假如是单核 CPU 的话,可以在缓存要被新进入的数据取代时,才更新内存,但是在多核 CPU 的状况下就比较困难了,由于 CPU 的运算速度超越了 1 级缓存的数据 I\O 实力,CPU 厂商又引入了多级的缓存结构,比如常见的 L1、L2、L3 三级缓存结构,L1 和 L2 为 CPU 核心独有,L3 为 CPU 共享缓存。
假如现在分别有两个线程运行在两个不同的核 Core 1 和 Core 2 上,内存中 i 的值为 1,这两个分别运行在两个不同核上的线程要对 i 进行加 1 操作,假如不加一些限制,两个核心同时从内存中读取 i 的值,然后进行加 1 操作后再分别写入内存中,可能会出现相互覆盖的状况,解决的方法信任大家都能想得到,第一种是只要有一个核心修改了缓存的数据之后,就马上把内存和其它核心更新。其次种是当一个核心修改了缓存的数据之后,就把其它同样复制了该数据的 CPU 核心失效掉这些数据,等到合适的时机再更新,通常是下一次读取该缓存的时候发觉已经无效,才从内存中加载最新的值。
,执行效率比较低,而其次种会把更新数据推迟到最终一刻才会更新,读取内存,效率高(类似于懒加载)。缓存一样性协议(MESI) 就是运用其次种方案,该协议主要是保证缓存内部数据的一样,不让系统数据混乱。MESI 是指 4 种状态的首字母。每个缓存存储数据单元(Cache line)有 4 种不同的状态,用 2 个 bit 表示,状态和对应的描述如下:
下面看看基于缓存一样性协议是如何进行读取和写入操作的, 假设现在有一个双核的 CPU,为了描述便利,简化一下只看其逻辑结构:
单核读取步骤:Core 0 发出一条从内存中读取 a 的指令,从内存通过 BUS 读取 a 到 Core 0的缓存中,因为此时数据只在 Core 0 的缓存中,所以将 Cache line 修改为 E 状态(独享),该过程用示意图表示如下:
双核读取步骤:首先 Core 0 发出一条从内存中读取 a 的指令,从内存通过 BUS 读取 a 到 Core 0 的缓存中,然后将 Cache line 置为 E 状态,此时 Core 1 发出一条指令,也是要从内存中读取 a,当 Core 1 试图从内存读取 a 的时候, Core 0 检测到了发生地址冲突(其它缓存读主存中该缓存行的操作),然后 Core 0 对相关数据做出响应,a 存储于这两个核心 Core 0 和 Core 1 的缓存行中,然后设置其状态为 S 状态(共享),:
假设此时 Core 0 核心须要对 a 进行修改了,首先 Core 0 会将其缓存的 a 设置为 M(修改)状态,然后通知其它缓存了 a 的其它核 CPU(比如这里的 Core 1)将内部缓存的 a 的状态置为 I(无效)状态
CPU缓存用处意义解释 来自淘豆网m.daumloan.com转载请标明出处.