CPU多级缓存以及JMM和JVM区别

在说二者的区别之前我们需要先说一下CPU的多级缓存架构

我们都知道在CPU访问我们的内存是通过总线(IO总线、内存总线)去访问的,因为CPU和内存是两个相对独立的对象,因为CPU作为计算机的计算单元只认识0101这样的二进制码,而CPU和内存是作为现代计算机主要组成部分。

CPU多级缓存架构:cpu寄存器 ---------L1 L2 L3缓存 ----bus总线(缓存一致性原则)-----主内存(内存条)。

在我们的线程读取数据也就是CPU读取数据是一个怎么样的流程?线程获取数据先去cpu寄存器里面取(具体是找对应变量的地址)如果没有再去cpu缓存里面取L1---L2----L3。

从上面的流程可以看出来,基本上线程读取速度(取决于离cpu的距离): cpu上面的寄存器>L1>L2>L3>内存。

在现代计算机可能都会存在多核的情况,比如一个cpu两个核的情况下多级缓存是如何实现的呢?

CPU多级缓存以及JMM和JVM区别_第1张图片

 如图所示,一个cpu有两个核core0 和core1 ,每一个核都有单独的一个寄存器 L1和L2是每一个内核独享的 L3是这个cpu所有的内核共享的。

两个原则:

空间局部性原则:当需要读取X=0到内核里面的时候 也会将x=0附件的所有的值也会读取。

时间局部性原则:当cpu在加载某一个变量的时候,用完了不会马上丢(会缓存一段时间 这个时间不会太久),cpu认为,这个变量很可能在某一个时间再次被访问。

还有一个问题,因为存在多个核,就会存在线程上下文切换的问题?

线程上下文切换: 当cpu执行两个线程的时候,会先将两个线程各自分配自己的运行时间,,,当T1时间到了 cpu会保持该线程的运行状态,,接着去执行T2 当转到 T1的时候,也会保持T2的运行状态。

CPU分用户核心 系统内核 一般情况下第三方软件基本上运行在用户空间 像操作系统基本上是运行在内核空间的

  • 分用户线程 (ULT) 用户只能在用户空间创建线程 如果需要调用内核线程(cpu内核系统提供的了访问接口调度)
  • 内核线程 (KLT) CPU分级别四个安全级别 Ring0----Ring4 由于安全性问题用户不会创建Ring权限 用户创建的线程没有CPU的使用权限 只能通过调用内核通过的接口去调用内核线程

操作系统分为用户态和内核态,而线程一般情况是用户态行为,那么我们是怎么利用用户态调用内核态的呢,在java里面我们是通过jvm去调用内核态的,这个过程可以用创建线程过程来理解,用户创建线程jvm通过调用cpu内核空间里面的pthread库区创建,这个时候其实就是用户空间和内核空间进行来回转换。在阻塞线程,杀死线程的操作也会进行内核态和用户态的转换。当然这个转换是相当重的,也相当消耗性能。

可能一些人就会问既然这个空间转换是非常消耗性能的我为什么操作系统还要这么设计,其实说白了就是为了安全考虑,假如没有这个转换,第三方软件可以随便访问内核态可能就会出现问题(比如360软件就可以重置内核设置(时钟。。。等等一些高风险的操作))。

我们把CPU多级缓存的这样的一个抽象(内存和硬件架构操作系统之间关系,围绕 原子性 有序性 可见性展开)统称为JMM

JVM是针对GC、内存划分,回收的进行逻辑上划分,是真实存在的,而 jvm线程执行 是申请cpu的逻辑空间不是物理空间(内存条)这个逻辑空间是由系统已经划分好的。

你可能感兴趣的:(cpu多级缓存,jvm,jmm,jvm,java)