乐趣区

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

CPU 多核并发缓存架构简述

首先讲一下 CPU 的工作原理

晚期的 CPU 性能低,并且是单核,CPU 间接和主存交互,从主存读写数据间接实现。
随着 CPU 的一直降级,主存和 CPU 的匹配越来越差,于是引入了缓存。

CPU 读取数据首先查看寄存器中有没有他要的数据。
如果寄存器没有,就在一级缓存查找。
如果一级缓存没有,就在二级缓存查找。
二级也没有,最初在主存中查找数据。
留神:在最初和主存交互的时候有一点须要留神,因为这时有多个 CPU 须要从主存中取数据,CPU1 取了数据,CPU2 也取了数据,那么到底要存哪个数据?于是引入了缓存一致性协定MESI。这里不细谈这个。总之有了这个协定才能够保证数据的一致性。

JVM 内存模型


Java 在运行程序的时候会主动将数据分成下面几个区域。蓝色代表线程的共享数据区域,绿色是各个线程的公有区域。

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

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

    这个模型是一个形象的,是一个标准。他规定了线程从内存中拜访变量的标准。
    首先 JAVA 会给 每个线程分配内存 用来为他们存储各自的公有数据,每个线程想要获取主存中的变量(共享变量),必须将这个变量 复制一份 到本人的工作内存,对他扭转后再放回主存中。
    具体拜访细节见图

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

图片起源:刘乃源讲义

退出移动版