内存?java模型?jvm结构?一篇文章让你全部看懂!
Posted Linkey bpm
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存?java模型?jvm结构?一篇文章让你全部看懂!相关的知识,希望对你有一定的参考价值。
计算机内存
相信每个人都有一台电脑,也有diy电脑的经历。现在一台功能强大的diy电脑大概3k就能组装起来,一个i5-8400 的cpu 869元,DDR4 内存 1200块钱,b360主板300元 散热器50元 机械硬盘200元 350w电源300元 机箱100元 ,没错,只要3k就能拿到一个性能强大的6C6T电脑。
要说一台PC中最重要的部件是什么?大家看价格也会看明白,是cpu和内存,下面我来介绍一下cpu和内存之间的关系。
cpu与内存缓存的千丝万缕
cpu相关术语
首先说明一下相关的cpu术语:
socket:cpu插在主板上那个槽与cpu称作一个socket。
Die:核心(Die)又称为内核,是cpu的物理组成部分之一。cpu也会分为多die cpu与单die cpu,譬如我们现在强大的AMD TR-2990WX就是4die cpu,每个die里面有8个核心(core)
core:也就是物理核心了。core这个词是英特尔起的,起初是为了与竞争对手AMD区别开,后面用的多了也淡了。
thread:就是硬件线程数。一个程序执行可能需要多个线程一起进行~而现在也就比较强大的超线程技术,过去的cpu往往一个cpu核心只支持一个线程,现在一些强大的cpu中,就譬如IBM 的POWER 9 ,支持8核心32个线程(平均一个核心4个线程),理论性能非常强大。
总结一下,以明星cpu AMD TR-2990WX作为栗子,这个cpu使用一个socket,一个socket里面有4个die,总共32个物理核心64个线程
cpu缓存
我们都知道,cpu将要处理的数据会放到内存中保存,可是,为什么会这样,将内存缓存硬盘行不行呢?
答案当然是不行的。cpu的处理速度很强大,内存的速度虽然非常快速但是根本跟不上cpu的步伐,所以,就出现的缓存。与来自DRAM家族的内存不同,缓存SRAM与内存最大的特点是,特别快,容量小,结构复杂,成本也高。
造成内存和缓存性能差异,主要有以下原因:
DRAM储存一位数据只需要一个电容加上一个晶体管,而SRAM需要6个晶体管。由于DRAM保存数据其实是在电容里面的,电容需要充放电才能进行读写操作,这就导致其读写数据就有比较大的延迟问题。
SRAM的频率和cpu频率比较接近;而DRAM的频率和cpu差距比较大。
近代的缓存通常被集成到cpu当中,为了适应性能与成本的需要,现实中的缓存往往使用金字塔型多级缓存架构。也就是当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。
下面是英特尔最近以来用的初代skylake架构
可以看到,每个个核心有专属的L1,L2缓存,他们共享一个L3缓存。如果cpu如果要访问内存中的数据,必须要经过L1,L2,L3,LLC(或者L4)四层缓存。
缓存一致性问题
最开始的cpu,其实只是一个核心一个线程的,当时根本不需要考虑缓存一致性问题,单线程,也就是cpu核心的缓存只被一个线程访问。缓存独占,不会出现访问冲突等问题。
时代不断发展,**“多核CPU多线程”**来了,即多个线程访问进程中的某个共享内存,且这多个线程分别在不同的核心上执行,则每个核心都会在各自的caehe中保留一份共享内存的缓冲。由于多核是可以并行的,可能会出现多个线程同时写各自的缓存的情况,而各自的cache之间的数据就有可能不同。
这就是我们说的缓存一致性问题。
目前公认最好的解决方案是英特尔的MESI协议,下面我们着重介绍。
MESI协议
首先说说I/O操作的单位问题,大部分人都知道,在内存中操作I/O不是以字节为单位,而是以“块”为单位,这是为什么呢?
其实这是因为I/O操作的数据访问有空间连续性特征,即需要访问内存空间很多数据,但是I/O操作比较慢,读一个字节和读N个字节的时间基本相同。
机智的intel就规定了,cpu缓存中最小的存储单元是缓存行cache line
,在x86的cpu中,一个cache line
储存64字节,每一级的缓存都会被划分成许多组cache line
。
缓存工作原理请看
以上是关于内存?java模型?jvm结构?一篇文章让你全部看懂!的主要内容,如果未能解决你的问题,请参考以下文章