zoukankan      html  css  js  c++  java
  • 详解十二章volatile初识,CPU和JVM

    1、volatile关键字只能修饰类变量和实例变量,对于方法参数、局部变量以及实例常量,类常量都不能进行修饰。

    class A
    {
      private int B;实例变量
      static int C;类变量 }

    2、CPU的寄存器完成所有的运算操作,CPU指令的执行涉及数据的读取和写入,CPU的处理速度快,但是CPU访问内存的速度慢。速度不对等,传统方式导致CPU资源受限制,CPU整体吞吐量低,于是就有了在CPU和主存之间增加缓存的设计。


    3、缓存是为了解决CPU直接访问内存效率低下问题的,程序运行过程中,会将运算所需要的数据从主存复制一份到CPU缓存中,CPU进行运算时直接对缓存中的数据进行读取和写入,运算结束后,再将缓存中的最新数据刷新到主存中。


    4、单线程时候数据不会出现问题,多线程的时候,每个线程都有自己的工作内存。一个变量会在多个线程的本地内存中都存在一个副本。会导致缓存不一致问题。


    5、解决缓存不一致,主流两个方法:总线加锁、缓存一致性协议;

    • 总线加锁:悲观的实现方式,只有一个CPU(抢到总线锁)能够访问这个变量的内存。
    • 缓存一致性协议:出名的MESI协议保证了每一个缓存中使用的的共享变量副本都是一致的。

    缓存一致性协议两步操作

    • 1)读取:不做任何处理,只是将缓存中的数据读取到寄存器
    • 2)写入:发出信号通知其他CPU将该变量的Cache line置为无效状态,其他CPU在进行该变量读取的时候不得不再到主内存中再次获取。

     

  • 相关阅读:
    [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)
    [luogu3230 HNOI2013] 比赛 (搜索+Hash)
    [luogu2317 HNOI2005] 星际贸易 (dp)
    [luogu2414 NOI2011]阿狸的打字机 (AC自动机)
    [bzoj3507 Cqoi2014]通配符匹配 (hash+DP)
    [luogu2054 AHOI2005] 洗牌 (数论)
    bzoj1491 [NOI2007]社交网络
    bzoj1022 [SHOI2008]小约翰的游戏John
    bzoj1088 [SCOI2005]扫雷Mine
    bzoj1295 [SCOI2009]最长距离
  • 原文地址:https://www.cnblogs.com/lhh666/p/12912826.html
Copyright © 2011-2022 走看看