当前位置: 首页 > news >正文

CPU缓存一致性问题

什么是可见性问题?

Further Reading :什么是可见性问题?
缓存一致性 内存一致性 内存可见性 顺序一致性区别

CPU缓存一致性问题

由于CPU缓存的出现,很好地解决了处理器与内存速度之间的矛盾,极大地提高了CPU的吞吐能力,但是也为计算机系统带来更高的复杂度,它引入了一个新的问题: 缓存一致性(Cache Coherence)

比如:多路处理器系统中, i++ 这个操作,在程序的运行过程中,首先需要将主内存中的数据复制一份存放到CPU Cache中,那么CPU寄存器在进行数值计算的时候就直接到Cache中读取和写入,当整个过程运算结束之后再将Cache中的数据刷新到主存当中
具体过程如下。
1)读取主内存的i到CPU Cache中。
2)对i进行加一操作。
3)将结果写回到CPU Cache中。
4)将数据刷新到主内存中。
i++在单线程的情况下不会出现任何问题,但是在多线程的情况下就会有问题。

每个线程都有自己的工作内存(本地内存,对应于CPU中的Cache),变量i会在多个线程的本地内存中都存在一个副本。如果同时有两个线程执行i++操作,假设i的初始值为0,每一个线程都从主内存中获取i的值存入CPU Cache中,然后经过计算再写入主内存中,很有可能i在经过了两次自增之后结果还是1,这就是 典型的缓存不一致性问题

PS:多路处理器系统,每个处理器都有自己的高速缓存,而它们又共享同一主内存(Main Memory),这种系统称为共享内存多核系统(Shared Memory Multiprocessors System)
-----------------------------------------------------------------------------读书笔记摘自 书名:深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)作者:周志明

为了解决缓存不一致性问题,通常主流的解决方法有如下两种。

1、通过 总线加锁 的方式

第一种方式常见于早期的CPU当中,而且是一种悲观的实现方式,从而使得只有一个CPU(抢到总线锁)能够访问这个变量的内存。这种方式效率低下,所以就有了第二种通过缓存一致性协议的方式来解决不一致的问题。
Further Reading :处理器总线的工作机制

2、通过 缓存一致性协议的方式

在缓存一致性协议中最为出名的是Intel的 MESI 协议,MESI协议保证了每一个缓存中使用的共享变量副本都是一致的。它的大致思想是, 当CPU在操作Cache中的数据时,如果发现该变量是一个共享变量,那么进行如下操作:
1、读取操作,不做任何处理,只是将Cache中的数据读取到寄存器。
2、写入操作,发出信号通知其他CPU将该变量的Cache line置为无效状态,其他CPU在进行该变量读取的时候不得不到主内存中再次获取。

协议是规则,光说不做,MESI就是它的一个实现

在这里插入图片描述

-----------------------------------------------------------------------------读书笔记摘自 书名:Java高并发编程详解:多线程与架构设计 作者:汪文君

http://www.lryc.cn/news/264596.html

相关文章:

  • 35道HTML高频题整理(附答案背诵版)
  • 【powershell】Windows环境powershell 运维之历史文件压缩清理
  • 【Linux】Linux线程概念和线程控制
  • Flink cdc3.0同步实例(动态变更表结构、分库分表同步)
  • 国产Apple Find My认证芯片哪里找,伦茨科技ST17H6x芯片可以帮到您
  • 肺癌相关知识
  • ChimeraX使用教程-安装及基本操作
  • 【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数
  • Redis一些常用的技术
  • 基于QPainter 绘图图片绕绘制设备中心旋转
  • 计算机网络(4):网络层
  • 动态内存分配(malloc和free​、calloc和realloc​)
  • C语言---井字棋(三子棋)
  • [Kubernetes]3. k8s集群Service详解
  • C++ 指定范围内递增初始化一个vector<int> | Python: list(range(31, 90))
  • 【Java之数据结构与算法】
  • 爬虫scrapy中间件的使用
  • 普冉(PUYA)单片机开发笔记 [完结篇]:使用体会
  • Elasticsearch:生成 AI 中的微调与 RAG
  • ip静态好还是dhcp好?
  • PolarDB-X、OceanBase、CockroachDB、TiDB二级索引写入性能测评
  • Convolutional Neural Network(CNN)——卷积神经网络
  • 鸿蒙开发基本概念
  • Open CV 图像处理基础:(二)从基本概念到实践操作
  • 【MAC】M2 安装docker 与 mysql
  • 轻量级web开发框架Flask本地部署及无公网ip远程访问界面
  • 用最通俗的语言讲解 TCP “三次握手,四次挥手”
  • 使用RedisCacheWriter#clean在线异步地批量扫描匹配删除缓存数据-spring-data-redis
  • 机器视觉:AI赋能缺陷检测,铸就芯片产品的大算力与高能效
  • (9)Linux Git的介绍以及缓冲区