常说的cache机制到底是什么?L1 cache和 L2 cache是什么?

快速学习嵌入式开发其他基础知识?>>>>>>>>> 返回专栏总目录 《嵌入式工程师自我修养/C语言》<<<<<<<<<

Tip📌:鼠标悬停双虚线关键词/句,可获得更详细的描述

  推荐先阅读《一文帮你快速区分常用存储器!》和《CPU是如何工作的?什么是冯·诺依曼架构和哈弗架构?》。
  读完上面两篇文章我们知道内存带宽的瓶颈会拖CPU的后腿,影响CPU的性能。为了减少内存瓶颈带来的影响,CPU除了在内部使用寄存器这种方式外,还引入了cache机制:分别用指令cache和数据cache来缓存数据和指令,提升计算机的运行效率。

一、简述

  随着半导体工艺和芯片设计技术的发展,CPU的工作频率越来越高,和CPU进行频繁数据交换的内存的运行速度却没有相应提升,于是两者之间就产生了带宽问题,进而影响计算机系统的整体性能。CPU执行一条指令需要零点几纳秒,而RAM则需要30纳秒左右,读写一次RAM的时间,CPU都可以执行几百条指令了。为了不给CPU拖后腿,解决内存带宽瓶颈的方法一般有两个:

  • 一是大幅提升内存RAM的工作频率,目前最新的DDR4内存条的工作频率可以飙到2GHz,但是和高端的CPU相比,还是存在一定差距;
  • 二就是使用cache缓存机制,有速度瓶颈的地方就有缓存,这种思想在计算机中随处可见。

二、Cache的工作原理

2.1 cache在芯片架构中的地位及其工作原理

  现代的ARM SoC芯片架构一般如下图所示,芯片内部的cache层采用哈弗架构(指令和数据分开存储)。而芯片外部采用冯·诺依曼架构,工程实现简单。现代计算机集合了这两种架构的优点,因此严格地说,我们很难界定一款芯片到底是冯·诺依曼架构还是哈弗架构。
在这里插入图片描述
  当CPU到RAM中读数据时,内存RAM不是一次只传输要读取的指定字节,而是一次缓存一批数据到cache中,等下次CPU再去取指令和数据时,可以先到这两个cache中看看要读取的数据是不是已经缓存到这里了,如果没有缓存命中,再到内存中读取。
  当CPU写数据到内存RAM时,也可以先把数据暂时写到cache里,然后等待时机将cache中的数据刷新到内存中。cache缓存机制大大提高了CPU的访问效率。

Tips📌:

  • cache 在物理实现上其实就是静态随机访问存储器(SRAM);
  • cache的运行速度介于CPU和内存DRAM(就是上图中的RAM)之间,是在CPU和内存之间插入的一组高速缓冲存储器,用来解决两者速度不匹配带来的瓶颈问题。

2.2 cache工作流程举例(简化版)

2.2.1 CPU通过cache读内存数据

  当CPU读取内存中地址为8的数据时,CPU会将内存中地址为8的一片数据缓存到cache中。等下一次CPU读取内存地址为12的数据时,会首先到cache中检查该地址是否在cache中。如果在,就称为缓存命中(Cache Hit),CPU就直接从cache中取数据;如果该地址不在cache中,就称为缓存未命中(Cache Miss),CPU就重新转向内存读取数据,并重新缓存从该地址开始的一片数据到Cache中。
在这里插入图片描述

2.2.2 CPU通过cache写内存数据

  和读类似,当CPU往地址为16的内存写入数据0时,并没有真正地写入RAM,而是暂时写到了cache里。此时cache和内存RAM的数据就不一致了,缓存的每块空间里一般会有一个特殊的标记位,叫“Dirty Bit”,用来记录这种变化。当cache需要刷新时,如cache空间已满而CPU又需要缓存新的数据时,在清理缓存之前,会检查这些“Dirty Bit”标记的变化,并把这些变化的数据回写到RAM中,然后才腾出空间去缓存新的内存数据。
在这里插入图片描述
Tips📌:
  以上只是对cache的工作原理做了简化分析,实际远比这复杂,我们仅作了解即可应付嵌入式开发工作。

2.3 缓存未命中问题如何处理?

  CPU从cache里读取数据,如果缓存命中,就不用再访问内存,效率大大提升;如果缓存未命中,CPU不仅要重新到内存中取数据,还要缓存一片新的数据到cache中,如果cache已经满了,还要清理cache,如果cache中的数据有“Dirty Bit”,还要回写到内存中。这一波操作岂不是更费时低效?如何解决?

  为了减少这种情况发生,我们可以通过增大cache的容量来提高缓存命中的概率,但随之带来的就是成本的上升。在CPU内部,cache和寄存器的电路比内存DRAM复杂的多,会占用很大的芯片面积,如果大量使用,芯片发热量会急剧上升,所以在CPU内部寄存器一般也就几十个,靠近CPU的一级cache也就几十K字节。既然无法继续增加一级Cache的容量,一个折中的办法就是在一级Cache和内存之间添加二级Cache,如下图所示。

在这里插入图片描述
Tips📌:
  考虑到成本以及cache存在的性价比,现代的CPU大多采用多级Cache:一级Cache、二级Cache,甚至还有三级Cache。

三、多核CPU下的cache架构

3.1 多核CPU的big.LITTLE结构

  现在的CPU一般都是多核结构,多个Core集成到一个处理器上,当CPU负载很大时,多个Core一起上阵可以提高工作效率,但是当工作任务不是很多时,如只开一个QQ,然后八个核一起跑,只有一个Core在工作,其他Core也开始跟着空转打酱油,随之带来的就是功耗的上升。为了避免这种情况,ARM推出了big.LITTLE架构,也就是大小核架构:一个处理器内部集成的有高性能的Core,也有低功耗的Core。当CPU工作负载很重时,启动高性能的Core工作;当CPU很闲时,则切换到低功耗的Core上工作。根据不同的应用场景和工作负载,CPU分配不同的Core工作,可以在性能和功耗之间达到一个平衡。

  ARM处理器针对多核采取了分层设计,如下图所示,将所有的高性能核放到一个簇(Cluster)里,构成一个big Cluster,将多个低功耗核放到另一个Cluster里,构成LITTLE Cluster。处理器中的每个Core都有自己独立的数据Cache和指令Cache,每个Cluster共享L2 Cache。
在这里插入图片描述
Tips📌:

  • 在X86 架构的CPU 中, 一般每个Core 也会有自己独立的L2 Cache,而不是被每簇(Cluster)的Core共享。L3 Cache被所有的Core共享。
  • 为了保证多个Core运行时Cache和RAM中的数据相同,两个Cluster之间通过缓存一致性接口相连,不仅保证多个Core之间的高效通信,还通过检测电路,保证了多个Cache之间、Cache和RAM之间的数据一致性,避免程序运行出错。

3.2 为什么有些处理器没有Cache?

  为什么有些处理器没有Cache? 如C51 系列单片机、cortex-M0 、cortex-M1 、cortex-M2、cortex-M3、cortex-M4系列的ARM处理器都没有Cache。

  Cache的作用主要是缓解CPU和内存之间的带宽瓶颈,一般用在高性能处理器中,因此并不是所有的处理器都有Cache ,更详细地说,主要原因有三个:

  • 一是这些处理器都是低功耗、低成本处理器,在CPU内集成Cache会增加芯片的面积和发热量,不仅功耗增加,芯片的成本也会增加不少。
      以Intel酷睿i7-3960X处理器为例,如下图所示,L3 Cache大约占了芯片面积的1/4,再加上每个Core内部集成的独立L1 Cache和L2 Cache,整个Cache面积差不多就占了芯片总面积的1/3。
    在这里插入图片描述
  • 二是这些处理器本来工作频率就不高(从几十兆赫到几百兆赫不等),和RAM之间不存在带宽问题,有些处理器甚至不需要外接RAM,直接使用片内SRAM就可满足开发需求。
  • 三是使用Cache无法保证实时性。当缓存未命中时,CPU从RAM中读取数据的时间是不确定的,这是嵌入式实时控制场景无法接受的。因此,在一些面向嵌入式工业控制、实时领域、超低功耗的处理器中,大家可以看到很多没有集成Cache的处理器。

>>>>>>>>> 返回专栏总目录 《嵌入式工程师自我修养/C语言》<<<<<<<<<

  • 16
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
L1/L2/L3 Cache是存储器子系统中的组成部分,用于存放程序经常使用的指令和数据。L1 Cache是CPU流水线和主存储器之间的第一级缓存,L2 Cache是L1 Cache之上的第二级缓存,L3 Cache是L2 Cache之上的第三级缓存。\[1\] 当CPU需要数据时,它首先搜索L1 Cache,如果未找到,则接下来搜索L2 Cache和L3 Cache。如果找到所需的数据,则称为缓存命中。如果数据不在缓存中,则CPU必须从主内存或存储加载数据到缓存中,这会导致延迟并对性能产生不利影响,这称为缓存未命中。\[2\] 除了L1/L2/L3 Cache之外,还有其他类型的Cache,如用于虚实地址转换的TLB、MOB、ROB、Register File和BTB等。这些Cache的作用是提高数据传输率和缓解访问延迟。\[1\] 总结来说,L1/L2/L3 Cache是存储器子系统中的缓存,用于存放CPU经常使用的指令和数据,以提高数据访问速度和系统性能。\[1\]\[2\] #### 引用[.reference_title] - *1* [什么是L1/L2/L3 Cache?](https://blog.csdn.net/wujianing_110117/article/details/119663604)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [CPU缓存:L1、L2 和 L3 缓存之间的区别](https://blog.csdn.net/weixin_42238387/article/details/120576720)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

车载系统攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值