问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

缓存的基本概念与工作原理

创作时间:
作者:
@小白创作中心

缓存的基本概念与工作原理

引用
CSDN
1.
https://blog.csdn.net/qq_39876540/article/details/136388391

缓存(cache)是计算机系统中用于提高数据访问速度的重要组件。本文将从基本概念、工作原理到一致性问题,全面解析缓存技术的核心内容。

1. 缓存简介

1.1 为什么需要缓存

计算机发展过程中,CPU的性能已经远大于内存的访问性能,因此存储的访问大大限制了CPU的工作速度。而CPU在工作中具有局部性(时间局部性:最近访问的内容很可能在短期内被再次访问;空间局部性:地址相邻的内容很可能在相近的时间被用到)。因此引入缓存可以很大程度上提高CPU的工作效率。

缓存是微体系结构的概念,是内存的映像,缓存的内容是内存内容的子集。一定程度上,缓存没有功能上的意义,其存在意义是为了性能,降低访存延迟;缓存没有独立的编址空间,处理器访问缓存和访问存储器使用相同的地址,但是访问寄存器不一样,寄存器有单独的编址空间。

理解为 -> 学生在很大的图书馆看书,每次拿的书大多数都是位置上差不多的书,看完一本再去拿另一本的方法,不如每次都将要拿的书和它附近的书一块都放到桌子上,这样更加节省时间。
学生->CPU、桌子->缓存、图书馆->大而慢的存储空间

1.2 系统中的缓存

缓存在计算机科学中有广泛的应用,主要用于提高计算机系统的性能和效率。下面是一些常见的应用场景:

  1. CPU缓存:CPU内部有多级缓存(L1、L2、L3),用于存储最经常访问的数据和指令。通过将数据和指令缓存到高速缓存中,可以减少从主存中读取数据的次数,从而提高CPU的访问速度。

  2. Web缓存:Web缓存是存储在Web服务器和客户端之间的中间层。当客户端请求访问一个网页时,Web缓存可以将其存储在缓存服务器中。当下次有相同的请求时,缓存服务器可以直接返回缓存的网页,而不需要再次向原始服务器请求,从而减少网络传输时间和服务器负担。

  3. 数据库缓存:数据库缓存是将经常使用的数据存储在高速缓存中,以提高数据库的查询性能。当查询请求到达时,数据库可以首先检查缓存中是否存在相应的数据,如果存在,则直接返回缓存的数据,而不需要再次查询数据库。这样可以减少数据库的访问时间和负载。

  4. 编译器缓存:在编译过程中,编译器会将经常使用的中间代码或已编译的代码存储在缓存中,以便在后续的编译过程中重复使用。这样可以减少重复编译的时间和资源消耗。

  5. 文件系统缓存:操作系统会将经常访问的文件数据缓存到内存中,以提高文件的读取速度。当下次有相同的读取请求时,操作系统可以直接从内存中返回缓存的文件数据,而不需要再次访问磁盘。

总的来说,缓存的应用能够减少对低速存储设备(如内存、磁盘或网络)的访问次数,从而提高计算机系统的响应速度和性能。

2. 缓存的工作原理

2.1 缓存中的数据如何被放置

缓存的空间被分成固定大小的块(cache line):

  • 全相连(Fully associative):可以放在缓存的任何位置。
  • 直接映射(Direct mapped):只允许放在缓存的某一行。如下图:
  • 组相连(set associative):可以放在缓存的某几行。

2.2 如何在缓存中查找数据

缓存没有单独的编址空间,是内存的子集,因此缓存的一个单元在不同时刻存储不同的内存单元。这需要一个机制区分缓存单元当前存储的实际是哪个内存单元的数据,因此缓存每个单元既要存放数据,又要存放该数据单元的内存地址和在缓存中的状态。为缓存中每个字节都记录其他地址效率太低,因此缓存存储数据以缓存块作为单位,不同缓存级别缓存块大小不同;每个缓存块都需要保存其地址,这个就是缓存标签(cache tag);此外还要为每个缓存块记录其状态,例如:是否有效、是否被改写等。

2.3 如何替换缓存中的数据

因为缓存内部被分成了一定数量的缓存行,当缓存行使用满了之后,再有新的需求时就需要清理掉之前的缓存行,这里清理、替换的规则如下(针对于组相连和全相联的相连模式):

  • 随机:不怎么用;
  • LRU(Least Recently Used):比较复杂,缓存行会统计自身被访问的次数;
  • FIFO(First In First Out):先进先出规则;

替换的三种方法:

  • 不在缓存替换。如果缓存缺失了,直接转发访问地址到主存,取到的数据不会写到缓存。
  • 在读缺失时替换。如果读的时候缓存里没有该数据,则从主存读取该数据后写入缓存。
  • 在写缺失时替换。如果写的时候缓存里没有该数据,则将本数据调入缓存再写。

2.4 缓存的写操作

场景1:写命中(CPU要写入的内存在缓存中有)

这种情况有两种处理方式:

① 写穿透:CPU同时写缓存和内存 -> 简化了数据一致性,但是写的慢;
② 写回:CPU只写入到缓存就返回 bresp->被访问的缓存行被标记为 dirty(正常为 clean 状态)-> 只当此缓存行被换出时才写回主存 -> 标记为 dirty 的缓存行写入到下一级存储单元(多级的缓存可以设置到哪一级缓存的时候才向 CPU 返回 bresp)

场景2:写不命中(写缺失)(CPU 要写入的内存缓存中没有)

① 写分配(Write Allocate):在发生写缺失时,先把这一块读到缓存行(写分配),再在缓存行中写;之后再将修改过的主存块取到缓存。
② 写不分配(Write Non-Allocate):写缺失时直接写进内存,缓存中不做修改。

3. 缓存的一致性

如果多个不同处理器的缓存存放了缓存了同一个主存单元的内存块,即共享数据,这种情况就可能会导致缓存一致性问题的出现。缓存一致性协议分为主要有两大类:

  • 监听一致性,每个缓存被监听/监听其他缓存的总线活动;
  • 目录一致性,全局统一管理缓存状态。

3.1 总线监听一致性(Bus snooping protocol)

所谓监听,就是每个CPU都有一个缓存控制器,随时对通过总线中的数据进行判断,判断自己这是否有总线上请求的数据块。

我们讨论两种保持一致性的方式:写作废方式、写更新方式。

写作废方式:这种方式的基本思想是,当某个CPU出现写请求时,将其它CPU下的相同地址的缓存行直接作废。

我们将每个CPU的缓存的每个块都归结为下述的三种状态:

  • 未缓冲(U):所有的缓存中都无此块。
  • 专有态(E):即该块仅仅在该缓存中有副本,且该块的内容与主存中的不一致。
  • 共享态(S):即该块在一个或多个缓存中有副本,且内容与主存中一致。

具体流程:

假设CPU 1 有一个读请求:

  • 若命中,则缓存1直接将值返回给CPU 1。
  • 若未命中,就把读失效信号、以及相应地址放到总线上,其他的的CPU一直监听着总线,
  • a. 若该地址不能在其他CPU的缓存中被匹配,则结果就是CPU 1 能正常从主存中读取出数据,且将该块设置为共享态。
  • b. 若该地址在CPU 2中被匹配上,且该块在CPU 2的缓存中的状态是共享态,那么CPU 2将不会采取任何操作。
  • c. 若该地址在CPU 2中被匹配上,且该块在CPU 2的缓存中的状态是专有态,那么CPU 2将向CPU 1提供该块,并停止CPU 1访问主存的操作。CPU 1缓存以及CPU 2缓存中该块的状态修改为共享态。

假设CPU 1 有一个写请求

  • 若写命中
  • a. 若该块在CPU 1缓存中的状态是共享态,那么CPU 1将该块状态改为专有态,且向总线发送写作废信号,使得别的CPU将其缓存中的相应的共享块(若存在)设置为无效。
  • b. 若该块在CPU 1缓存中的状态是专有态,那么CPU 1进行正常的写数据的操作,即将新数据写入该块。
  • 若写缺失,
  • a. CPU 1将该块状态改为专有态,并且正常写入数据,且向总线发送写作废信号,使得别的CPU将其缓存中的相应的块(若存在)设置为无效。

状态转换图如下:

写更新方式:

这种方式的思想是,当某个CPU出现写请求时,将其它的副本一并更新。具体说来,就是当一个CPU写某数据时,若该块是共享块,通过广播使其他所有缓存中有对应副本的块都一并更新。这种方式很需要总线和存储器的带宽,因为要经常性地广播修改的数据,这使得这种方法被采用地越来越少。

从MESI中演化出的MOESI协议,O(Owned)是MESI中S和M的一个合体,表示本缓存行被修改,和内存中的数据不一致,不过其它的核可以有这份数据的拷贝,状态为S。(多核一致性上,core1 修改了一个 share&clearn 状态的缓存行,对于core1 来说,这个缓存行由S->O,对于其他合来说,这这缓存行由 S->I)

在上图中,Local Read表示本内核读本缓存中的值,Local Write表示本内核写本缓存中的值,Remote Read表示其它内核读其它缓存中的值,Remote Write表示其它内核写其它缓存中的值,箭头表示本缓存行状态的迁移,环形箭头表示状态不变。

当内核需要访问的数据不在本缓存中,而其它缓存有这份数据的备份时,本缓存既可以从内存中导入数据,也可以从其它缓存中导入数据,不同的处理器会有不同的选择。MESI协议为了使自己更加通用,没有定义这些细节,只定义了状态之间的迁移,下面的描述假设本缓存从内存中导入数据。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号