【愚公系列】软考高级-架构设计师 007-存储技术(Cache)
🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
Cache(发音为“cash”)是一种高速数据存储层,存在于计算机的存储器层次结构中,它的作用是暂时存储近期被访问的数据和指令,以便于快速访问。由于Cache的访问速度远高于主存储器(如RAM)和辅助存储设备(如硬盘或SSD),利用Cache可以显著减少数据访问的平均时间,从而提高计算机系统的整体性能。
🚀一、Cache
🔎1.高速缓存Cache
🦋1.1 工作原理
Cache工作的基本原理是基于程序运行时的局部性原理,包括时间局部性和空间局部性:
- 时间局部性:如果一个数据被访问,那么在不久的将来它很可能再次被访问。
- 空间局部性:如果一个数据被访问,那么它附近的数据也很可能被访问。
根据这两个原理,Cache通过存储最近和/或频繁访问的数据和指令,使得CPU在大多数情况下能够直接从Cache中获取数据,而不是从较慢的主存中获取。
🦋1.2 类型
Cache可以根据存储位置、目的和内容被分为几种类型:
- 根据存储位置:分为内部Cache(或一级Cache,L1 Cache)和外部Cache(包括二级Cache,L2 Cache,以及三级Cache,L3 Cache)。L1 Cache位于处理器内部,速度最快,容量相对较小;L2和L3 Cache容量较大,位于处理器外部,但仍然比主存快得多。
- 根据目的:分为指令Cache用于存储指令,数据Cache用于存储数据,和统一Cache(或混合Cache),同时存储指令和数据。
- 根据内容:分为全相联Cache、直接映射Cache和组相联Cache,这些分类描述了数据在Cache中的存储方式,影响着Cache的效率和复杂度。
🦋1.3 管理
Cache的管理涉及到几个关键的策略,包括替换策略(如最近最少使用(LRU)算法),写策略(写回(Write-Back)和写通(Write-Through))和映射策略(如直接映射、全相联映射和组相联映射)。
🦋1.4 重要性
在现代计算机架构中,Cache是提高处理器性能的关键技术之一。随着处理器速度的提高和多核处理器的普及,高效的Cache设计和管理变得越来越重要。通过有效利用Cache,可以大大减少处理器访问内存的延迟,提高程序运行的速度。
🦋1.5 练习
1、在CPU内外常设置多级高速缓存Cache其主要目的是( )。(2019下半年试题)
A.扩大主存的存储容量
B.提高CPU访问主存数据或指令的效率
C.扩大存储系统的容量
D.提高CPU访问外存储器的速度
解析:
A. 扩大主存的存储容量:Cache的目的不是为了扩大主存储器的容量,而是为了缓存主存中频繁访问的数据和指令,以减少CPU的等待时间。
B. 提高CPU访问主存数据或指令的效率:这是Cache的主要目的。通过在CPU和主存之间设置多级Cache,CPU可以更快地访问到最近或最频繁使用的数据和指令,因为Cache的访问速度远高于主存储器。
C. 扩大存储系统的容量:Cache的设计并非为了扩大整个存储系统的容量,而是为了优化访问速度和效率。
D. 提高CPU访问外存储器的速度:虽然Cache可以间接影响到CPU访问外存储器(如硬盘或SSD)的速度,因为经常访问的数据可以被缓存在主存或Cache中,减少了对外存的访问需求。然而,Cache的直接目的是提高访问主存中的数据和指令的效率,而不是直接提高对外存储器的访问速度。
因此,正确的答案是 B. 提高CPU访问主存数据或指令的效率。这反映了Cache在计算机存储层次结构中的作用,即为CPU提供快速访问内存中数据和指令的途径,从而提高整个系统的性能。
🔎2.Cache的地址映像方法
🦋2.1 概念
🦋2.2 练习
1、Cache的地址映像方式中,发生块冲突次数最小的是( )。(2015年上半年)
A.全相联映像
B.组相联映像
C.直接映像
D.无法确定
解析:
Cache的地址映射方式主要有三种:直接映射、组相联映射(又称为n路组相联映射)、全相联映射。它们在处理块冲突(即两个或多个内存地址需要映射到同一Cache行的情况)的能力上有所不同。
A. 全相联映像:在全相联映射方式中,任何一个内存块都可以被映射到Cache中的任何位置。这种映射方式提供了最大的灵活性,从理论上讲,它能最小化块冲突的发生,因为它不受固定位置的限制。但是,全相联映射的实现成本较高,因为它要求更复杂的硬件来检索和定位数据。
B. 组相联映像:组相联映射是直接映射和全相联映射的折中方案,它将Cache分为多个组,每个组包含多行。一个内存块可以映射到一个组内的任何行,但只能是这个组。组相联映射通过增加灵活性减少了块冲突的可能性,但仍然不如全相联映射灵活。
C. 直接映像:直接映射方式下,每个内存块只能映射到Cache的一个特定位置。这种方式实现简单,成本低,但容易发生块冲突,尤其是当两个经常访问的内存块映射到同一个Cache行时。
D. 无法确定:根据以上分析,可以确定最小化块冲突次数的映射方式。
因此,正确答案是 A. 全相联映像。全相联映射因其提供的最大灵活性,在理论上发生块冲突的次数最小,但这种灵活性是以较高的实现成本为代价的。
🔎3.Cache替换算法
🦋3.1 概念
Cache替换算法是一种决定在缓存空间有限的情况下哪些数据被保留、哪些数据被替换的方法。在处理器的Cache或其他缓存系统中,当新的数据需要被载入Cache,但Cache已满时,替换算法就会被用来选择被替换的数据块。几种常见的Cache替换算法包括:
-
最近最少使用(LRU,Least Recently Used):
- LRU算法会淘汰最长时间未被访问的数据块。它基于这样的假设:最近未被访问的数据在将来也不太可能被访问。
- 实现起来相对复杂,需要跟踪每个数据块自上次访问以来的时间。
-
先进先出(FIFO,First In First Out):
- FIFO算法按照数据块进入Cache的顺序进行淘汰,最早进入的数据块将最先被替换。
- 实现简单,但可能会淘汰最近才载入并可能再次被访问的数据。
-
随机替换(Random):
- 如其名,随机替换算法随机选择一个数据块进行替换。
- 实现简单,但可能会移除频繁使用的数据块。
-
最不经常使用(LFU,Least Frequently Used):
- LFU算法淘汰访问频次最少的数据块。
- 能有效地保留经常访问的数据,但实现复杂,且对历史访问模式过于敏感。
-
最近不经常使用(NMRU,Not Most Recently Used):
- 从最近未被访问的数据块中随机选择一个进行替换。
- 是一种介于LRU和随机替换之间的折衷方法。
-
时钟(Clock)或最近未用(NRU,Not Recently Used):
- 在LRU的基础上简化实现。数据块在Cache中以循环队列(类似时钟)的形式排列,有一个指针指向最老的数据块。如果这个数据块最近未被访问,则替换它;否则,保留它并将指针移至下一个数据块。
选择合适的替换算法取决于多种因素,如应用场景、Cache的大小、硬件限制和预期的访问模式等。理想的Cache替换策略应该尽量减少缓存未命中(cache misses)的情况,从而提高整体系统性能。
🦋3.2 练习
1、Cache的替换算法中,( )算法计数器位数多,实现困难。
A.FIFO
B. LFU
C. LRU
D. RAND
解析:
在Cache的替换算法中,**B. LFU(Least Frequently Used,最不经常使用)**算法的实现相对困难,原因在于它需要维护一个计数器来记录每个数据块被访问的频率。与其他替换策略相比,LFU需要更多的计数器位数来准确记录访问频次,并据此做出替换决策。
A. FIFO(First In First Out,先进先出):
- FIFO算法根据数据块进入Cache的顺序进行替换,实现相对简单。它不需要跟踪每个数据块的使用频率或最近使用情况,因此不涉及复杂的计数器或标记。
B. LFU(Least Frequently Used,最不经常使用):
- LFU算法通过记录每个数据块的访问频次来决定哪个数据块被替换。它需要为每个数据块维护一个计数器,并在每次访问时更新这些计数器。随着时间的推移,这些计数器的位数可能需要增加以记录较高的频次,这使得LFU的实现相对困难且开销较大。
C. LRU(Least Recently Used,最近最少使用):
- LRU算法淘汰最长时间未被访问的数据块。尽管它比FIFO和随机替换要复杂,需要跟踪数据块的访问顺序,但与LFU相比,LRU通常不需要记录每个数据块的访问频次,因此实现起来较为简便。
D. RAND(Random,随机):
- 随机替换算法通过随机选择一个数据块来进行替换,实现非常简单,不需要计数器或跟踪数据块的访问模式。
因此,正确答案是 B. LFU,因为它需要为每个数据块维护一个用于记录访问频次的计数器,这不仅增加了实现的复杂度,还需要更多的位数来准确记录这些信息。
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”
- 点赞
- 收藏
- 关注作者
评论(0)