zoukankan      html  css  js  c++  java
  • java内存模型

    打破双亲委派机制

    1. 如何打破:重写loadClass()
    2. 打破这种机制的三种情况
      1. JDK1.2以前,自定义ClassLoader都必须重写loadClass()
      2. ThreadContextClassLoader可以实现基础类调用实现类代码,通过thread.setContextClassLoader指定
      3. 模块化的时候使用热部署,热启动

    1600500008060

    读取缓存cache line为基本单位,目前64bytes
    伪共享,使用缓存行的对齐能够提高效率
    

    1600500402598

    位于同一缓存行的两个不同数据,被两个不同CPU锁定,产生互相影响的伪共享问题。
    一个CPU去读数据的时候会把整行都load到内存里所以y就跟着进来了,另外一个CPU读y的时候整个行load到内存x也就跟着进来了。
    硬件的设计上很多是按块来执行的,并不是按字节一位一位来执行。
    所以最简单的方法就是把总线锁住,这句话的意思是说给L3和L2中间加个锁,意思就是我第一个CPU访问数据的时候另一个不允许访问,这个叫总线锁,
    但有一个问题,因为它把总线上了锁,因为另外一个CPU去访问y它也得等着,把整条线都锁了。
    

    MESI Cache一致性协议

    这个协议的内容意思其实就是它给每一个缓存的内容做了一个标记,比如我这个CPU里面读了一个数进来X,这个时候我给缓存做了一个标记,这个X和我们主存的内容相比没有更改过。

    • 更改过标记成m这叫Modifued
    • 如果是读享我标记成Exclusive
    • 如果这个内容我读的时候别人也在读就标记成Sharod
    • 如果说这个内容在我读的时候被别的CPU修改过就标记成Inbalid,这时候说明我读的数据已经是无效的

    所以它叫MESI的协议,通过这个协议来让各个CPU之间的缓存保持一致性。

    现代CPU的数据一致性实现=缓存锁(MESI等等各种协议)+总线锁

    如何保证特定情况下不乱序

    volatile就保证了有序性

    有序性保障
    X86 CPU内存屏障
    
    sfence:在sfence指令前的写操作当必须在sfence指令后的写操作前完成。
    Ifence:在Ifence指令前的读操作当必须在Ifence指令后的读操作前完成。
    mfence:在mfence指令前的读写操作当必须在mfence指令后的读写操作前完成。
    

    硬件层面

    在你保证有序性同时硬件层面指令,汇编指令CPU会编辑,第一个是加锁,但是为了提高效率在CPU会令级别很多CPU做了同一件事加内存屏障,这就是CPU级别的内存屏障,不同的CPU它的内存屏障指令是不一样的。

    认识内存屏障

    内存屏障:这两个指令不可以重排,中间加个屏障sfence,不能把上面挪到下面去,也不能把下面挪到上面去,这是写指令。

    读指令,我们要读一个内存的指令,有一条指令读了它,另外一条也读了它,这两条指令不可以重排。

    读写指令,上面读写操作都得完成下面才能继续运行这个是在CPU级别的内存屏障

  • 相关阅读:
    智能电视系列(4)-高通,天才与极限
    Intel processor brand names-Xeon,Core,Pentium,Celeron----Xeon
    Intel CPUs
    Configuring IPMI under Linux using ipmitool
    CPUID
    About Intel® Processor Numbers
    ipad iphone 开发的应用,加一个启动预览图片
    mysql 查询随机条记录的sql语句和php计算概率
    参考:iPhone OS 3.0中的字体列表
    UIScrollView 不能滚动的问题
  • 原文地址:https://www.cnblogs.com/striver20/p/13763529.html
Copyright © 2011-2022 走看看