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
把获取到的工作变量写入
到主内存中。
图片起源:刘乃源讲义