JVM:JVM是抽象的计算机模型,JVM运行时数据区划分的原因;CPU的发展及衍生问题,CPU发展过程,CPU多核心数的发展由来;内存缓存一致性问题,CPU缓存一致性问题,Java多线程缓存一致性问题

JVM:JVM是抽象的计算机模型,JVM运行时数据区划分的原因;CPU的发展及衍生问题,CPU发展过程,CPU多核心数的发展由来;内存缓存一致性问题,CPU缓存一致性问题,Java多线程缓存一致性问题

  • JVM是抽象的计算机模型
    • JVM运行时数据区划分的原因
  • CPU的发展及衍生问题
    • CPU发展过程:单核心→多核心、磁盘交互→内存交互、单线程→多线程
    • CPU多核心数的发展由来
  • 内存缓存一致性问题
    • CPU缓存一致性问题
    • Java多线程缓存一致性问题

JVM是抽象的计算机模型

计算机模型必然遵守冯诺依曼计算机体系模型,JVM是抽象的计算机模型,当然也遵守冯诺依曼计算机体系模型。
JVM:JVM是抽象的计算机模型,JVM运行时数据区划分的原因;CPU的发展及衍生问题,CPU发展过程,CPU多核心数的发展由来;内存缓存一致性问题,CPU缓存一致性问题,Java多线程缓存一致性问题_第1张图片
因此,需要有输入设备、输出设备、存储器、运算器、控制器,也就是说输入进来需要有存储数据的地方,还要有执行数据的地方,还有输出的地方,而输入就是类加载器帮你将文件加载进来,输出就是将它输出成对应平台的机器码去进行run,数据文件加载进来,总要有地方去存储数据、区队数据进行执行和流转。

JVM运行时数据区划分的原因

JVM是抽象的计算机模型,当然也遵守冯诺依曼计算机体系模型,所以JVM肯定也不是一个只有内存的结构就不管了,它必然是会将JVM划分成不同的区域(组成了运行时数据区)。

CPU的发展及衍生问题

CPU发展过程:单核心→多核心、磁盘交互→内存交互、单线程→多线程

3## CPU为什么要用内存进行交互?
如果说CPU频繁的交互不交给内存,而是交给磁盘,那么随着CPU的不断发展,CPU的运转速度会越来越快,磁盘的读写性能必定会跟不上CPU的读写速度,即使是SSD(固态硬盘)也跟不上,它相比普通硬盘也仅是减少了寻道时间,或者说是加快了找数据的时间,那么才会在此基础上设置了内存这个东西,用来解决单次IO时间过长导致CPU的等待成本过大的问题。

CPU多核心数的发展由来

那么随着CPU处理速度的的飞速发展,哪怕是使用内存也跟不上CPU的一个读写速度,因此个时候CPU厂商就想了一个办法,在每一个CPU上都增加一个高速缓冲区,用来加快读写速度。JVM:JVM是抽象的计算机模型,JVM运行时数据区划分的原因;CPU的发展及衍生问题,CPU发展过程,CPU多核心数的发展由来;内存缓存一致性问题,CPU缓存一致性问题,Java多线程缓存一致性问题_第2张图片

摩尔定理:
有两种说法,一种是说对于芯片,即ic芯片每个18个月呢个够容纳的晶体管会翻倍;另一种说法是一个叫摩尔的人的经验之谈,他说CPU的性能每隔18个月性能会翻倍。

根据摩尔定理,即使性能翻倍,CPU的个数也不可能无限制的增长,那么这个时候单核的CPU它的主频必然会有一个性能瓶颈,随着时间的增长,单核的CPU顶不住了,如果想要提升性能,能不能将加多个运算核心呢?这个时候,随着时间的增长,CPU多核的时代就来临了。

基于高速缓存的存储,可以很好解决处理器以及内存之间的矛盾,但是也引入了新的问题,内存缓存一致性问题。

内存缓存一致性问题

CPU缓存一致性问题

如果说有多个运算核心的话,每个运算核心都会有自己的高速缓存,那么这个时候问题就是:当多个处理器运算都涉及到同一块内存区域的时候,那么就可能产生所谓的缓存不一致问题。

为了解决这个问题,我们需要各个所谓的CPU处理器运行时、包括各个运算核心都必须遵循一些协议,这个协议就是高速储存器一致性协议来解决高速缓存一致性问题。比如MSI、MESI、MOSI、Synapse、Firely、DragonProtocol等。那么它们的结构大致设计如下:
JVM:JVM是抽象的计算机模型,JVM运行时数据区划分的原因;CPU的发展及衍生问题,CPU发展过程,CPU多核心数的发展由来;内存缓存一致性问题,CPU缓存一致性问题,Java多线程缓存一致性问题_第3张图片
可以看到,在CPU中间有运算核心,每个运算核心都对应了一个高速缓冲区,这个时候,中间的这个协议保证了缓存的一致性,然后再到同一块主存。

运行时数据区其实也保有了这样子的一种设计,java中使用的是多线程机制,那么它如何保证数据的一致性?

Java多线程缓存一致性问题

在编程语言Java中使用的是多线程的机制,同样的也会有多个任务同时执行,这个任务就类比CPU的运算核心,那么必然也需要一块区域或者说是一种操作能够保证我们数据的一致性,意味着在JVM内存当中,数据存放的部分必然是有一部分区域是所有线程能够同时获取到的,那么我们称那块区域为线程共享,而每个线程都会有自己单独的工作内存,当我们的线程运行操作的时候,我们的数据肯定会从JVM的一个主存拷贝到我们线程自己的工作空间去,那么这个实际上也是参照了CPU缓存一致性的设计去做的。

当我们的线程进行运作的时候,我们的数据肯定会有独有的线程工作空间,这个独有的线程工作空间我们称之为线程私有

上述内容,可以了解到在软件的设计上,很多方面是借鉴和参照了计算机原理以及计算机硬件模型,这也是每个软件开发人员必备的知识。

你可能感兴趣的:(jvm,jvm,缓存,java)