【笔记】高并发编程第二阶段07讲、CPU以及CPU缓存的结构,解决高速缓存一致性问题的两种方案介绍

i = i+1

  1. 从主内存将i的值读到cpu cache中
  2. cpu进行i+1运行
  3. 将i+1后的值写入cpu cache中
  4. 将cpu cache的值写入主内存中

在多线程中或多CPU会引入问题,例如i初始值为5,线程一:从内存中读入到cpu cache,值为5,线程二:也从内存中读入到cpu cache,值也为5,线程一:i+1=6,线程二:i+1=6,线程一将cpu cache最终值(6)写入主内存中,线程二将cpu cache最终值(6)写入主内存中,最后主内存中的i值为6,而不是7。

为了解决缓存不一致的问题,有二种方法:

  1. 给数据总线加锁
    我们知道,CPU与其它部件通信,是通过总线的方式来通信(CPU与内存是通过总线方式通信)
    总线(数据总线、地址总线、控制总线)
    当线程一与主内存通信时,先加个锁,此时线程二不能与主内存通信(获取i值),只有线程一释放锁后,线程二才可以与内存通信,这会造成一个性能问题,CPU速度会很慢,会串行化,效率很慢

  2. cpu cache一致性协议
    Intel MESI协议保证了主内存与cache中的副本一致性的问题。
    核心思想:
    (1) 当cpu写入数据的时候,如果发现该变量被共享(也就是说,在其它CPU也存在该变量副本),会发出一个信号,通知其它CPU,该变量的缓存是无效的。
    (2) 当其他CPU访问变量时,重新从内存中获取。

    还是以i=i+1为例,cpu1: 执行i+1后,写入cpu cache,然后写入主内存,同时会通知cpu2 i值失效(此时如果cpu2正在写入cpu cache,会重新从内存读取值,之前的对i的操作指令,会重新执行一遍(比如执行i+1))。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值