CPU高速缓存行

       CPU为了更快的执行代码。于是当从内存中读取数据时,并不是只读自己想要的部分。而是读取足够的字节来填入高速缓存行。根据不同的CPU,高速缓存行大小不同。如X86是32 BYTES ,而 ALPHA 是64 BYTES。并且始终在第32个字节或64个字节处对齐。这样,当CPU访问相邻的数据时,就不必每次都从内存中读取,提高了速度。因为访问内存要比访问高速缓存用的时间多得多。

但是,多核发达的年代。情况就不那么简单了。试想下面这样一个情况。

1,CPU1读取了一个字节,以及它和它相邻的字节被读入CPU1的高速缓存。

2,CPU2做了上面同样的工作。这样CUP1,CPU2的高速缓存拥有同样的数据。

3,CPU1修改了那个字节,被修改后,那个字节被放回CPU1的高速缓存行。但是该信息并没有被写入RAM。

4,CPU2访问该字节,但由于CPU1并未将数据写入RAM,导致了数据不同步。

为了解决这个问题,芯片设计者制定了一个规则。当一个CPU修改高速缓存行中的字节时,计算机中的其它CPU会被通知,它们的高速缓存将被视为无效。于是,在上面的情况下,CPU2发现自己的高速缓存中的数据已无效,CPU1将立即把自己的数据写回RAM,然后CPU2重新读取改数据。可以看出,高速缓存行在多处理器上会导致一些不一致。

从上面的情况可以看出,在设计数据结构的时候,应该尽量将只读数据与读写数据分开,并尽量将同一时间访问的数据组合在一起。这样CPU能一次将需要数据读入。

参考:http://blog.csdn.net/boyuejiang/article/details/8908335

猜你喜欢

转载自weigang-gao.iteye.com/blog/2306107