CPU的缓存一致性要求CPU内部各级缓存之间的数据是一致的。当多个CPU核心涉及对同一块主内存的数据进行读写和计算操作时,可能导致各个CPU核心之间缓存的数据不一致。
通过缓存一致性协议解决缓存一致性问题,比如MSI协议、MESI协议等。
CPU在读取数据时,是以一个缓存行来读取的。目前,主流的CPU的缓存行大小为64Bytes。所以,一个缓存行中可能存储多个数据(实际存储的是数据的内存块),当多个线程同时修改一个缓存行里的多个变量时,由于MESI协议是针对缓存行修改状态的,就会导致多个线程的性能相互影响,这就是伪共享。
假设缓存行中存储的是64位,也就是8byte的double类型的数据,则一个缓存行可以存储8个double类型的数据。
如果多个线程共享存储在同一个缓存行的不同double数据,并且线程1对变量X的值进行了修改,那么此时,即使线程2并没有修改变量Y的值,即使线程1和线程2不共享同一个变量,线程1和线程2会影响彼此的性能,导致伪共享的问题。
如何解决伪共享问题?