---- 整体架构 多级缓存SDK整体架构如何所示: CacheFacade 作为缓存门面对象,向用户屏蔽了内部多个模块协同工作的复杂性,同时负责编排多级缓存 get 和 set 的模版流程,并在相关位置进行回调埋点...CacheCluster 负责实现多个实例之间的非共享L1级缓存的一致性,当有请求试图在某个实例上执行set或者del操作时,都需要广播告知其他实例,用于清除自身的L1级缓存。...因为 CacheFacade 拿到的其实是已经组装完毕的多级缓存对象,如下图所示: 所以这里 get 和 set 请求要分为两段来看,一段是存在于缓存门面对象中设定好的模版流程,另一段是存在于...---- 不同层级缓存之间的一致性问题 假设此时我的多级缓存层级是两层: Caffeine+Redis ,那么如何确保这两者之间的数据一致性呢 ?...这里其实和CPU多级缓存的一致性问题解决思路类似,因为CPU多级缓存中通常L1和L2级缓存都是单个核私有的,L3是共享的,所以同样存在如何实现一致性的问题。
CPU读取主存相应中的内容之前)写回主存,然后状态变成E(独享) E:Exclusive 独享 缓存行只被缓存在该CPU的缓存中,是未被修改过的,与主存的数据是一致的,可以在任何时刻当有其他CPU读取该内存时...,变成S(共享)状态,当CPU修改该缓存行的内容时,变成M(被修改)的状态 S:Share 共享,意味着该缓存行可能会被多个CPU进行缓存,并且该缓存中的数据与主存数据是一致的,当有一个CPU修改该缓存行时...Memory Model,JMM) JAVA内存模型规范: 1.规定了一个线程如何和何时可以看到其他线程修改过后的共享变量的值 2.如何以及何时同步的访问共享变量 JAVA内存模型: ?...内存模型与硬件架构之间的关联 所有线程栈和堆会被保存在缓存里面,部分可能会出现在CPU缓存中和CPU内部的寄存器里面 线程和主内存的抽象关系 ?...线程和主内存的抽象关系 每个线程之间共享变量都存放在主内存里面,每个线程都有一个私有的本地内存 本地内存是java内存模型中抽象的概念,并不是真实存在的(他涵盖了缓存写缓冲区。
CPU多级缓存-缓存一致性 下图简单的展示了最简单的高速缓存的配置,数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道;主存与高速缓存都连在系统总线上(BUS)这条总线同时还用于其他组件的通信...,那么与它相邻的数据很快也可能被访问 多级缓存-缓存一致性(MESI),MESI是一个协议,这协议用于保证多个CPU cache之间缓存共享数据的一致性。...,可以在任何时刻当有其他CPU读取该内存时,变成S(共享)状态,同样的当CPU修改该缓存行的内容时,会变成M(被修改)的状态 S:Share 共享,当前CPU和其他CPU中都有共同数据,并且和主存中的数据一致...Java内存模型是一种规范,它定义了Java虚拟机与计算机内存是如何协同工作的。它规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步地访问共享变量。 ?...线程和主内存的抽象关系 Java内存模型抽象结构图: ? 每个线程之间的共享变量存储在主内存里面,每个线程都有一个私有的本地内存,本地内存是Java内存模型的一个抽象的概念,并不是真实存在的。
文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与硬件架构之间的关系...---- CPU 多级缓存-缓存一致性协议MESI MESI协议的作用:用于保证多个CPU Cache之间缓存共享数据的一致 MESI 是指4中状态的首字母。...S(共享)状态之前被延迟执行 E 独享、互斥 (Exclusive) 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中 缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作...,该缓存行需要变成S(共享)状态 S 共享 (Shared) 该Cache line有效,数据和内存中的数据一致,数据存在于很多Cache中 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求...内存模型,它规范了Java虚拟机与计算机是如何协同工作的。
一、CPU物理缓存结构 1 高速缓存 为了缓解CPU和内存访问速度的矛盾,增加了速度更快的多级高速缓存。...图片 因为缓存脏数据写回主内存一般采用的是写回法,而非直写法,所以缓存和主存之间会有数据一致性问题。...二、JMM 1 目的 JMM是一套规范,该规范定义了一个线程对共享变量写入时,如何确保对另一个线程可见,提供了合理的禁用缓存以及禁止重排序的方法核心价值是解决可见性和有序性。...2 JMM与硬件内存架构的关系 对于硬件内存来说只有寄存器、高速缓存、主存等概念,没有工作内存(线程私有数据区域,虚拟机栈)、主存(堆内存)之分。...2 原子性无法保证,CPU缓存一致性MESI的缓存锁可以保证单条volatile写指令是原子的,但是多线程修改共享变量时不止一条指令,比如i++就有三条指令,无法保证原子性。
为什么需要缓存 CPU 是个运算器,主要负责运算; 内存是个存储介质,负责存储数据和指令; 在没有缓存的年代,CPU 和内存是这样配合工作的: 一句话总结就是:CPU 高速运转,但取数据的速度非常慢,...当 CPU 修改私有缓存里面的数据时,会给总线发送一个事件消息,告诉总线上的其他监听者这个数据被修改了。...其他 CPU 感知到自己私有的缓存中存在某个被修改的数据副本时,可以将缓存的副本更新,也可以让缓存的副本失效。 将缓存的副本更新会产生巨大的总线流量,影响系统的正常运行。...当别的缓存读取它时,状态变为共享;当前写数据时,变为已修改状态(M)。 S:shared,共享的。缓存行也存在于其它缓存中且是干净的。缓存行可以在任意时刻抛弃。 I:invalid,无效的。...因为内存的速度和 CPU 匹配不上,所以在内存和 CPU 之间加了多级缓存。 单核 CPU 独享不会出现数据不一致的问题,但是多核情况下会有缓存一致性问题。
当多个CPU的运算任务都涉及同一块主内存区域时,CPU 会将数据读取到缓存中进行运算,这可能会导致各自的缓存数据不一致。...在传统的硬件内存架构中是没有栈和堆这种概念。 ? 从图中可以看出栈和堆既存在于高速缓存中又存在于主内存中,所以两者并没有很直接的关系。...注意:工作内存也就是本地内存的意思。 有态度的总结 由于CPU 和主内存间存在数量级的速率差,想到了引入了多级高速缓存的传统硬件内存架构来解决,多级高速缓存作为 CPU 和主内间的缓冲提升了整体性能。...解决了速率差的问题,却又带来了缓存一致性问题。 数据同时存在于高速缓存和主内存中,如果不加以规范势必造成灾难,因此在传统机器上又抽象出了内存模型。...Java 语言在遵循内存模型的基础上推出了 JMM 规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。
在有了多级缓存之后,程序的执行就变成了: 当CPU要读取一个数据时,首先从一级缓存中查找,如果没有找到再从二级缓存中查找,如果还是没有就从三级缓存或内存中查找。...为了解决这个问题 ------------------------> 引入了 内存模型 ---- 内存模型如何确保缓存一致性 内存模型到底是怎么保证缓存一致性的呢 ,通常有如下了两种方案 1、通过在总线加...MESI的核心的思想:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的...他解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。 内存模型解决并发问题主要采用两种方式:限制处理器优化和使用内存屏障。...故: JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。
Java内存模型是一种虚拟机规范,JMM规范了Java虚拟机与计算机内存是如何协同工作的:规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。...通过这种方式来保证多线程下变量的缓存一致性问题,下图是一个CPU多级缓存图: 二、什么是JMM内存模型?...注意由于工作内存是每个线程的私有数据,线程间无法相互访问工作内存,因此存储在工作内存的数据不存在线程安全问题。...JMM主要解决的问题: 解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题 缓存一致性问题其实就是可见性问题。...一些线程栈和堆有时候可能在CPU寄存器或缓存器中,像下面这张图这样 当对象和变量可以保存在计算机内存不同区域中,会发生一些严重问题,两个主要方面是: 线程更新(写)共享变量时的可见性 检查和读写共享变量时的竞态条件
答案: 缓存击穿:当某个热点数据过期或不存在于缓存中时,大量请求会直接打到数据库上,导致数据库压力剧增。...我会考虑以下几点: 缓存层级:根据数据的访问频率和重要性,设计多级缓存,如本地缓存、远程缓存(如Redis)和CDN缓存。 一致性与可用性权衡:根据业务需求,在强一致性和最终一致性之间做出选择。...异步更新策略:使用消息队列或后台任务来异步更新缓存数据,以减少对数据库的即时压力。 9. 问题:在微服务架构中,如何设计有效的缓存策略以支持服务间的数据共享和一致性?...答案: 在微服务架构中设计有效的缓存策略需要考虑以下几点: 共享缓存与私有缓存:根据业务需求,决定哪些数据需要在服务间共享,哪些数据可以私有。...共享缓存可以使用分布式缓存解决方案(如Redis),而私有缓存可以使用本地缓存(如Caffeine)。 数据一致性协议:对于共享数据,需要定义明确的数据一致性协议。
L2缓存和L3缓存不分指令和数据。L1和L2缓存在第一个CPU核中,L3则是所有CPU核心共享的内存。L1、L2、L3的越离CPU近就越小,速度也越快,越离CPU远,速度也越慢。...多核处理器的Cache一致性 在多核系统设计时必须考虑多级Cache的一致性(Cache Coherency)问题。对内存的基本操作包括读操作和写操作。...Cache一致性问题产生的原因是: 在一个处理器系统中,不同的Cache和主存空间中可能存放着同一个数据的多个副本,在写操作时,这些副本存在着潜在的不一致的可能性。...在单处理器系统中,Cache一致性问题主要表现为在内存写操作过程中如何保持各级Cache中的数据副本和主存内容的一致,即使有I/O通道共享Cache,也可以通过全写法较好地解决Cache一致性问题。...缓存一致性问题是由于多个处理器共享同一个存储空间而引起的,而CC-NUMA是指通过专门的硬件保持Cache中的数据和共享内存中的数据的一致性,不需要软件来保持多个数据副本之间的一致性。
当讨论多处理器架构的时候,基本的时间单位是指令周期(cycle):即处理器提取和执行一条指令需要的时间。 线程是一个顺序程序,是一个软件抽象。...一般需要引入若干个高速缓存(Cache):与处理器紧挨着的小型存储器,位于处理器和内存之间。 当需要读取一个地址的值时,访问高速缓存看是否存在:存在代表命中(hit),直接读取。...多级高速缓存 现代处理器中一般不止一级缓存,而是多级缓存,从离处理器最近到最远分别是 L1 Cache,L2 Cache 和 L3 Cache: L1 Cache 通常和处理器位于同一个芯片,离处理器最近...一致性(coherence) 当一个处理器访问另一个处理器已经装载入高速缓存的主存地址的时候,就会发生共享(sharing,或者称为争用 contention)。...需要考虑缓存一致性的问题,因为如果一个处理器要更新共享的缓存行,则另一个处理器的副本需要作废以免读取到过期的值。
那什么是可见性呢? 可见性 我们可以理解为:当一个线修改一个共享变量时,另外一个线程能读到这个修改的值。...hit 当处理器操作数写回到一个内存缓存的区域时,它首先会检查这个缓存的内存地址是否在缓存行中,如果存在一个有效的缓存行,则处理器将这个操作数写回到缓存,而不是写回到内存,这个操作被称为写命中; 写缺失...所以,在多处理器下,为了保证各个处理器的缓存是一致的,就要实现缓存一致性协议 ,每个处理器通过嗅探在总线(BUS)上传播的数据来检查自己缓存的值是不是过期了 当处理器发现自己缓存行对应的内存地址被修改,...注: 本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存、写缓冲区、寄存器以及其他的硬件和编译器化 ---- Java内存模型的抽象结构示意图 如下: ?...当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。
缓存一致性——MESI协议 CPU多级缓存官方概念 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU,所以才引入了缓存的概念。...二级缓存:主要作用是协调一级缓存和内存之间的工作效率。cpu首先用的是一级内存,当cpu的速度慢慢提升之后,一级缓存就不够cpu的使用量了,这就需要用到二级内存。...E(Exclusive独占):这行数据有效,数据和内存中的数据一致,数据只存在于本Cache中。 S(Shared共享):这行数据有效,数据和内存中的数据一致,数据存在于很多Cache中。...某位大佬曾经说两者的区别,并发是同一时间应对多件事情的能力,并行是同一时间去做多件事情的能力。作为一个工科生,不知道如何夸大佬,只知道喊666。 ?...Java内存模型——JMM 内存模型 跟多级缓存差不多意思,每个线程里面都有工作内存,其存储的是主内存中数据的副本,如下图。
CPU就是通过这种多级缓存的方式解决了速度差异性问题,但是在多核CPU中尚未解决多核CPU对共享数据的处理而存在的数据不一致性问题,为了解决这个问题,伊利诺斯州立大学提出了著名的MESI(Modified...该状态可以在任何时刻当有其它CPU读取该内存时变成共享(Shared)状态。同样地,当CPU修改该缓存行中内容时,该状态可以变成Modified状态。...通常通过Java代码new语句创建出来的对象都是存储在堆内存中的,当线程栈通过对象的句柄来访问对象的成员变量的时候,都会对对象的成员变量进行私有拷贝,然后对私有拷贝数据进行读写。...2 Java内存模型抽象图 这里对Java内存模型的抽象图进行说明: 线程间的共享变量存储在主内存中,每个线程还拥有一个本地内存(工作内存),这个本地内存是一个抽象概念,并不是真实存在的内存,它是对...JMM存在的目的就是为了解决由于多线程通过共享内存操作共享数据时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的一系列并发问题,而它最终目的是保证并发场景中各种操作的原子性
在说volatile之前,我们先说下synchronized是如何保证可见性的: 「JMM」(java内存模型)关于synchronized有两条规定: 线程解锁前,必须把共享变量的最新值刷新到主内存中...线程加锁时,将清空工作内存中共享变量的值,当使用共享变量时需要从主内存中重新获取最新的值 回到volatile,为了提高处理器的执行速度,我们在处理器和内存之间增加了多级缓存来提升速度。...但是由于引入了多级缓存,就存在缓存数据不一致问题。...「缓存一致性协议」:每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行修改操作的时候...「指令重排序」:指令重排序指的是JIT编译器、cpu处理器和jmm定义的多级缓存存储,在编译字节码和运行机器指令时,在不影响程序最终执行结果的情况下,会对原语句执行的顺序进行优化。
CPU为何要有高速缓存 CPU在摩尔定律的指导下以每18个月翻一番的速度在发展,然而内存和硬盘的发展速度远远不及CPU。这就造成了高性能能的内存和硬盘价格及其昂贵。然而CPU的高度运算需要高速的数据。...多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。这里就引出了一个一致性的协议MESI。...当被写回主存之后,该缓存行的状态会变成独享(exclusive)状态。 E: 独享的(Exclusive) 该缓存行只被缓存在该CPU的缓存中,它是未被修改过的(clean),与主存中数据一致。...该状态可以在任何时刻当有其它CPU读取该内存时变成共享状态(shared)。 同样地,当CPU修改该缓存行中内容时,该状态可以变成Modified状态。...一个处于E状态的缓存行也必须监听其它缓存读主存中该缓存行的操作,一旦有这种操作,该缓存行需要变成S状态。 对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的。
高速缓存的速度是非常接近CPU的,但是它的引入又带来了新的问题,现代的CPU往往是有多个核心的,每个核心都有自己的缓存,而多个核心之间是不存在时间片的竞争的,它们可以并行地执行,那么,怎么保证这些缓存与主内存中的数据的一致性就成为了一个难题...所以,在有了多级缓存后,程序的运行就变成了: 当CPU要读取一个数据的时候,先从一级缓存中查找,如果没找到再从二级缓存中查找,如果没找到再从三级缓存中查找,如果没找到再从主内存中查找,然后再把找到的数据依次加载到多级缓存中...而加载到缓存中的数据也不是说用到哪个就加载哪个,而是加载内存中连续的数据,一般来说是加载连续的64个字节,因此,如果访问一个 long 类型的数组时,当数组中的一个值被加载到缓存中时,另外 7 个元素也会被加载到缓存中...这里所说的变量包括实例字段、静态字段,但不包括局部变量和方法参数,因为它们是线程私有的,它们不会被共享,自然不存在竞争问题。...从更低层次来说,主内存主要对应于硬件内存部分,工作内存主要对应于CPU的高速缓存和寄存器部分,但也不是绝对的,主内存也可能存在于高速缓存和寄存器中,工作内存也可能存在于硬件内存中。 ?
JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域, 所有线程都可以访问...为什么要有内存模型 现代的计算机有多级缓存 在CPU访问存储设备时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。...比如顺序执行的代码、连续创建的两个对象、数组等 多核CPU多级缓存一致性协议MESI 多核CPU的情况下有多个一级缓存,如何保证缓存内部数据的一致,不让系统数据混乱。...这里就引出了一个一致性的协议MESI。 注意: 对于M和E状态而言总是精确的,他们在和该缓存行的真正状态是一致的,而S状态可能是非一致的。...JMM主要解决的问题: 解决由于多线程通过共享内存进行通信时,存在的本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题 缓存一致性问题其实就是可见性问题。
当接受到一个段内存申请请求时,我们可以采用: 首次适配,最佳适配,最差适配,首次循环适配等算法来进行内存的分配。...,即当前进程的工作集,每次要置换页面时,只会在当前进程的工作集中选择并进行淘汰。...并且也只需要将页目录缓存在内存中,其中的页目录项指向的页表,也可以得到第一次使用到时,才申请内存进行创建。...tlb作为CPU内部的相联存储寄存器,用来缓存最近访问过的虚拟页号和物理页号的映射关系,利用的是程序执行的局部性原理,可以有很高的命中率。 什么是虚拟内存,为什么需要虚拟内存,虚拟内存有什么好处?...什么是虚拟内存: 虚拟内存为每个进程提供了一个一致性,连续的,私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉。
领取专属 10元无门槛券
手把手带您无忧上云