建网站是自己做还是用CMS,同步手机wordpress,网站建设服务费要不要折旧呢,网站程序优化MESI 缓存一致性协议
多核场景下#xff0c;仅仅依靠CAS这一类硬件原语并不能实现同步#xff0c;因为原子指令底层实现也可能包含多条微指令#xff0c;而原子指令的原子性是相对于一个核而言的#xff0c;多条原子指令在各自的CPU核上都是原子执行的。所以要解决这个问题…MESI 缓存一致性协议
多核场景下仅仅依靠CAS这一类硬件原语并不能实现同步因为原子指令底层实现也可能包含多条微指令而原子指令的原子性是相对于一个核而言的多条原子指令在各自的CPU核上都是原子执行的。所以要解决这个问题就要先将总线锁住。例如在Go中Mutex的实现在执行CMPXCHGL指令直线先LOCK总线。锁住总线就导致程序由并行变为串行这必然会影响性能现代CPU都拥有高速缓存不再通过锁总线的方式实现多核间的同步为了保证多核间高速缓存的一致性引入了高速缓存一致性协议MESI协议。
单核CPU的cache中每个cache line有2个标志dirty、valid标识表示cache中的数据是否被修改、是否有效。而在多个核中每个CPU都有自己对应的cache多个核共享内存中的数据MESI协议就描述了数据的共享状态分别是
状态描述MModified该行数据有效、被修改和内存中的数据不一致该数据只存在于本Cache中。EExclusive该行数据有效、和内存中的数据一致该数据只存在于本Cache中。SShared该行数据有效和内存中的数据一致该数据存在于多个Cache中。IInvalid该行数据无效。
M与E的共同点是都是本Cache所独有的不同点是M表示Cache中的数据与内存中的数据不一致。
在MESI协议中每个Cache的Cache控制器不仅要知道自己的读写操作还要监听其他Cache的读写操作监听总线。
状态变化如下其中Local Read/Write表示对本CPU Cache的读写操作Remote Read/Write表示其他CPU对自己Cache的读写操作。
当前状态事件行为下一个状态IInvalidLocal Read如果其它Cache没有这份数据本Cache从内存中取数据Cache line状态变成E 如果其它Cache有这份数据且状态为M则将数据更新到内存本Cache再从内存中取数据2个Cache 的Cache line状态都变成S 如果其它Cache有这份数据且状态为S或者E本Cache从内存中取数据这些Cache 的Cache line状态都变成SE/SIInvalidLocal Write如果其它Cache没有这份数据本Cache从内存中取数据并修改Cache line状态变成M如果其它Cache有这份数据且状态为M则要先将数据更新到内存读取并修改其他Cache的Cache line状态变为IM/IIInvalidRemote Read既然是Invalid别的核的操作与它无关IIInvalidRemote Write既然是Invalid别的核的操作与它无关IEExclusiveLocal Read从Cache中取数据状态不变EEExclusiveLocal Write写入Cache状态变为MMEExclusiveRemote Read数据和其它核共用状态变成了SSEExclusiveRemote Write数据被修改本Cache line不能再使用状态变成IISSharedLocal Read从Cache中取数据状态不变SSSharedLocal Write修改Cache中的数据状态变成M其它核共享的Cache line状态变成IMSSharedRemote Read状态不变SSSharedRemote Write数据被修改本Cache line不能再使用状态变为IIMModifiedLocal Read从Cache中取数据状态不变MMModifiedLocal Write修改Cache中的数据状态不变MMModifiedRemote Read写会内存使其它核能使用到最新的数据状态变为SSMModifiedRemote Write写会内存使其它核能使用到最新的数据数据被修改本Cache line不能再使用状态变为II