CPU缓存一致性协议MESI

CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。为了解决这个问题,CPU厂商在CPU中内置了少量的高速缓存以解决I\O速度和CPU运算速度之间的不匹配问题。 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。

  1. 时间局部性(Temporal Locality):如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。 比如循环、递归、方法的反复调用等。
  2. 空间局部性(Spatial Locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。 比如顺序执行的代码、连续创建的两个对象、数组等
带有高速缓存的CPU执行计算的流程
  1. 程序以及数据被加载到主内存
  2. 指令和数据被加载到CPU的高速缓存
  3. CPU执行指令,把结果写到高速缓存
  4. 高速缓存中的数据写回主内存
多核CPU多级缓存一致性协议MESI

MESI协议缓存状态

缓存行(Cache line):缓存存储数据的单元。

状态 描述 监听任务
M 修改 (Modified) 该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。 缓存行必须时刻监听所有试图读该缓存行相对就主存的操作,这种操作必须在缓存将该缓存行写回主存并将状态变成S(共享)状态之前被延迟执行。
E 独享、互斥 (Exclusive) 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。 缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S(共享)状态。
S 共享 (Shared) 该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中。 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。
I 无效 (Invalid) 该Cache line无效。

注意: 对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。如果一个缓存将处于S状态的缓存行作废了,而另一个缓存实际上可能已经独享了该缓存行,但是该缓存却不会将该缓存行升迁为E状态,这是因为其它缓存不会广播他们作废掉该缓存行的通知,同样由于缓存并没有保存该缓存行的copy的数量,因此(即使有这种通知)也没有办法确定自己是否已经独享了该缓存行。

从上面的意义看来E状态是一种投机性的优化:如果一个CPU想修改一个处于S状态的缓存行,总线事务需要将所有该缓存行的copy变成invalid状态,而修改E状态的缓存不需要使用总线事务。

cpu多级缓存 - 乱序执行优化

处理器为提高运算速度儿做出违背代码原有顺序的优化。

在单核处理器时代处理器的乱序执行优化不会影响执行结果。在多核处理中,某个核心执行写入操作时,将某个标志当做写入完成,进行重排优化,可能会先执行标志指令导致其他核心以为改核心已经执行完成写入操作。从而拿到错误的值。

java内存模型(java memory model, JMM)
  1. 堆heap 堆是运行时确定的内存,由java GC来维护大小,优点是可以动态的确定大小,缺点是运行时动态确定内存所以速度相对栈小一点。对象存放在堆上。静态变量跟随类一起存放在堆上。
  2. 栈stack 栈内存的速度相对堆内存更快,仅次于寄存器,缺点是大小必须是编译期确定的。缺乏一定的灵活性,存放一些基本的数据变量(int double。。。)java内存要求本地变量(Local Variable),调用栈必须存放在线程栈(Thead Stack)中。

本地变量可能存放的是对象的引用。当两个线程同时引用一个对象时,那么这两个线程的本地引用存放的是这个对象的私有拷贝。

硬件内存模型如图

硬件内存模型和java内存模型的对应模型如图:java内存抽象模型结构看图,本地内存:本地内存是java抽象的概念,涵盖了缓存,写缓存区,寄存器,其他硬件和编译器优化。本地内存储存了共享变量的副本,从硬件的角度上讲主内存就是硬件内存,但是为了获取更好的速度,java可能会将数据存储在寄存器或者高速缓存区。如果线程要通信必须要经过主内存,流程是先在主内存中获取共享变量,存储在本地内存中经由进程计算,然后刷新至主内存,再经由其他线程访问。

java内存模型- 同步操作与规则
  1. lock和Unlack:作用在主内存上只有在Unlock的情况下内存才可以被其他线程锁定。
  2. Read:作用在主内存上,把主内存中的变量输送在工作内存中。
  3. Load:作用工作内存中,把主内存中的值放入到工作内存副本中。
  4. use:作用于工作内存,把数据给执行引擎。每当执行器需要使用到变量时或者执行字节码指令时会执行这个操作。
  5. assign:赋值,在执行赋值操作时执行,将执行引擎中的值赋值给工作内存。
  6. store:存储,把工作内存中的值传递到主内存中。
  7. write:写入,将工作内存中的值写入到主内存中。

下面介绍一下规则,规则是用来限制每一步是如何操作的。

  1. 不允许read和load、store和write单一出现,因为他们是一个连贯的操作。而且必须是按顺序执行的。load必须是read之后,write必须是store之后,但是不一定是连续操作,在他们之间可以插入其他的指令。
  2. 不允许线程丢弃assign操作,也就是说执行完了之后必须放入工作内存中。
  3. 不允许线程不经过Assign操作直接把数据给主内存。
  4. 一个新的变量只能在主内存中诞生。
  5. 一个变量只允许一个线程对其lack操作,但是可以被一个线程lack多次,lack多次之后只有执行相同次数的unlack才能被解锁。
  6. 如果一个变量执行了lack操作之后将会清楚工作内存中该变量的值。执行引擎在使用变量时需要重新执行read-load-use等操作。
  7. 如果没有执行一个lack操作的变量不能执行unlack操作。或者被其他线程执行了lack操作的线程也不能被改线程执行unlack。
多线程并发的优势和缺点

多线程并发-java内存模型和计算机基础相关推荐

  1. 深入探索JVM高效并发 — Java内存模型(四) 先行发生原则

    先行发生原则 Java语言中有一个"先行发生"(Happens-Before)的原则.这个原则非常重要,它是判断数据是否存在竞争,线程是否安全的非常有用的手段. 依赖这个原则,我们 ...

  2. 高并发编程-重新认识Java内存模型(JMM)

    文章目录 从CPU到内存模型 内存模型如何确保缓存一致性 并发变成需要解决的问题 (原子性.可见性.有序性) 内存模型需要解决的问题 Java内存模型 JMM的API实现 原子性 synchroniz ...

  3. Java内存模型深度剖析

    作者:Hollis,阿里资深攻城狮 来自:Hollis 为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事 ...

  4. 再有人问你Java内存模型是什么,就把这篇文章发给他

    前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.有很多小伙伴反馈希望可以深入的讲解下每个知识点.Java内存模型,是这三个知识点当中最晦涩难懂的一个,而 ...

  5. 再有人问你Java内存模型是什么,就把这篇文章发给他。

    前几天,发了一篇文章,介绍了一下JVM内存结构.Java内存模型以及Java对象模型之间的区别.有很多小伙伴反馈希望可以深入的讲解下每个知识点.Java内存模型,是这三个知识点当中最晦涩难懂的一个,而 ...

  6. 史上最清晰的Java内存模型介绍

    这篇文章的标题看起来很霸气,于是我毫不犹豫转了~并且同样起了个霸气侧漏的标题! 本文转载自:再有人问你Java内存模型是什么,就把这篇文章发给他. 网上有很多关于Java内存模型的文章,在<深入 ...

  7. c++ 线程什么时候run_多线程并发支撑基础之JAVA内存模型

    Java内存模型可以说是Java并发的底层支持,了解Java内存模型才能正在了解Java并发. 内存模型 在内存中设置一个变量"value = 1:"那么其他线程能在什么时候读取到 ...

  8. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM

    文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...

  9. java内存模型 原子性_Java内存模型JMM 高并发原子性可见性有序性简介 多线程中篇(十)...

    JVM运行时内存结构回顾 在JVM相关的介绍中,有说到JAVA运行时的内存结构,简单回顾下 整体结构如下图所示,大致分为五大块 而对于方法区中的数据,是属于所有线程共享的数据结构 而对于虚拟机栈中数据 ...

最新文章

  1. 尼克的任务 dp 洛谷1280
  2. JavaScript 设计模式基础(二)
  3. Paper:2017年的Google机器翻译团队《Transformer:Attention Is All You Need》翻译并解读
  4. IOS用户界面的新视觉比例
  5. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-10底层驱动之I2C
  6. 【转载】WEB架构师成长之路
  7. 哪几种人会被房价拐点忽悠
  8. PDO 查询mysql返回字段整型变为String型解决方法
  9. Xamarin.ios引用第三方SDK
  10. Javascript的冒泡排序和二分查找
  11. 【如何注销CSDN账号】说容易也容易,说难也难
  12. 记录隐藏ubuntu桌面图标
  13. 【CS61A】学习笔记
  14. 汉印科技大会:凝聚匠心 成就卓越民族打印机品牌
  15. bzoj5369: [Pkusc2018]最大前缀和 状压Dp 计数Dp
  16. c语言题库字母顺序,C语言题库(带答案)-排版-
  17. uni-app 输入框类型
  18. 注释大全,神兽护体,佛祖保佑,永无bug
  19. 那些SAP项目里的主流外围系统
  20. 输入偏置电流时钟馈通

热门文章

  1. Some personal records
  2. .net mysql和php mysql数据库连接_浅谈PHP连接MySQL数据库的三种方式
  3. python中的return函数-python中return的返回和执行
  4. RabbitMQ修改默认端口:4369、5672、15672、25672
  5. 软件测试面试:请说一下你工作中发现的最有价值的bug?
  6. 为什么这么多应届生要进入互联网行业?
  7. php mysql odbc_使用PHP和MySQL专用接口以及ODBC接口
  8. 云服务器svn怎么用,腾讯云服务器搭建SVN
  9. 3DShader之移位贴图(Displacement Mapping)
  10. DenseNet实验