缓存一致性案例分析

图解|高性能服务器设计之缓存系统一致性 我个人认为,如果你想靠着背面试题来获得心仪的offer,用癞蛤蟆想吃天鹅肉形容完全不过分。想必大家能感受到面试越来越难,想找到心仪的工作也是越来越难,高薪工作羡慕不来,却又对自己目前的薪资不太满意,工作几年甚至连一个应届生的薪资都比不上,终究是错付了,错付了自己没有去提升技术。这些面试题分享给大家的目的,其实是希望大家通过大厂面试题分析自己的技术栈,给自己梳理一个更加明确的学习方向,当你准备好去面试大厂,你心里有底,大概知道面试官会问多广,多深,避免面试的时候一问三不知。 阅读详情

        关于缓存一致性的概念网上相关资料很多,这里不再赘述。本编文章主要通过C语言案例来更深一步理解缓存一致性原理。

理论

        对于多线程进程来说 ,在有多个CPU或单个CPU多核的机器上执行时,肯定会保证数据多线程执行时的数据同步。如下图为单CPU双核结构。

         首先我们得清楚几个概念:

        ALU:算术逻辑单元(Arithmetic&logical Unit)专门做计算的。

        Register:CPU寄存器,用于存储被计算的数据。

        我们常说的CPU速度比内存速度快100倍,指的是CPU中ALU访问Register所花费的时间比访问内存所花费的时间快100倍。由于访问内存比较慢,因此有了三级缓存L1、L2、L3,具体位置如图所示,每个缓存里面都是由缓存行组成的,缓存系统中以缓存行(cache line)为单位存储的。缓存行大小是64字节。由于缓存行的特性,当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能。

案例:

        下来我们通过一个案例来说明一下,代码如下:

/***************************************************
    author : lijd
    date   : 2022-08-18
***************************************************/
#include <stdio.h>
#include <stdio.h>

#include <pthread.h>

#define I_COUNT	(1000000000)

typedef struct myStr{
	int x;
	// int a[16]; 
	int y;
}S_myStr;

S_myStr s_t;


//定义线程要执行的函数
void *Thread1()
{
	int i = 0;
	for(i = 0; i < I_COUNT; i++)
	{
		s_t.x += 1;
	}
    
    return NULL;
}
//定义线程要执行的函数
void* Thread2()
{
    int i = 0;
	for(i = 0; i < I_COUNT; i++)
	{
		s_t.y += 1;
	}
    
    return NULL;
}


int main()
{
    int res;
    pthread_t mythread1, mythread2;
    /*创建线程
    &mythread:要创建的线程
    NULL:不修改新建线程的任何属性
    ThreadFun:新建线程要执行的任务
    NULL:不传递给 ThreadFun() 函数任何参数

    返回值 res 为 0 表示线程创建成功,反之则创建失败。
    */
    res = pthread_create(&mythread1, NULL, Thread1, NULL);
    if (res != 0) {
        printf("线程创建失败");
        return 0;
    }

    res = pthread_create(&mythread2, NULL, Thread2, NULL);
    if (res != 0) {
        printf("线程创建失败");
        return 0;
    }
   
    res = pthread_join(mythread1, NULL);
   
    res = pthread_join(mythread2, NULL);
	
    return 0;
}

进程执行如下:

 结果分析:

        两个线程分别操作全局变量中的结构体变量数据,由于缓存行的大小为64字节,所以第一种情况两个线程都会把结构体变量中的x, y缓存到自己的缓存行中,这样每次做计算时都需要线程同步,因此运行时长比较长。第二种情况x, y变量中间有int a[16]变量,超过64字节,因此两个线程的缓存行只存了自己所需的x或y,不涉及线程同步,因此用时较短。

ARM(4)缓存一致性 缓存一致性问题 一致性实现方案 CHI协议 MESI协议 阅读详情

相关推荐

第10章 高级缓存一致性设计

缓存一致性协议如何适应更大规模的系统。广播和侦听协议更早地涉及了可扩展性问题,因为流量和侦听频率时随着处理器个数的增加至少呈线性增加趋势,可用的互连网络带宽会很快被广播流量占满。本章讨论的基于目录式缓存一致性协议来实现可扩展性。主要问题在于如何处理协议竞争,以及瞬时状态的使用等。以及,讨论当前多核设计问题,例如如何处理不精确的目录信息、讨论一致性需要被以单个粒度来跟踪还是以多个粒度来跟踪、如何设计一致性可允许多核系统系统执行分区,以及线程迁移代价如何降低。

weixin_47955824的博客 2896

共享内存架构中的缓存一致性

摘自曼彻斯特大学伊恩·沃森的讲座 概述 我们已经讨论过在单核上的性能优化 局部性 向量 现在让我们优化一个共享内存程序 两种架构: 基于总线的共享内存机器(小规模) 基于目录的共享内存机器(大规模) 基于总线共享内存的体制 基本情况很简单: ![mesi-0.png](https://img-blog.csdnimg.cn/img_convert/dd0862f6138df347c18eb27621defb32.png#align=left&display=inline&he

阿呆的专栏 1407

【为什么要禁用mybatis二级缓存?】

MyBatis 的二级缓存虽然可以提高性能,但也可能导致数据不一致性,特别是在高并发或多线程的生产环境中。建议在不需要极高读取效率的场景下关闭二级缓存,确保数据的一致性和准确性。在使用二级缓存时,应仔细设计缓存失效策略,以避免出现 stale 数据问题,这可能会增加系统的复杂性和维护成本。

weixin_44424997的博客 381

《多线程高并发二》缓存一致性协议

将被修改的数据副本失效的这种方式,有个专业的术语,叫做“写无效”(Write-invalidate),基于“写无效”实现的缓存一致性协议,叫做“写无效”协议,常见的 MSI、MESI、MOSI、MOESI 和 MESIF 协议都属于这一类。,并不适合作为小型的系统的缓存一致性解决方案,小型系统更多的是用基于总线嗅探的缓存一致性协议(这个策略,本质上就是把所有的读写请求都通过总线(Bus)广播给所有的 CPU 核心,然后让各个核心去“嗅探”这些请求,再根据本地的情况进行响应)缓存的状态是S,也就是共享的。

qq_45905724的博客 715

解决西门子Step 7 basic 找不到许可证问题

你在使用博图软件是否遇到过Step 7 basic 找不到许可证的问题呢!不言怕,今天我就来告诉你该如何处理吧!看步骤: 1.删除原授权的License: 打开Automation License Manager应用,然后我们可以发现仅有的License Key前面有一个时钟,说明它已经过期不可用,我们就要去寻求新的Key. 打开“我的电脑”,选择C盘,点击上方查看 点击选项–>查看 然...

让技术没有门槛 14万+

2024东南大学533复试C++程序设计笔试真题精讲

【东南553复试C++】2024东南大学533复试C++程序设计笔试真题精讲

转遍世界 3414

缓存一致性问题解决方案

四种方案: 先写缓存,再写数据库(差) 先写数据库,再写缓存(一般) 先删缓存,再写数据库(能接受) 先写数据库,再删缓存(比较优秀)

bocai_xiaodaidai的博客 1万+

基于深度学习的树木种类识别

本文介绍了基于深度学习的树木种类识别技术。我们将通过深度学习模型和图像处理技术实现对树木的自动识别与分类。首先,我们将介绍深度学习的基本原理和相关算法。接着,我们将详细说明树木种类识别的数据准备、模型构建和训练过程。最后,我们将给出代码示例,帮助读者深入了解和实践该技术。

一键难忘的博客 2315

多核cpu的缓存一致性

为什么要有缓存? 再说到cpu的缓存一致性前提下,需要了解到为什么会有缓存: 众所周知,cpu是用来计算和处理数据的,本身并不存储数据,数据都是放在内存或者硬盘中,而内存与cpu之间是存在距离的,如果说cpu目前要进行一次计算,那么就需要先从内存将数据取出再进行计算,而内存和cpu是存在速度差异的,在随着现代技术的发展,嵌入到cpu上的晶体管越来越多,那么就造成了cpu的计算和处理能力越来越强,这样就更加凸显了这个弊端,cpu在一次处理中更多的时间是在等待内存中的数据到来,这样的情况是我们人类是不能容忍的(

qq_45794943的博客 1749

全功能tgbot/Telegram机器人多功能有后台版源码

trx兑换 闪兑 关键字监控 群管 usdt监控 余额查询 推广分享 等几乎常见的tg机器人功能都有。全功能tgbot/telegram机器人多功能有后台版源码-打包好的可以直接上手。

百创科技 2699

嵌入式软件工程师面试题目整理(一)

文章目录嵌入式软件工程师面试题目整理(一)Arm有多少32位寄存器?Arm2440和6410有什么区别CPU,MPU,MCU,SOC,SOPC联系与差别上拉&下拉&高阻态串口协议讲一讲RS232和RS485通讯接口有什么区别IIC时序图画一下,IIC有哪些状态,给一个字节,将它发送出去。IIC有什么注意事项?有没有用I/O模拟IIC,如果有需要注意什么?为什么2440的内存起始地址是3后面7个0呢?为什么6410的内存起始地址是5后面7个0呢?内存管理有什么看法?(MMU)锁有哪些?有什么注

嵌入式与Linux那些事的博客 7883

多线程环境下的Java缓存一致性问题与解决方案

Java多线程缓存一致性解决方案 摘要 本文系统介绍了Java多线程环境中的缓存一致性问题及解决方案。缓存一致性指多线程共享数据时确保各线程看到的数据值一致。Java内存模型(JMM)定义了原子性、可见性和有序性三个核心问题。缓存不一致会导致写丢失、脏读等问题。文章分析了三种典型场景:可见性问题(变量修改不可见)、原子性问题(非原子操作导致计数错误)和有序性问题(指令重排序)。解决方案包括:1) volatile关键字,提供可见性和禁止重排序;2) synchronized关键字,保证原子性、可见性和有序性

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1031

传统方式部署 Hadoop 高可用集群

传统方式部署 Hadoop 高可用集群

寂夜了无痕的博客 265

CPU中的MESI缓存最终一致性---CPU为什么需要缓存

前言锁章节我们已经发布了【java对象在内存中如何分布】、【java有哪些锁】、【synchronized和volatile】。在上文中分析volatile指令重排序的时候看到一片文章介绍CPU缓存一致性的问题。因为volatile的禁止指令重排序是因为实现了内存屏障。另外一个特性是内存可见性他的实现是通过CPU 的MESI 来实现的。当A线程将数据修改后刷回主内存中,CPU并同时告知其它线程内的...

yyyy11119的博客 429

Codex 自定义模型操作指南:CLI 与桌面客户端双端实操

检查版本 codex --version # 预期输出类似:codex-cli 0.133.0-alpha.1 # 如未安装 npm install -g @openai/codex假设你要接入DeepSeek,在# 临时设置(当前终端会话有效)export DEEPSEEK_API_KEY="sk-你的 DeepSeek API Key"# 永久设置(推荐,写入 shell 配置)

篮球界最会写bug的人;程序猿中打球最菜的人。 454

CVAEGAN实现锂离子电池EIS数据增强:基于健康状态的阻抗谱生成

本文提出了一种基于CVAEGAN的锂离子电池EIS数据增强方法。该方法结合了变分自编码器和生成对抗网络的优点,能够根据指定的健康状态(SoH)生成高质量的EIS阻抗谱数据。文章详细介绍了数据预处理流程、模型架构设计(包括编码器、解码器和判别器),并提供了完整的PyTorch实现代码。通过条件生成的方式,该方法可以有效解决电池健康评估中标注数据不足的问题,为基于数据驱动的电池诊断提供更丰富的训练样本。实验结果表明,生成的EIS数据具有良好的真实性和多样性,可用于增强电池健康状态评估模型的性能。

huanghm88的专栏 497

缓存一致性验证秘笈

实践案例:某半导体厂商采用 Cadence JasperGold,对多核处理器的缓存协议进行正式建模与验证,通过状态属性检查发现并修正早期的缓存不一致问题,大幅提升协议正确性与验证信心。实际案例:某汽车 SoC 厂商通过 Synopsys VCS 仿真各种缓存访问模式,脚本触发罕见的一致性边界条件,从而发现形式验证未覆盖的问题场景。优势说明:简化验证流程,快速覆盖主要交互逻辑,再配合 RTL 验证补足细节。通过硬件仿真,让真实软件在验证平台上运行,模拟最贴近实际应用的缓存行为。

2502_92744222的博客 287

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

资金账户的缓存一致性保障:如何在高并发下实现零误差?

今天,我们来深入剖析资金账户的缓存一致性保障方案,并结合实际案例给出代码示例,帮助大家在设计系统时轻松应对高并发和强一致性的挑战。通过事务一致性和异步刷新,平台成功处理了每秒 10 万级的转账请求,同时避免了热点问题对系统的影响。通过分布式锁,系统能够在高并发场景下确保账户余额的更新操作是串行化的,避免了超卖或重复扣款问题。你在实际项目中是否参与过资金账户的设计?将高频访问的账户余额存储在 Redis 中,低频访问的账户流水存储在分布式存储中。每次更新账户余额时,先更新数据库,再同步更新缓存,确保一致性。

nihao2q的博客 1810

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

软考(系统架构师)-案例分析之Redis与缓存

Redis作为主流缓存系统,考题主要聚焦缓存一致性、数据同步等案例场景。文章对比了NoSQL与关系型数据库特性,详细解析Redis核心功能:数据类型(Zset适合排行榜)、淘汰策略、RDB/AOF持久化机制及主从同步流程。针对缓存与数据库同步问题,介绍了Cache-Aside模式、消息队列和Binlog解析三种方案。最后分析了缓存三大问题:雪崩(随机过期时间+多级缓存)、穿透(布隆过滤器+空值缓存)、击穿(热点key永不过期+互斥锁)的解决方案。全文系统梳理了Redis应用中的关键知识点和技术方案。

zlp1992的专栏 678

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

温度0.2×TopK 80×4激活专家:LFM2.5-8B-A1B Turbo-Brilliance推理参数调优完整清单

LFM2.5-8B-A1B Turbo-Brilliance(NEO-MAX GGUF)推理参数调优清单来了:官方推荐 `temperature 0.2`、`top_k 80`、`repetition_penalty 1.05`,配合稀疏 MoE 架构默认的 **4 个激活专家**,在本地即可跑通 12 种推理模式。本文是一份面向新手的完整清单,覆盖参数逐项解读、激活专家数设置、量化档位搭配与常见

gitblog_00298的博客 826

4.什么是MESI缓存一致性协议?怎么解决并发的可见性问题?

mesi缓存一致性协议是什么?mesi缓存一致性协议怎么解决可见性问题?

chenzengnian123的博客 2071

Redis缓存策略之缓存和数据库的一致性

小概率的情况下,比如在线程一,查缓存时刚好没有数据,于是到数据库查到了数据,在此之后,又有一个线程二在更新数据,它先更新数据库就删除缓存,此时缓存数据依然没有,线程二删完缓存后,线程一写入缓存,线程一写入的是以前的数据,而线程二更新了数据,导致了不一致性,但是这种情况概率很低,线程一在查询数据库到写入缓存所用时间是非常小的,很难在穿插于另一个进程的更新操作。当数据更新时,保证数据库和缓存的一致性,会遇到是先删除缓存,再操作数据库还是先操作数据库,再删除缓存的问题。对于动态数据,可以考虑LRU或LFU策略。

m0_63469711的博客 1109

怎么解决缓存一致性问题?总线锁,缓存锁,MESI

为什么产生有线程安全问题? CPU的高速缓存 线程是CPU最小的调度单元,当CPU去调度线程执行一些操作的时候,计算机的处理器需要与内存做交互的,比如读取一些数据和存储一些数据,由于这里的IO操作相对于CPU的运算熟读是非常慢的,所以在CPU和内存中间就引入了高速缓存,每一个核都会去维护其自己的高速缓存,而每个核的高速缓存是互相不可见的。这就产生了缓存一致性问题。 以我们熟悉的i++举个例子,i...

并发编程------线程状态(thread.interrupt) 3412

【并发编程】CPU多级缓存与缓存一致性

CPU多级缓存与缓存一致性 定义 cpu缓存是位于CPU与内存之间的临时存储器,它的容量比内存小的多,但是交换速度却比内存要快得多 为什么需要CPU cache? cpu的频率太快了,快到主存跟不上,这样在处理器时钟周期内,cpu常常需要等待主存,浪费资源。cache的出现,是为了缓解cpu和主存之间速度的不匹配问题(结构:cpu-&amp;gt;cache&amp;gt;memory) C...

好学若饥,谦卑若愚 3543

缓存一致性的解释

今天我这边是想讲一下编程技术中的锁的竞争和性能的问题,但是在这之前,我必须先讲一下cpu cache 内存三个组件在运行程序时候的关联,有了这个基础我后面才能讲锁。 那今天讲的是缓存一致性,首先要理解我说的缓存是什么意思,大家可以看下下面的图,这个很常见的图就是说现在我们买电脑的时候经常听说的参数cpu L1 L2 L3三级缓存,然后一般是CPU的每个核都有自己的L1级缓存,然后共享L2 L3缓存...

萧燃love驹 6916

缓存一致性

缓存一致性(Cache Consistency)当数据库中的数据发生变化时,如何保证缓存中的数据与数据库保持同步,避免读到“脏数据”或“过期数据”。缓存提升性能,但引入了数据不一致的风险。在高并发场景下,一个看似简单的“更新用户信息”操作,可能因缓存处理不当,导致用户看到旧头像长达数分钟!一致性级别方案适用场景强一致分布式锁 + 同步更新极少(性能差)最终一致90%+ 场景弱一致仅设置 TTL非核心数据🌟记住没有完美的强一致性缓存方案。在性能与一致性之间做权衡,才是工程的艺术。

Aerkui的博客 1661
上一篇: zstd压缩与lz4压缩比较
下一篇: 指令重排案例分析
码农诗人
博客等级 码龄11年 986粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值