简述CPU多核并发缓存架构,JVM模型和JMM多线程内存模型

CPU多核并发缓存架构简述

首先讲一下CPU的工作原理

早期的CPU性能低,并且是单核,CPU直接和主存交互,从主存读写数据直接完成。
随着CPU的不断升级,主存和CPU的匹配越来越差,于是引入了缓存。

CPU读取数据首先查看寄存器中有没有他要的数据。
如果寄存器没有,就在一级缓存查找。
如果一级缓存没有,就在二级缓存查找。
二级也没有,最后在主存中查找数据。
注意:在最后和主存交互的时候有一点需要注意,由于这时有多个CPU需要从主存中取数据,CPU1取了数据,CPU2也取了数据,那么到底要存哪个数据?于是引入了缓存一致性协议MESI。这里不细谈这个。总之有了这个协议才可以保证数据的一致性。
简述CPU多核并发缓存架构,JVM模型和JMM多线程内存模型_第1张图片

JVM内存模型

简述CPU多核并发缓存架构,JVM模型和JMM多线程内存模型_第2张图片
Java在运行程序的时候会自动将数据分成上面几个区域。蓝色代表线程的共享数据区域,绿色是各个线程的私有区域。

  • 方法区:
    用于存储编译后的数据。包括:类信息、常量、静态变量还有运行时常量池(存储编译后的符号引用和编译生成的字面变量)
  • JVM堆
    JVM内存最大的一块,主要用来为对象实例分配内存,还有他是垃圾回收管理的主要区域。
  • 程序计数器
    存放当前线程的下一条操作的字节码行号,字节码解释器工作的时候读取这个行号,从而决定执行分支、循环、跳转、异常处理等功能。
  • 虚拟机栈
    随着线程的创建而出现,每个方法执行的时候都会在这里记录他的参数信息,指针,返回值等信息。
  • 本地方法栈
    这部分主要与虚拟机用到的 Native 方法相关。

    Java多线程内存模型概述(重要)

    这个模型是一个抽象的,是一个规范。他规定了线程从内存中访问变量的规范。
    首先JAVA会给每个线程分配内存用来为他们存储各自的私有数据,每个线程想要获取主存中的变量(共享变量),必须将这个变量复制一份到自己的工作内存,对他改变后再放回主存中。
    具体访问细节见图
    简述CPU多核并发缓存架构,JVM模型和JMM多线程内存模型_第3张图片

  • Lock Unlock
    要想保证共享变量修改的一致性,每个线程在读取到数据后,必须给变量加锁,读取完之后再解锁。
  • Read
    获取到主存中的数据,将他传送到线程工作的内存
  • Load
    在线程工作的内存中将获取的数据复制一份。
  • Use
    如果线程计数器区读到了改变数据相关的字节码操作数,就会对得到的副本数据传给执行引擎。
  • Assign
    在虚拟机遇到赋值的字节码指令,将执行引擎传过来的值赋值给工作区内存的变量
  • Store
    将工作内存中的变量传给主内存。
  • Write
    把获取到的工作变量写入到主内存中。

图片来源:刘乃源讲义

你可能感兴趣的:(线程jmmjvmjava缓存)