优化网站公司外包,网店seo排名优化,网址简化在线生成,建网站的公司起什么名好CPU 核心之间数据如何传播
高速缓存中的值被修改了#xff0c;那么怎么同步到内存中呢#xff1f;
① 写直达#xff08;Write-Through#xff09;② 写回#xff08;Write-Back#xff09;
写直达#xff08;Write-Through#xff09; 简单#xff0c;但是很慢那么怎么同步到内存中呢
① 写直达Write-Through② 写回Write-Back
写直达Write-Through 简单但是很慢每次写都需要经过 内存总线 写回Write-Back尽可能推迟更新只有当替换算法要驱逐这个更新过的缓存块时才把它写回到内存中。由于局部性写回能显著地减少总线流量但是它的缺点是复杂。 写传播Write Propagation
写传播是说在一个 CPU 核心里我们的 Cache 数据更新必须能够传播到其他的对应核心节点的 Cache Line 里。 事务的串行化Transaction Serialization
事务串行化是说我们在一个 CPU 核心里面的写入顺序在其他的核心节点看起来顺序是一样的。 CPU 核心之间数据传播的两种方式
① 写失效Write Invalidate② 写广播Write Broadcast
写失效Write Invalidate只有一个 CPU 核心负责写入数据其他的核心对应缓存行失效需要这个数据的时候才同步读取到这个写入。 写广播Write Broadcast一个写入请求广播到所有的 CPU 核心同时更新各个核心里的 Cache。 写失效 VS 写广播 ① 写广播在实现上自然很简单但是写广播需要占用更多的总线带宽 ② 写失效只需要告诉其他的 CPU 核心哪一个内存地址的缓存失效了但是写广播还需要把对应的数据传输给其他 CPU 核心。
各种缓存请求
处理器向高速缓存发出的请求包括
PrRd处理器请求读取一个缓存块。PrWr处理器请求改写一个缓存块。
总线方面的请求
BusRd当处理器的请求缓存的读操作出现未命中它会向总线发送一个BusRd请求BusRdX当处理器请求缓存的写操作出现未命中它会向总线发送一个BusRdX请求BusUpgr当处理器请求缓存的写操作命中时它它会向总线发送一个BusUpgrFlush该请求表明一个缓存块正在被写回内存 MSI协议和MESI协议
MSI协议 MESI 协议
MESI 协议通过引入 E 状态来减少没有用的总线事务
E独占状态Exclusive
缓存行只在当前缓存中但是干净的clean —— 缓存数据同于主存数据。当别的缓存读取它时状态变为共享当前写数据时变为已修改状态。 MESI 属于硬件级别的协议
不管是信号的发送、传输、总线仲裁、缓存行的修改等都属于硬件级别的。所谓的硬件本质上就是一堆电子电路而已。也就是说一般的话CPU 高速缓存的一致性是由硬件保证的。不同的架构的CPU提供不同的缓存一致性协议。MESI 是属于经典的常用的缓存一致性协议其他很多协议都是在 MESI 基础之上的优化。
内存屏障 写内存屏障 - Store Memory Barrier
屏障之后的写操作必须等待屏障之前的写操作完成才可以执行。 引入 Store Buffer 的目的提升 CPU 写操作的性能导致 Store Buffer 与高速缓存中的数据不一致CPU 每次先从 Store Buffer 读数据没有的话再去高速缓存可以解决数据不一致问题但是解决不了 Memory Ordering 引起的问题 内存访问顺序和程序设置的顺序不一致。
读内存屏障
CPU 执行的任何的 load 操作都需要等到失效队列中所有标记信息完成对 cacheline 的操作之后才能进行。 内存屏障总结 写内存屏障解决 CPU 写操作乱序问题或者叫存储 Store 操作乱序问题 读内存屏障解决 CPU 读操作乱序问题或者叫加载Load 操作乱序问题 内存屏障 memory barriar 指令
写内存屏障smp_wmb() 汇编指令sfence x86 读内存屏障smp_rmb() 汇编指令lfence x86 读写内存屏障smp_mb() 汇编指令mfence x86
屏障之前的读 / 写操作必须在屏障之后的读 / 写操作之前被执行。 锁内存总线
lock 前缀的底层实现
在多处理器下为了保证一些操作的原子性需要在这些操作前加上lock比如lock addl .... lock cmpxchglock inc .... 锁内存总线的缺点其他处理器不能访问其他的内存地址中的数据了所以锁内存总线的开销挺大的。
锁缓存行 总结 Memory Ordering 问题内存访问顺序和程序设置顺序不一致指令重排序 写内存屏障解决 CPU 写操作乱序或者叫存储Store操作乱序问题屏障之后的写操作必须等屏障之前的写操作完成之后才可以执行 读内存屏障解决 CPU 读操作乱序或者叫加载Load操作乱序问题屏障之后的读操作必须等屏障之前的读操作完成之后才可以执行 底层汇编指令前面加 lock 前缀可以起到内存屏障的作用带有 lock 前缀的指令是原子操作 lock 在底层的实现原理是让某个 CPU 核心“锁定”内存总线从而独占共享内存但是此时其他 CPU 核心就不能访问内存数据了所以锁内存总线的开销是很大的 MESI 协议是锁缓存行的协议它从硬件层面保证缓存行的数据一致无需锁内存总线锁缓存行比锁内存总线的开销小