1 cache简介

1.1 cache缓存映射规则

tag查看cache是否匹配,set index

|tag |set index |block offset |
|20-bit |7-bit |5bit |

1.2 cache 组织方式

Cache 全关联
cache 组关联
cache 4路组关联

四路组关联:
cache包括128个cache set(不为0表示组关联,为0表示全关联fully Associative cache)
每个cache set包含四个cache line(四路,同一数据可能在四个cache位置中的一个缓存)
每个cache line是32字节大小

PIPT 物理地址索引物理地址标签
VIPT 虚拟地址索引物理地址标签
VIVT 虚拟地址索引虚拟地址标签

2 Cache-coherency MESI协议

以cache line为最小单元进行一致性内存管理

2.1 MESI协议状态

modified独占&修改过:其他CPU的该cache是无效的、换出该cache需要写回memory
exclusive独占:其他CPU的该cache是无效的、
share共享: 其他CPU的该cache可以是共享的共同读取该cache
Invalid无效: 表示该cache是无效的,需要读入才能生效

2.2 MESI协议消息

read:表示要读取特定cache
read response:其他chache或memory响应read指令。
invalidate:通知其他cpu将cache的数据设置为无效,后续接收所有CPU的invalidate Acknowledge。
invalidate Acknowledge:所有其他cache收到invalidate移除数据后发送的响应指令。
read invalidate:read+invalidate,期望收到read response和所有CPU的invalidate Acknowledge。
writeback:modified状态下的cacheline写回时候发出。

2.3 MESI状态迁移

状态转换|目标状态

原状态

Modified Exclusive Share Invalid
Modified  

M->E

执行writeback操作

将cacheline的数据写回到memory

M->S

收到read请求

发送read response

M->I

收到read invalidate请求

发送read response传递最新数据

清除数据

发送invalidate acknowledge

Exclusive

E->M

cpu将数据写入cacheline

 

E->S

收到read请求

发送read response

E->I

收到read invalidate

发送read response传递最新数据

清除数据

发送invalidate acknowledge

Share

S->M

执行一个原子的read-modify-write操作

发送invalidate

接收invalidate acknowledge

S->E

发送invalidate

接收invalidate acknowledge

 

S->I

收到invalidate

清除数据

发送invalidate acknowledge

Invalid

I->M

执行一个原子的read-modify-write操作

发送read invalidate

接收read response传递的最新数据

接收invalidate acknowledge

I->E

发送read invalidate

接收read response传递的最新数据

接收invalidate acknowledge

I->S

发送read

接收read response传递的最新数据

 

3. MESI协议优化引起的问题

3.1 store buffer的引入

写入内存时如果没有cache,则会先写入到store buffer中

这样可能会引起其他CPU看到的写入顺序与实际的写入顺序不相同的问题。

3.2 invalidate queue的引入

CPU收到invalidate命令后将invalidate存入invalidate queue中直接返回invalidate acknowledge。

会引起read操作读取到的数据已经失效,但是失效命令在invalidate queue中排队。

4 memory barrier

4.1 memory barrier如何解决上一节描述的问题

write memory barrier:标记当前store buffer中的所有项,如果store buffer中有标记项则后续store都会保存在store中,而不会直接写入cache。

执行现象就是CPU一定是先完成wmb之前的store,然后再完成wmb之后的store。

read memory barrier:将Invalidate Queue中的message处理完成。

执行现象就是CPU一定是先完成rmb之前的load,然后再完成rmb之后的load。

4.2 linux 定义的memory barrier

linux定义的互斥原语(spinlocks、reader-writer locks semaphores、RCU。。。)都隐含需要的memory barrier原语。

4.2.1 编译器优化屏障barrier()

主要解决编译器优化重拍的问题

4.2.2 内存优化屏障

内存优化屏障宏内部包含编译器优化屏障,防止编译器对指令进行重排

write memory barrier(smp_wmb())、read memory barrier(smp_rmb())、memory barrier(smp_mb()):

主要用于CPU间的交互顺序保证

smp_read_barrier_depends():表示依赖关系(例如前一个的操作是取后一个要操作memory的地址),只在Alpha上实现不为空。

mmiowb() :保护spin lock保护的MMIO write操作顺序。有些CPU architecture平台中,spinlock中的memory barrier操作已经保证了MMI的写入顺序,那么这个宏是空的。TODO:不理解mmio具体

up版本memory barrier:wmb()、rmb()、mb()、read_barrier_depends()。

主要用于CPU和外设交互时的顺序保证

5 处理器相关

5.1 ARM

DMB(data memory barrier):可以指定内存操作类型(store或store+load)和作用域 (单处理器、一组处理器inner、全局outer),约束观察到的顺序。

DSB(data synchronization barrier):真正对指令执行的约束。

ISB(instruction synchronization barrier):刷新指令缓存,保证之前对指令部分的修改在之后的执行中可见。

参考文献:

http://www.wowotech.net/kernel_synchronization/Why-Memory-Barriers.html

http://www.wowotech.net/kernel_synchronization/why-memory-barrier-2.html

cache和内存屏障的更多相关文章

  1. JVM内存模型、指令重排、内存屏障概念解析

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  2. [百度空间] [转]内存屏障 - MemoryBarrier

    处理器的乱序和并发执行 目前的高级处理器,为了提高内部逻辑元件的利用率以提高运行速度,通常会采用多指令发射.乱序执行等各种措施.现在普遍使用的一些超标量处理器通常能够在一个指令周期内并发执行多条指令. ...

  3. [面试]volatile类型修饰符/内存屏障/处理器缓存

    volatile类型修饰符 本篇文章的目的是为了自己梳理面试知识点, 在这里做一下笔记. 绝大部分内容是基于这些文章的内容进行了copy+整理: 1. http://www.infoq.com/cn/ ...

  4. Linux并发与同步专题 (1)原子操作和内存屏障

    关键词:. <Linux并发与同步专题 (1)原子操作和内存屏障> <Linux并发与同步专题 (2)spinlock> <Linux并发与同步专题 (3) 信号量> ...

  5. JVM内存模型、指令重排、内存屏障概念解析(转载)

    在高并发模型中,无是面对物理机SMP系统模型,还是面对像JVM的虚拟机多线程并发内存模型,指令重排(编译器.运行时)和内存屏障都是非常重要的概念,因此,搞清楚这些概念和原理很重要.否则,你很难搞清楚哪 ...

  6. C和C++中的volatile、内存屏障和CPU缓存一致性协议MESI

    目录 1. 前言2 2. 结论2 3. volatile应用场景3 4. 内存屏障(Memory Barrier)4 5. setjmp和longjmp4 1) 结果1(非优化编译:g++ -g -o ...

  7. LINUX内核内存屏障

    =================                          LINUX内核内存屏障                          ================= By ...

  8. CPU缓存和内存屏障

    CPU性能优化手段 - 缓存 为了提高程序的运行性能, 现代CPU在很多方面对程序进行了优化例如: CPU高速缓存, 尽可能的避免处理器访问主内存的时间开销, 处理器大多会利用缓存以提高性能 多级缓存 ...

  9. volatile 和 内存屏障

    接下来看看volatile是如何解决上面两个问题的: 被volatile修饰的变量在编译成字节码文件时会多个lock指令,该指令在执行过程中会生成相应的内存屏障,以此来解决可见性跟重排序的问题. 内存 ...

随机推荐

  1. 如何使用F4的IRAM2内存

    在使用KEIL做F4的项目的时候发现RAM区有片上IRAM2选项,查了datesheet后发现这块是CCM内存区 CCM内存是在地址0x1000000映射的64KB块,只提供CPU通过数据D总线进行访 ...

  2. CTF实验吧——证明自己吧

    题目地址:http://www.shiyanbar.com/ctf/28 没有壳 ,vc++ 写的 拖进OD观察观察,发现代码很短哟,先来看这俩个call 怀疑他们其中有正确的flag和我们输入的东西 ...

  3. 美食家App开发日记3

    由于个人原因,感觉Android的学习特别复杂,初次接触,实在难以完成最初设想,所以将最初的设想做减法. 今天学习了ListView控件,将图片和美食名字使用ListView界面显示出来,并学习提升L ...

  4. 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...

  5. 添加动态输出 Adding Dynamic Output 精通ASP-NET-MVC-5-弗瑞曼 Listing 2-7

    ViewBag Dynamic Output

  6. BZOJ 3691 游行

    题目传送门 分析: 没被访问的点要C费用,跑一次路要C费用 把这两个统一一下试试... 那就是每次不标记起点或者终点 那就是路径覆盖了2333 二分图,x 部 i 号点与 y 部 j 号点连 i 到 ...

  7. JavaScript中this的使用及含义(总结)

    this 1.谁调用,指向谁 2.事件监听函数中,this指向,绑定监听函数的那一个元素节点 即,谁绑,指向谁 3.当一个函数没有被其他对象调用时,(普通调用),this指向全局对象(严格模式下面是u ...

  8. [HNOI2008]明明的烦恼(prufer序列,高精度,质因数分解)

      prufer序列 定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 描述 eg 将 ...

  9. Day4-Python3基础-装饰器、迭代器

    今日内容: 1.高阶函数 2.嵌套函数 3.装饰器 4.生成器 5.迭代器 1.高阶函数 定义: a:把一个函数名当作实参传给函数 a:返回值包含函数名(不修改函数的调用方式) import time ...

  10. 《ASP.NET Core 高性能系列》ASP.NET Core的启动过程(1)

    一.一切从头开始 简述:知道事情的真相就应该从头 开始,下面我们代码先行 public class Program { public static void Main(string[] args) { ...