机器硬件CPU与JMM

(1)CPU Cache模型

cpu与内存进行数据交互, 存在缓存.
分为一级缓存,二级缓存, 三级缓存
L1i 为一级缓存, 存放指令, L1d(data)存放数据.
L2 为二级缓存
L3 为三级缓存


多个CPU都会去访问同一个内存空间 .
每一个cpu都存在寄存器,
cpu中数据是存放在寄存器中的,

cpu获取数据的方式:
先从寄存器中取数据 , 如果取不到 , 那么去Cache中去取, Cache中如果取不到 , 那么去内存中去取数据,

接着: 内存 --> Cache–> 寄存器

内存容量大, Cache 容量小, 寄存器容量更小 .

注意: 每一个CPU的Cache都是独立的.

对于共享变量:
如果要修改共享变量的值, 首先把共享变量读取到Cache缓存中来, cpu再去修改缓存中的数据.
修改完成后, 再把数据返回给内存.

数据的不一致性问题:
如果一个共享变量i, 某个cpu去修改的它值, 某个cpu去读取它的值.
例如一个共享变量i=10 , 如果读取的线程在修改前读取那么读取的是10 , 如果读取在修改后, 那么可能读取的是9.
因此可能存在数据不一致的问题.

解决数据不一致的问题方案:

  1. 总线加锁
    缺点 : 当你对某个cpu进行加锁后, 其他的cpu就不能使用这个总线了. 效率太低,粒度太大.

  2. 缓存的一致性协议 MESI
    a. 读操作: 不做任何事情, 把cache中的数据读取到寄存器
    b. 写操作: 发出信号,通知其他的CPU, 将该变量的Cache line置为无效的状态, 其他的cpu要访问这个变量的时候, 只能从内存中获取数据.

Cache line 为线程的实现机制, cpu的缓存中会有很多的cache line 即数据线,

(2)JMM (java memory model )

主存 对应cpu的内存
线程 对应cpu , 多个线程,对应多个cpu

每一个线程都有对应的工作空间.

jmm内存模型图

线程要获取数据时, 先从工作空间中获取, 如果获取不到则从主存中获取数据

JMM要解决的是主存中的数据是怎么和工作空间中的数据进行交互的

  1. 主存中的数据,所有的线程都可以访问
  2. 每个线程都有自己的工作空间. 即本地内存. 工作空间中存储的是对象的地址
  3. 工作空间存储的数据: 局部变量, 内存的副本.
  4. 线程不能直接修改内存中的数据, 只能把数据从主存中读取到工作空间中进行修改,修改完成后, 把数据刷新到内存.

JMM中工作空间中的数据, 可能是来源于cpu中的寄存器 , Cache缓存 或者内存.
主存中的数据也是一样.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值