高速缓存_高速缓存cache - CSDN
精华内容
参与话题
  • 高速缓存概述

    2020-06-18 20:53:55
    目录 1.存储器的层次结构 2.cache概述 3.Cache的映射方式 1.存储器的层次结构 ...数据总是在相邻两层之间进行复制传送,为什么这种结构有效?...刚访问过的单元不久可能还会被访问,刚刚访问过单元的附近单元可能会...

    目录

     

    1.存储器的层次结构 

    2.cache概述

    3.Cache的映射方式


    1.存储器的层次结构 

    数据总是在相邻两层之间进行复制传送,为什么这种结构有效?

    程序的空间局部性和时间局部性。刚访问过的单元不久可能还会被访问,刚刚访问过单元的附近单元可能会被访问。

    2.cache概述

    程序具有访问局部性特征的原因

    • 指令:指令按序存放,地址连续,循环程序段或子程序段重复执行
    • 数据:连续存放,数组元素重复、按序访问

     

    • 如何分块?
    • 主存块和Cache之间如何映射?
    • Cache已满时,怎么办?
    • 写数据时怎样保证Cache和MM的一致性?
    • 如何根据主存地址访问到cache中的数据?
      ......

       

    3.Cache的映射方式

    • 直接(Direct) :每个主存块映射到Cache的固定行
    • 全相联(Full Associate) :每个主存块映射到Cache的任一行
    • 组相联(Set Associate) :每个主存块映射到Cache固定组中任一行

    ①直接映射:

    主存和Cache之间直接映射,块大小为16B。Cache的数据区容量为64KB,主存地址为32位,按字节编址。

     

    硬件实现的:一条指令执行的过程,取指令和取操作数。

    容量4Kx(1+16)+64Kx8=580Kbits=72.5KB,
    数据占64KB/72.5KB = 88.3%
     

    特点:

    • 容易实现,命中时间短
    • 无需考虑淘汰(替换)问题
    • 但不够灵活, Cache存储空间得不到充分利用,命中率低
       

    ②全相联

    特点:

    • 冲突缺失概率为0
    • 命中时间长
    • 比较器长,tag长,开销成本大

    ③组相联

     

    展开全文
  • 缓冲区和高速缓存

    千次阅读 2015-05-13 15:17:03
    1. 磁盘高速缓存(Disk Cache) 操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到CPU...

    1. 磁盘高速缓存(Disk Cache)

    操作系统中使用磁盘高速缓存技术来提高磁盘的I/O速度,对高速缓存复制的访问要比原始数据访问更为高效。例如,正在运行的进程的指令既存储在磁盘上,也存储在物理内存上,也被复制到CPU的二级和一级高速缓存中。

    不过,磁盘高速缓存技术不同于通常意义下的介于CPU与内存之间的小容量高速存储器,而是指利用内存中的存储空间来暂存从磁盘中读出的一系列盘块中的信息。因此,磁盘高速缓存在逻辑上属于磁盘,物理上则是驻留在内存中的盘块。

    高速缓存在内存中分为两种形式:一种是在内存中开辟一个单独的存储空间作为磁速缓存,大小固定;另一种是把未利用的内存空间作为一个缓沖池,供请求分页系统和磁盘I/O时共享。

    2. 缓冲区(Buffer)

    在设备管理子系统中,引入缓冲区的目的主要有:
    • 缓和CPU与I/O设备间速度不匹配的矛盾。
    • 减少对CPU的中断频率,放宽对CPU中断响应时间的限制。
    • 解决基本数据单元大小(即数据粒度)不匹配的问题。
    • 提高CPU和I/O设备之间的并行性。

    其实现方法有:
    • 釆用硬件缓冲器,但由于成本太高,除一些关键部位外,一般不釆用硬件缓冲器
    • 釆用缓冲区(位于内存区域)。

    根据系统设置缓冲器的个数,缓冲技术可以分为:

    1) 单缓冲

    在设备和处理机之间设置一个缓冲区。设备和处理机交换数据时,先把被交换数据写入缓冲区,然后需要数据的设备或处理机从缓冲区取走数据。

    如图5-5所示,在块设备输入时,假定从磁盘把一块数据输入到缓冲区的时间为T,操作系统将该缓冲区中的数据传送到用户区的时间为M,而CPU对这一块数据处理的时间为 C。由于T和C是可以并行的,当T>C时,系统对每一块数据的处理时间为M十T,反之则为M+C,故可把系统对每一块数据的处理时间表示为Max(C, T)+M。


    图5-5  单缓冲工作示意图

    2) 双缓冲

    根据单缓冲的特点,CPU在传送时间M内处于空闲状态,由此引入双缓冲。 I/O设备输入数据时先装填到缓冲区1,在缓冲区1填满后才开始装填缓冲区2,与此同时处理机可以从缓冲区1中取出数据放入用户进程处理,当缓冲区1中的数据处理完后,若缓冲区2已填满,则处理机又从缓冲区2中取出数据放入用户进程处理,而I/O设备又可以装填缓冲区1。双缓冲机制提高了处理机和输入设备的并行操作的程度。

    如图5-6所示,系统处理一块数据的时间可以粗略地认为是MAC(C, T)。如果C<T,可使块设备连续输入(图中所示情况);如果C>T,则可使CPU不必等待设备输入。对于字符设备,若釆用行输入方式,则釆用双缓冲可使用户在输入完第一行之后,在CPU执行第一行中的命令的同时,用户可继续向第二缓冲区输入下一行数据。而单缓冲情况下则必须等待一行数据被提取完毕才可输入下一行的数据。


    图5-6  双缓冲工作示意图

    如果两台机器之间通信仅配置了单缓冲,如图5-7(a)所示。那么,它们在任一时刻都只能实现单方向的数据传输。例如,只允许把数据从A机传送到B机,或者从B机传送到A 机,而绝不允许双方同时向对方发送数据。为了实现双向数据传输,必须在两台机器中都设置两个缓冲区,一个用做发送缓冲区,另一个用做接收缓冲区,如图5-7(b)所示。


    图5-7  双机通信时缓冲区的设置

    3) 循环缓冲

    包含多个大小相等的缓冲区,每个缓冲区中有一个链接指针指向下一个缓冲区,最后一个缓冲区指针指向第一个缓冲区,多个缓冲区构成一个环形。

    循环缓冲用于输入/输出时,还需要有两个指针in和out。对输入而言,首先要从设备接收数据到缓冲区中,in指针指向可以输入数据的第一个空缓冲区;当运行进程需要数据时,从循环缓冲区中取一个装满数据的缓冲区,并从此缓冲区中提取数据,out指针指向可以提取数据的第一个满缓冲区。输出则正好相反。

    4) 缓冲池

    由多个系统公用的缓冲区组成,缓冲区按其使用状况可以形成三个队列:空缓冲队列、装满输入数据的缓冲队列(输入队列)和装满输出数据的缓沖队列(输出队列)。还应具有四种缓冲区:用于收容输入数据的工作缓冲区、用于提取输入数据的工作缓冲区、 用于收容输出数据的工作缓冲区及用于提取输出数据的工作缓冲区,如图5-8所示。


    图5-8  缓冲区的工作方式

    当输入进程需要输入数据时,便从空缓冲队列的队首摘下一个空缓冲区,把它作为收容输入工作缓冲区,然后把输入数据输入其中,装满后再将它挂到输入队列队尾。当计算进程需要输入数据时,便从输入队列取得一个缓冲区作为提取输入工作缓冲区,计算进程从中提取数据,数据用完后再将它挂到空缓冲队列尾。当计算进程需要输出数据时,便从空缓冲队列的队首取得一个空缓冲区,作为收容输出工作缓冲区,当其中装满输出数据后,再将它挂到输出队列队尾。当要输出时,由输出进程从输出队列中取得一个装满输出数据的缓冲区,作为提取输出工作缓冲区,当数据提取完后,再将它挂到空缓冲队列的队尾。

    3. 高速缓存与缓冲区的对比

    高速缓存是可以保存数据拷贝的高速存储器,访问高速缓存比访问原始数据更高效速度更快。其对比见表5-1。
     
    表5-1 高速缓存和缓冲区的对比
      高速缓存 缓冲区
      相同点 都是介于高速设备和低速设备之间
    区别 存放数据 存放的是低速设备上的某些数据的复制数据,也就是高速缓存上有的低速设备上面必然有 存放的是低速设备传递给高速设备的数据(或者是高速设备传送给低速设备的数据),而这些数据在低速设备(或者高速设备)却不一定有备份,这些数据在从缓存区传送到髙速设备(或者低速设备)
    目的 高速缓存存放的是高速设备经常要访问的数据,如果高速设备要访问的数据不在高速缓存中,高速设备就需要访问低速设备 高速设备和低速设备的通信都要经过缓存区,高速设备永远不会直接去访问低速设备
    展开全文
  • 高速缓存学习笔记

    2020-01-09 16:31:22
    这里写自定义目录标题高速缓存系统概述存储器层次结构高速缓存基本原理高速缓存的设计高速缓存的存取物理地址还是虚拟地址写策略数据同步问题 高速缓存系统概述 高速缓存存储系统(cache memory system)是高速...

    高速缓存系统概述

    高速缓存存储系统(cache memory system)是高速存储器,他能利用引用的局部性来提高系统性能。

    存储器层次结构

    高速缓存(cache)保存有主存储器很小的一个子集的内容,利用局部引用特性来改善系统性能。
    局部引用特性:大多说程序表现出的一种属性,在一个特定时间段内,程序指令和数据的一个相当小的子集被频繁地重复引用。
    高速缓存相对于其他系统组件的位置
    局部性一般分为两种类型:时间的(temporal)和空间的(spatial)。
    时间局部性:程序可能重复使用近期引用过的项。
    空间局部性:程序有可能重复使用前面附近引用过的项。

    高速缓存基本原理

    高速缓存的设计

    由于高速缓存只能保存主存储器的一个子集,所以首先需要确定存储器的哪些部分当前在高速缓存中。
    高速缓存中的数据用他们对应的主存储器地址进行标记(tagging),然后硬件就可以通过检查高速缓存中数据的标记(tag)来判断一个特定的内存位置是否被缓存了。
    直接映射的数据高速缓存
    高速缓存的设计中,标记(tag)用于确定来自主存储器的连续的一片地址,主存储器的一个或者更多连续的字被组织到一起,形成了一个高速缓存行(line)或者块(block),每一个行关联单个标记(tag)。
    标记包含的内容:对应那一块内存的第一个字节地址,控制信息,有效位(valid bit),修改位(modified bit)。

    高速缓存的存取

    CPU请求一个它想要获取的主存储器的地址时,具体过程:
    在这里插入图片描述

    1. 这个地址被发给高速缓存;
    2. 硬件开始搜索高速缓存(一般使用简单的hash table来进行搜索)来寻找相应的数据(地址);
    3. 如果在高速缓存中找到,就称为一次缓存命中(cache hit);
    4. 如果没有找到,就称为缓存缺失(cache miss);
    5. 如果发生一次命中,则数据就从高速缓存中返回给CPU,就好像它是从主存储器中读取的一样
    6. 如果没有命中,那么就把地址传递给主存储器,在那里访问寻址单元,取得数据后,数据既返回给CPU也返回给高速缓存(以便利用局部性)。此时需要将cache中的一些已有数据替换为新数据,就涉及到替换策略(replacement policy),典型的替换策略有LRU(leaset recently Used,最近最少使用),伪LRU,随机替换。替换策略对软件来说是透明的。

    缓存命中率越高,系统的性能越好。

    物理地址还是虚拟地址

    高速缓存可以设计成通过数据或者指令物理地址或者虚拟地址来访问。

    写策略

    CPU保存数据时,大多数实现都把数据直接保存到高速缓存中,这样有助于改善系统性能,原因:

    1. 提高命中率;
    2. 读写到cache的速度快于读写到主存上。故让CPU以比其他方式更快的速度开始下一次读写。

    高速缓存的写策略(write policy),也叫做更新策略(update policy),大体有两种:写直通(write through)和写回(write back)。

    写直通:来自CPU的数据,既会写入cache,也会写入主存储器。

    • 优点:存储器始终保持在“最新”状态;
    • 缺点:每次其来自CPU的写入操作都需要由一个主存储器周期,降低系统的速度。

    写回:来自CPU的数据,会写入cache,但是并不写入主存储器,直到在行替换或者操作系统明确要求写回主存储器时才写入主存储器。

    1. 优点:主存储器写入操作可能更少,整体性能也就可能更好;
    2. 缺点:操作系统需要多次的把被修改的行写回存储器,以此来保持数据的完整性。

    CPU保存数据期间,如果命中,则使用的是写直通或者写回;如果没有命中,则采取的措施取决于是否支持写分配(write allocate)。
    写分配:CPU保存的数据在发生高速缓存缺失的情况下,始终会被写入高速缓存。

    数据同步问题

    在使用写回时,必须保证cpu读写的数据是最新的,举例如下:
    i在高速缓存内的值和在主存储器内的值
    采用写回的高速缓存的CPU在执行一个程序中的i=i+1。

    1. 在执行这条语句之前,i在主存储器中的值为1;
    2. CPU试图读取i的当前值时,他cache miss,CPU要将值1载入到cache中,然后返回给CPU;
    3. 接着,CPU给i的值加1,把i的值2写回;
    4. 写入操作导致cache hit,并且i在高速缓存中的值被更新为2,此时高速缓存中i拥有新值2,主存储器内仍保持旧值1。

    这时,高速缓存内的i的新值被认为相对于主存储器内的值被“修改”过了。
    必须要确保i在主存储器内的旧值不会被程序访问到,否则会出现无法预测的结果。多处理器系统上,也必须要确保其他进程不会使用过时的存储器内的值。

    展开全文
  • CPU高速缓存那些事儿

    千次阅读 2018-07-30 15:42:31
    在分析JDK8新增的高并发原子累加器Striped64的时候,发现有一个“伪共享”的概念,而要理解它必须对CPU缓存有一定的了解,所以本文将先对CPU的缓存架构以及一些相关术语做一个研究探索。   CPU缓存的原理  ...

    引言

    在分析JDK8新增的高并发原子累加器Striped64的时候,发现有一个“伪共享”的概念,而要理解它必须对CPU缓存有一定的了解,所以本文将先对CPU的缓存架构以及一些相关术语做一个研究探索。

     

    CPU缓存的原理

          众所周知,在如今的计算机时代,CPU的运算处理速度与内存读写速度的差异非常巨大,为了解决这种差异充分利用CPU的使用效率,CPU缓存应运而生,它是介于CPU处理器和内存之间的临时数据交换的缓冲区。

          CPU缓存和内存都是一种断电即掉的非永久随机存储器RAM,那么它和内存在物理上有什么差异吗?当然有,CPU缓存基本是由SRAM(static RAM)构成(也有IBM的Power系列处理是eDRAM构成的CPU缓存),而内存经常称之为DRAM,其实它是SDRAM(同步动态随机存储器),是DRAM的一种。构成内存的DRAM只含有一个晶体管和一个电容器,集成度非常高可用轻易的做到大容量,但因为靠电容器来存储信息所以需要不间断刷新电容器的电荷,而充放电之间的时间差导致DRAM的数据读写速度较SRAM慢的多。

        构成缓存的SRAM却比构成内存的DRAM的复杂度高了不止一筹,所以占据空间大,成本高,集成度很低,以至于在CPU工艺低下的前期,CPU缓存不能集成进CPU内部而只有集成到主板上,但它的好处却是不需要刷新电路所以读写速度快。

        如果说SRAM与DRAM物理结构及性能的不同展现了CPU高速缓存的物理原理,那么时间局部性原理和空间局部性原理则是支撑CPU高速缓存的逻辑原理。时间局部性原理是说:被引用过的内存位置很可能在不远的将来还会被多次引用,空间局部性原理说的是:如果一个内存位置不引用了,那么程序很可能会在不远的将来引用该内存位置附近的内存位置。

     

    CPU缓存的层次结构

        最开始对CPU缓存进行分类是由于CPU内部集成的CPU缓存已经不能满足高性能CPU的需要,而制造工艺上的限制又不能在CPU内部大幅提高缓存的数量,所以出现了集成在主板上的缓存,当时人们就把CPU内部的缓存称为一级缓存,即L1 Cache,在CPU外部主板上的缓存称为二级缓存,即L2 Cache。而一级缓存其实还分为一级数据缓存(Data Cache,D-Cache,L1d)和一级指令缓存(Instruction Cache,I-Cache,L1i),分别用于存放数据和执行数据的指令解码,两者可以同时被CPU访问,减少了CPU多核心,多线程争用缓存造成的冲突。

        早期Intel和AMD似乎对最后一层缓存L2上存在不同的见解,每个CPU核心都具备独立的一级缓存L1,那么二级缓存L2呢?AMD的做法是依然每个CPU核心使用独立的二级缓存,但Intel却采用了一个CPU的多个核心共享二级缓存的设计,即所谓的“Smart Cache”技术,这在当时确实要比AMD的设计性能更好。

        随着制造工艺的提升,L2也被集成进了CPU缓存,但是接踵而来对大数据处理和游戏性能等等需要,在高端CPU上出现了三级缓存L3 Cache。三级缓存的出现据说对CPU的性能有着爬坡似的提升。当然到了2018年的今天,拥有三级缓存已经不再是高端CPU的特权,在一些特殊的CPU上据说还出现了四级缓存,当然这并不是说缓存的级数越多越能提升性能,到了三级缓存之后由于距离CPU的传输距离和本身容量的提升,CPU访问缓存和直接访问内存所能带来的性能提升已经被逐渐抵消,所以与其增加所谓的四级缓存还不如就直接访问内存。 综上所述,大概描述了CPU缓存的层次结构,下图是来至《深入理解计算机系统》书中关于CPU缓存和内存、硬盘存储器的层次结构:



     

     从图上可以看出,深入理解计算机系统一书将寄存器划分为L0级缓存,接着依次是L1,L2,L3,内存,本地磁盘,远程存储。越往上的缓存存储空间越小,速度越快,成本也更高;越往下的存储空间越大,速度更慢,成本也更低。从上至下,每一层都可以看做是更下一层的缓存,即:L0寄存器是L1一级缓存的缓存,L1是L2的缓存,依次类推;每一层的数据都是来至它的下一层,所以每一层的数据是下一层的数据的子集。

     

        在继续CPU缓存之前,借着我的笔记本使用CPU-Z查看到的关于处理器的一些信息,进行简单的介绍:

        
     以上信息也可以通过一个叫CoreInfo的工具查看https://docs.microsoft.com/en-us/sysinternals/downloads/coreinfo,第一张图表明我有L1, L2, L3 级CPU缓存,右下角说明我的处理器是双核四线程的。那么双核四线程是什么意思?双核我们都不陌生,类比以前的单核,就是一个CPU拥有多个核心,每个核心拥有独立的运算处理单元、控制器、寄存器、L1、L2缓存,然后一个CPU的多个核心共享最后一层CPU缓存L3,使其可以同时运行一个进程的多个线程,如下图所示:


    那么四线程是什么,其实这就是所谓的超线程技术(HyperthreadingTechnology),就是通过采用特殊的硬件指令,可以为一个逻辑内核再模拟出来一个物理芯片,所以如果你通过Windows的设备管理查看处理器你会看到四个,其实有两个都是模拟出来的,这样做可以将CPU内部暂时闲置的资源充分“调动”起来,因为我们的CPU在运行一个程序时其实还有很多执行单元是被闲置的。模拟出一个核就是为了使用CPU一些空闲的地方(资源),充分榨取CPU的性能。但是模拟出来的内核毕竟是虚拟的,所以它会和被模拟的逻辑核共享寄存器,L1,L2,因此就算是双核四线程还是只有2个一级缓存L1,2个二级缓存L2,一个三级缓存L3,所以假如物理核与它的模拟核中的线程要同时使用同一个执行单元里的东西时,或者访问同一个缓存行数据,还是只能一个一个的来。

        那么双CPU或者双处理器呢?前面所说的双核心是在一个处理器里拥有两个处理器核心,核心是两个,但是其他硬件还都是两个核心在共同拥有,而双CPU则是真正意义上的双核心,不光是处理器核心是两个,其他例如缓存等硬件配置也都是双份的。一个CPU对应一个物理插槽,多处理器间通过QPI总线相连。我们常见的计算机(例如上面我的笔记本)几乎都是单CPU多核心的,真正的多CPU并不是个人PC所常用的。

     

    CPU缓存的内部结构

    对CPU缓存的层次结构有了了解之后,我们再深入进CPU缓存内部,看看它内部的结构。

     

     

     上图是一个CPU缓存的内部结构视图,来至《深入理解计算机系统》一书,结合上图我这里只做简单的说明,若要细致深入的了解请参考原书。原来,CPU缓存内部一般是由S组构成,这个S的大小与该缓存的存储大小寻址空间有关,然后每一组里面又有若干缓存行cache line,例如上图每一组有E行cache line,E等于2,每一个缓存行包含一个标记其是否有效的有效位和t个标记位,然后才是真正存储缓存数据部分有B个字节大小。整个缓存区的大小C=B*E*S.

    而一个内存地址在做缓存查找的时候,首先中间的s位指明了应该放在哪一组,高位的t位指明位于组中的哪一行,低位的b位表示应该从缓存行中的多少个偏移开始读取,毕竟一个缓存行可以存放很多数据的,一般是64个字节。

        这里面,代表行数量的E等于1的时候称之为“直接映射高速缓存”,E等于C/B即一个组包含所有行的时候称之为“全相联高速缓存”,当1>E>C/B即缓存行数介于这之间时称之为“组相联高速缓存”。由于CPU缓存的空间一般很小,内存数据映射到CPU缓存的算法必然将导致有很多不同的数据将被映射放置到相同的缓存行,这种访问同一个缓存行的不同数据就将导致缓存不命中,需要重新到下一级缓存或内存加载数据来替换掉原来的缓存,这种不命中称之为“冲突不命中”,如果这种冲突不命中持续产生,我们将之称之为“抖动”。很显然,直接映射高速缓存每一组只有一行所以这种“抖动”将可能是很频繁的,而这显然也不是最高的缓存设计方案。而“全相联高速缓存”虽然能最大限度的解决这种“抖动”但是由于行数太多想要CPU能够快速的在比较大的缓存中匹配出想要的数据也是非常困难的,而且代价昂贵。所以它只适合做小的高速缓存。最后只有“组相联高速缓存”才是我们最佳的方案。

        在上面CPU-Z的截图中,我的CPU缓存就是采用的组相联高速缓存,L1/L2后面的8-way说明它们每一组有8行,L3有12行,L1 d/L1 i的缓存总大小都是是32KB(注意前面有个乘以2 其实就是指有两个核心),L2的缓存大小是256KB....

        一般缓存行的大小是64个字节(不包含有效位和标记位),即B等于64,其实我的这个笔记本也是,这在上面CPU-Z的第二张图中可以看到,这些信息还可以通过CoreInfo工具或者如果我们用Java编程,还可以通过CacheSize API方式来获取Cache信息, CacheSize是一个谷歌的小项目,java语言通过它可以进行访问本机Cache的信息。示例代码如下:

    public static void main(String[] args) throws CacheNotFoundException {
    	CacheInfo info = CacheInfo.getInstance(); 
    	CacheLevelInfo l1Datainf = info.getCacheInformation(CacheLevel.L1, CacheType.DATA_CACHE);
    	System.out.println("第一级数据缓存信息:"+l1Datainf.toString());
    
    	CacheLevelInfo l1Instrinf = info.getCacheInformation(CacheLevel.L1, CacheType.INSTRUCTION_CACHE);
    	System.out.println("第一级指令缓存信息:"+l1Instrinf.toString());
    }

     打印结果如下:

    第一级数据缓存信息:CacheLevelInfo [cacheLevel=L1, cacheType=DATA_CACHE, cacheSets=64, cacheCoherencyLineSize=64, cachePhysicalLinePartitions=1, cacheWaysOfAssociativity=8, isFullyAssociative=false, isSelfInitializing=true, totalSizeInBytes=32768]
     
    第一级指令缓存信息:CacheLevelInfo [cacheLevel=L1, cacheType=INSTRUCTION_CACHE, cacheSets=64, cacheCoherencyLineSize=64, cachePhysicalLinePartitions=1, cacheWaysOfAssociativity=8, isFullyAssociative=false, isSelfInitializing=true, totalSizeInBytes=32768]

    显然这是和实际相符的,cacheSets表面有64组,cacheCoherencyLineSize表明缓存行的大小为64字节,cacheWaysOfAssociativity表示一组里面有8个缓存行,totalSizeInBytes就是整个缓存行的大小32KB,L1数据/指令缓存大小都为:C=B×E×S=64×8×64=32768字节=32KB。 

     

    CPU缓存的读写与缓存一致性协议

     首先是读,CPU执行一条读内存字w的指令时是从上往下依次查找的,下层查找到包含字w的缓存行之后,再由下层将该缓存行返回给上一层高速缓存,上一层高速缓存将这个缓存行放在它自己的一个高速缓存行中之后,继续返回给上一层,直到到达L1。L1将数据行放置到自己的缓存行之后,从被存储的缓存行中抽取出CPU真正需要的字w,然后将它返回给CPU。大概就是高速缓存确定一个请求是否命中,然后1)组选择;2)行匹配;3)字抽取。

        这里面有一个很重要的地方就是,CPU缓存在不命中的时候,向下层缓存请求的时候,返回的数据是以一个缓存行为单位的,并不是只返回给你想要的单个字,另外当出现不命中冲突的时候,会执行相应的替换策略进行替换。

    最后,关于写分为两种请况:

              1.要写一个已经缓存了的字w,即写命中:首先更新本级缓存的w副本之后,怎么更新它的下一级缓存?最简单是“直写”,即立即将包含w的高速缓存行写回到第一层的缓存层, 这样做虽然简单,但是你知道CPU每时每刻可能都在进行写数据,如果大家都不停的写势必会产生很大的总线流量,不利于其他数据的处理;另一种方法称为“写回”,尽可能的推迟更新,只有当替换策略需要替换掉这个更新过的缓存行时才把它写回到紧接着的第一层的缓存中,这样总量流量减少了,但是增加了复杂性,高速缓存行必须额外的维护一个“修改位”,表明这个高速缓存行是否被修改过。

             2.写一个不在缓存中的字,即写不命中:一种是写分配,就是把不命中的缓存先加载过来,然后再更新整个缓存行,后面就是写命中的处理逻辑了;另一种是非写分配,直接把这个字写到下一层。

     

    说到CPU缓存的写操作还有一个很重要的话题,那就是缓存一致性协议MESI。关于缓存一致性协议及其变种又是另一个繁杂的内容,而MESI其实仅仅是众多一致性协议中最著名的一个,其名字的得名也来至于该协议中对四种缓存状态的缩写简称,缓存一致性协议规定了如何保证缓存在各个CPU缓存的一致性问题:

    以MESI协议为例,每个Cache line有4个状态,可用2个bit表示,它们分别是: 

    状态

    描述

    M(Modified)

    这行数据有效,但数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。

    E(Exclusive)

    这行数据有效,数据和内存中的数据一致,数据只存在于本Cache中。

    S(Shared)

    这行数据有效,数据和内存中的数据一致,数据存在于很多Cache中。

    I(Invalid)

    这行数据无效。

     关于缓存一致性协议,由于其又是一个比较繁多的内容,我这里仅仅粗略的说一下我的理解,总之它是一种保证数据在多个CPU缓存中一致的手段,至于到底是什么样的手段,根据各个CPU厂商采用的一致性协议的不同而不同,以我目前的了解,主要有以下几种:

    1. 当CPU在修改它的缓存之前,会通过最后一级缓存L3(因为最后一级缓存是多核心共享的)或者总线(多CPU跨插槽的情况)广播到其他CPU缓存,使其它存在该缓存数据的缓存行无效,然后再更改自己的缓存数据,并标记为M,当其他CPU缓存需要读取这个被修改过的缓存行时(或者由于冲突不命中需要被置换出去时),会导致立即将这个被修改过的缓存行写回到内存,然后其他CPU再从内存加载最新的数据到自己的缓存行。

    2. 当CPU缓存采用“直写”这种一更改马上写回内存的方式更新缓存的时候,其他CPU通过嗅探技术,从总线上得知相关的缓存行数据失效,则立即使自己相应的缓存行无效,从而再下次读不命中的时候重新到内存加载最新的数据。

    3. 当CPU修改自己的缓存行数据时,主动将相关的更新通过最后一级缓存L3或者总线(如果是多CPU跨插槽的情况)发送给其它存在相关缓存的CPU,使它们同步的更新自己的缓存到一致。

     

    总之,达到CPU缓存一致性的手段层出不穷,并且通过以上3种方式,可以看到在处理缓存一致性问题的时候,如果是单CPU多核心处理器,那么总是免不了使用最后一级缓存L3来传递数据,而这还不是最糟糕的,当多处理器跨插槽的时候,数据还要穿过总线跨插槽进行传输以保证缓存一致性, 这对性能将是更严峻的考验。这种CPU缓存一致性带来的问题将是我们在文章开始提出的“伪共享”的根本所在,具体讲在下一章节进行说明。

     

    展开全文
  • 高速缓存-CA

    2020-01-23 16:01:37
    文章目录存储层次的基本概念CPU与RAM的速度剪刀差处理器和内存速度剪刀差摩尔定律使CPU的内容发生了变化计算机硬件系统的组成CPU中RAM的面积和晶体管比例存储层次基本原理Cache结构cache的结构Cache性能优化Cache...
  • 计算机的高速缓存

    2019-08-10 15:27:11
    计算机高速缓存的原理,计算机高速缓存的策略
  • 高速缓存工作原理

    千次阅读 2012-11-26 20:04:04
     事实表明,高速缓存是计算机科学所采用的一种重要方法,它以各种不同的形式存在于每台计算机上。缓存分为内存缓存、硬件和软件磁盘缓存、页缓存等等。甚至虚拟内存也是一种高速缓存形式。在本文中,我
  • 通用高速缓存原理

    2020-10-19 09:27:49
    扒一扒高速缓存(cache)的原理
  • 高速缓存

    2018-04-29 21:45:44
    一、配置网络、安装高速缓存服务及配置服务1.配置网络重启网络 systemctl restart network2.服务端安装高速缓存服务 yum install bind -y 3.开启服务并设置开机自启 正常开启后会生成文件 /etc/rndc.key 4....
  • 我们说了Java内存模型是一个语言级别的内存模型抽象,它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统一的接口来提供保证内存一致性的编程能力。 在一致性这个问题域中,各个层面扮演的角色大致如下: ...
  • 高速缓存cache

    千次阅读 2018-07-14 21:12:03
    高速缓存cache cache的基本原理 cache是一种小容量高速缓冲存储器,由快速SRAM组成。在CPU和贮存之间设置cache,总是把主存中被频繁访问的活跃程序块和数据块复制到cache。 cache是为了解决CPU与主存的...
  • 高速缓存(cache)存储器

    万次阅读 多人点赞 2017-03-30 16:38:56
    高速缓存(cache)存储器:这里先说明一下(高速缓存)cache和(高速缓冲)buffer的区别: buffer主要作用是在一定程度上减少对IO设备访问的次数,可以起到流量整形的作用,也提升了系统的性能,毕竟IO操作和内存和cpu的...
  • 关于CPU CACHE工作机制的学习

    万次阅读 2015-08-31 23:45:48
    由于这段时间的工作需要,对当前CPUCACHE 高速缓存的工作原理机制进行了相对比较易通的学习和了解工作。    1. 存储层次结构 由于两个不谋而合的因素如下: l 硬件:由于不同存储技术的访问时间相差很大。速度...
  • IBATIS(MyBatis)高速缓存

    千次阅读 2013-03-22 16:38:28
    一.iBATIS高速缓存介绍 1.1 iBATIS高速缓存只关注如何在持久层对查询结果进行缓存。 1.2 iBATIS带来的好处就是通过配置文件来管理高速缓存,帮助避免因手工管理高速缓存结果及其依赖性而造成的大量繁琐的工作。...
  • 域名服务器中的高速缓存的作用是什么? 域名服务器的解析方式有两种:第一种叫递归查询,查询过程由解析器向服务器发出递归查询请求,服务器先在所辖区域内进行查找,如果找到,则将结果返回给解析器端;否则...
  • windows无法更改此设备的写入高速缓存设置。您的设备可能不支持此功能或不支持更改此设置。 问题引发是由AD域服务的报错事件ID1539引起的,需要取消“启用设备上的写入缓存” 问题可参考...
  • 高速缓存Cache与主存间采用全相联的地址影像方式,高速缓存的容量为4MB(2006)● 高速缓存Cache与主存间采用全相联的地址影像方式,高速缓存的容量为4MB,分为4块,每块1MB,主存容量为256MB,若主存读写时间为30ns,...
  • CPU高速缓存行对齐(cache line)

    万次阅读 2014-11-07 16:53:57
    CPU的高速缓存一般分为一级缓存和二级缓存,现今更多的CPU更是提供了三级缓存。CPU在运行时首先从一级缓存读取数据,如果读取失败则会从二级缓存读取数据,如果仍然失败则再从内存中存读取数据。而CPU从一级缓存或二...
  • 在上一篇聊聊高并发(三十三)从一致性(Consistency)的角度理解Java内存模型 我们说了Java内存模型是一个语言级别的内存模型抽象,它屏蔽了底层硬件实现内存一致性需求的差异,提供了对上层的统一的接口来提供保证...
  • 关于缓存行(cache line)

    万次阅读 2011-07-31 10:38:27
    为了简化与RAM之间的通信,高速缓存控制器是针对数据块,而不是字节进行操作的。从程序设计的角度讲,高速缓存其实就是一组称之为缓存行(cache line)的固定大小的数据块,其大小是以突发读或者突发写周期的大小为...
1 2 3 4 5 ... 20
收藏数 142,404
精华内容 56,961
关键字:

高速缓存