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
把获取到的工作变量写入
到主内存中。
图片来源:刘乃源讲义
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。