6

2.cpu缓存模型&java内存模型

 3 years ago
source link: http://sunliangliang.com/?p=34
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

2.cpu缓存模型&java内存模型

发表于 2021-01-01 | 分类于 并发编程 | 0 | 阅读次数 16

2. cpu缓存模型&java内存模型

1.1.cpu多级缓存机制

cpu是直接操作自己的缓存,并不会频繁的和主内存进行通信,这是当代计算机的进步,为了保障计算效率的提高。

源文件地址

  • 1.cpu将数据从主内存读到cpu缓存,然后Cpu与自己缓存进行交互
  • 2.cpu经过指令运算之后,获取到新值并更新到cpu缓存
  • 3.从cpu缓存写入主内存。

1.2.java并发缓存不一致问题

java的内存模型和cpu类似,每个线程有自己的工作内存,需要将数据从主内存读到工作内存,然后在工作内存中进行相关的操作

  • 1.线程1将flag=1从主内存读到自己的工作内存
  • 2.线程2也将flag=1从主内存读到自己的工作内存,此时线程1和2的工作内存中flag都是1
  • 3.假如此时线程2将flag更新为了7,此时再讲flag=7写回主内存,此时线程2和主内存中的flag都是7,而线程1工作内存中的flag=1,这就导致了java并发编程中,数据不一致的问题。

2.缓存一致性问题

解决缓存一致性的核心是多个cpu之间数据传播的问题。

2.1.总线加锁机制

要处理一个数据的时候,会先通过一个总线对数据进行加锁,其他cpu就无法对该数据进行读写操作。只有该cpu处理完之后,其他cpu才可以读到最新的数据。类似java中的synchronized关键字,这种方式效率极低,串行化的方式。

2.2.总线嗅探机制和

这是最常见的一种,用于解决多个cpu之间数据传播问题的方案。本质是广播,将所有的读写请求都通过总线广播给所有的cpu,然后每个cpu去嗅探这些请求,基于自己的需求进行响应。

2.3.MESI 协议

基于总线嗅探机制的缓存一致性协议,核心是Cache Line 的四个不同的标记

参考

3.java内存模型

3.1.图解

3.2.说明

  • 1.从主内存将数据flag = 0读取出来,此时flag=0
  • 2.将flag=0load到线程1的工作内存中,此时flag=0
  • 3.线程1使用工作内存中的数据flag=0,此时flag=0
  • 4.线程1使用flag=0,并将flag修改为1,此时flag=1
  • 5.将修改后的flag=1分配到工作内存中,此时flag=1
  • 6.将flag=1的数据从工作内存写入到主内存,此时主内存中flag=1
坚持有质量的创作,您的支持将支持我继续创作!

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK