首页 > 其他分享 >底层分析为什么CAS不保证可见性

底层分析为什么CAS不保证可见性

时间:2025-01-09 16:00:54浏览次数:6  
标签:缓存 CAS 总线 可见 CPU1 内存 CPU 底层

这些都是笔者辛苦总结,若是对你有用,就点赞收藏支持一下笔者,也是对笔者所写的肯定,谢谢大家!

目录

总线锁定机制

缓存锁定机制(MESI协议) 

伪代码展示

 缓存一致性维护 

两种机制的协同工作

示例


在CPU缓存架构,CAS只保证比较和交换这个操作是原子的,不保证值的可见性,每个CPU都有自己的缓存,CAS成功后值只更新到当前CPU的缓存中。

之前已经介绍过总线锁定机制和缓存锁定机制了,这次再更加详细地介绍一遍,也可以看看笔者的前篇CAS操作的底层原理(总线锁定机制和缓存锁定机制 )-CSDN博客

总线锁定机制

CPU1 执行CAS操作:
1. 发出LOCK#信号到总线
2. 锁定总线
3. 执行内存读取
4. 比较并交换
5. 写回内存
6. 释放总线锁 

总线锁会直接锁住内存访问,其他CPU无法通过总线访问内存,保证了操作的原子性。

缓存锁定机制(MESI协议) 

步骤1:CPU1要执行CAS
->检查数据是否在自己的缓存中
->如果是,检查缓存行状态

步骤2:如果缓存行状态是S(共享)
->发出"独占请求"到总线
->其他CPU收到请求后将其缓存行置为I(无效)
->CPU1将缓存行状态改为E(独占)

步骤3:执行CAS操作
->在缓存中完成比较和交换
->将缓存行状态改为M(修改)

步骤4:操作完成后
->其他CPU要访问该数据时发现缓存行无效
->从拥有M状态的CPU缓存中获取最新数据

伪代码展示

class CacheLineOperation {
    // 缓存行状态
    enum State { MODIFIED, EXCLUSIVE, SHARED, INVALID }
    
    class CacheLine {
        State state;
        int value;
        boolean locked;
    }
    
    // CPU缓存操作模拟
    void performCAS(CacheLine line, int expect, int update) {
        // 1. 获取缓存行独占权
        acquireExclusive(line);
        
        // 2. 执行CAS
        if (line.value == expect) {
            line.value = update;
            line.state = State.MODIFIED;
        }
        
        // 3. 通知其他CPU
        notifyOtherCPUs();
    }
}

 缓存一致性维护 

CPU1 Cache [A=1, M]  ──┐
CPU2 Cache [A=1, S]   ──┼── 总线
CPU3 Cache [A=1, S]  ──┘

当CPU1执行CAS:
1. CPU1发出独占请求
2. CPU2和CPU3将各自的缓存行置为I
3. CPU1执行CAS操作
4. CPU1缓存行状态变为M

两种机制的协同工作

CAS操作执行时如果数据在缓存中:
1. 使用缓存锁
2. MESI协议保证一致性
3. 最终写回内存

CAS操作执行时如果数据不在缓存中:
1. 使用总线锁
2. 直接操作内存
3. 更新所有CPU缓存

写回策略
1. 缓存行被替换
2. 其他CPU请求该数据
3. 显式的内存屏障指令
4. 系统总线请求

示例

public class Counter {
    // 错误示例:只用CAS
    private int count;
    
    public void increment() {
        while (!compareAndSet(count, count + 1)) {}
        // 其他线程可能看不到更新
    }
    
    // 正确示例:CAS + volatile
    private volatile int countWithVolatile;
    
    public void incrementRight() {
        while (!compareAndSet(countWithVolatile, countWithVolatile + 1)) {}
        // 其他线程立即可见
    }
}

这些都是笔者辛苦总结,若是对你有用,就点赞收藏支持一下笔者,也是对笔者所写的肯定,谢谢大家!

标签:缓存,CAS,总线,可见,CPU1,内存,CPU,底层
From: https://blog.csdn.net/xweiran/article/details/145035802

相关文章

  • ☘️☘️☘️React和Vue底层机制相关优秀文章
    ReactFiber相关讲解React技术揭秘完全理解ReactFiber[译]深入Reactfiber架构及源码看家本领来了:全面了解ReactSuspense和Hooks走进ReactFiber的世界ReactFiber是什么reactfiber到底有多细你不知道的ReactVirtualDOM我对React实现原理的理解......
  • 聊一聊 C#异步 任务延续的三种底层玩法
    一:背景1.讲故事最近聊了不少和异步相关的话题,有点疲倦了,今天再写最后一篇作为近期这类话题的一个封笔吧,下篇继续写我熟悉的生产故障系列,突然亲切感油然而生,哈哈,免费给别人看程序故障,是一种积阴德阳善的事情,欲知前世因,今生受者是。欲知来世果,今生做者是。在任务延续方面,我个......
  • vector底层实现详讲
    目录1.vector的介绍1.1vector构造函数的定义1.2vectoriterator的使用1.3vector的空间增长问题1.4vector的增删查改2.vector代码的实现2.1vector扩容2.2插入元素2.3删除元素2.4成员函数初始化2.4.1拷贝构造2.4.2赋值运算符重载2.4.3构造函数(迭代器......
  • Java HashMap 深度解析:底层原理、源码剖析与面试必备知识
    1.HashMap概述HashMap是Java集合框架中最常用的数据结构之一,基于哈希表(HashTable)实现。它以键值对(Key-Value)存储数据,允许null键和null值,且无序。1.1HashMap的特性基于哈希表(HashTable)实现允许null键和null值非线程安全默认初始容量16,负载因子0.75JDK1......
  • C++编程基础:类型转换四式速记const_cast,dynamic_cast,reinterpret_cast,static_cast
    C++编程就应该使用C++风格的转换,不要再使用不安全的C风格的转换方法了。这里先给一个C++编程风格的类型转换四式速记打油诗,帮大家记忆其用法:C++强制转换妙,四类各有其诀窍。const_cast用途巧,常量限制可取消,const属性轻松搞,函数参数常需要。dynamic_cast专长显,继承体系......
  • 豆包AI数学对话的底层逻辑
    引言;在一次偶然的机会我使用豆包AI在求解一道数学题目的过程中,发现了最基本的数学公式,即便是我认为AI数学对话中的底层逻辑,本次我的研究,也是基于这一底层逻辑进行分析,刨析AI对话中如何实现从图片到解题这一过程,了解AI数学对话的底层思想对于豆包AI,其求解数学题目分为如下几......
  • .NET Core GC对象 分配(GC Alloc)底层原理浅谈
    对象分配策略.NET程序的对象是由CLR控制并分配在托管堆中,如果是你,会如何设计一个内存分配策略呢?按需分配,要多少分配多少,移动alloc_ptr指针即可,没有任何浪费。缺点是每次都要向OS申请内存,效率低预留缓冲区,降低了向OS申请内存的频次。但在多线程情况下,alloc_ptr锁竞争会非常......
  • 三层设计架构,数据层对表现层的不可见性意味着数据类型定义不可见吗?
    在三层设计架构中,数据层(通常也称为数据访问层或DAL)对表现层(UI层)的“不可见性”主要指的是数据层的具体实现细节,包括数据访问逻辑、数据库连接字符串、SQL查询语句等,以及数据层的变量和函数(除非通过业务逻辑层进行间接访问)对表现层是不可见的。这种“不可见性”是封装和抽象......
  • cas5开启Restful接口验证.240108
    ​POM文件中加入rest依赖:<!--Restfulsupport--><dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-support-rest</artifactId><version>${cas.version......
  • cas5配置LDAP的域控验证.240108
    ​pom.xml在这个下面添加LDAP依赖:<!--...Additionaldependenciesmaybeplacedhere...--><dependency><groupId>org.apereo.cas</groupId><artifactId>cas-server-support-ldap</artifactId><vers......