首页 > 其他分享 >第三章-(六)高速缓冲存储器(Cache)

第三章-(六)高速缓冲存储器(Cache)

时间:2024-09-23 09:52:21浏览次数:3  
标签:主存 第三章 Cache 访问 命中 局部性 CPU 高速缓冲存储器

1.Cache基本原理基本概念

1.1程序访问的局部性原理

空间局部性:在最近的未来要用到的信息(指令和数据),很可能与现在正在使用的信息在存储空间上是邻近的

时间局部性:在最近的未来要用到的信息,很可能是现在正在使用的信息

基于局部性原理,不难想到,可 以把CPU目前访问的地址“周围” 的部分数据放到Cache中(使下次访问的速度更快)

1.2.性能分析

设tc为访问一次Cache所需时间,tm为访问一次主存所需时间

命中率H:CPU欲访问的信息已在Cache中的比率

1.先访问Cache,若Cache未命中再访问主存

Cache—主存系统的平均访问时间t为:

2.同时访问Cache和主存,若Cache命中则立即停止访问主存

 

 例题:

当Cache与主存一一对应时,就会出现Cache被占满的现象

 

有待解决的问题

• 如何区分Cache与 主存的数据块对应关系? ——Cache和主存的映射方式

• Cache很小,主存很大。如果Cache满了怎么办? ——替换算法

• CPU修改了Cache中的数据副本,如何确保主存中数据母本的一致性? ——Cache写策略

1.3 Cache的基本工作原理

Cache通常集成在CPU中,在CPU和主存之间设置Cache,把主存中被频繁访问的地址信息所在块调入Cache,CPU就可以在Cache中更快地访问到这个块内的信息。

考虑到局部性原理,假设我们以内存中64B作为一个块,当访问这个块的某个地址时就把它写入Cache。具体对应关系如下:

主存块大小=cache块大小

Cache的 “块” 也可称 “行”。

关于命中率和缺失率问题主要有两个要点:

  1. 是否为cache和主存同时访问。
  2. A[x]=A[x]+32。这个操作涉及读和写操作各一次,计算命中率时需注意。 

 2.Cache和主存的映射方式

 2.1总览

2.2全相邻映射

储存方式:主存块可以放在Cache的任意位置

如何区分Cache中存 放的是哪个主存块?

给每个Cache块增加一 个“标记”,记录对应的主存块号。

有“标记”就够了?—不行因为,如果存的是985则后面有五位的自动为0,而主存不是0号为对应的后五位的Cache中,所以为了避免歧义就加上有效位,有效的表示1,无效的表示0.

 

 因为Cache快对应主存块的大小相等,故要2的28次除以2的6次,块号如上,块内地址如上。

CPU 访问主存地址1…1101001110(判断步骤):

  1. 主存地址的前22位
  2. 对比Cache中所有块的标记,若标记匹配且有效位=1,则Cache命中,访问块内地址为001110 的单元。
  3. 若未命中或有效位=0,则正常访问主存

2.3直接映射(只能放固定位置)

储存方式:直接映射,主存块在Cache中的位置=主存块号%Cache总块数

在存储的时候有被覆盖的缺点。

因为主存块号%2的3次 , 相当于留下最后三位二进制数,故直接在Cache后面对应,三位

 故储存地址的方式:

CPU 访问主存地址0…01000 001110(检查步骤)

  1. 根据主存块号的后3位确定Cache行
  2. 若主存块号的前19位与Cache标记匹配且有效位=1,则Cache命中,访问块内地址为 001110的单元。
  3. 若未命中或有效位=0,则正常访问主存

2.3组相邻映射

存储方式:组相联映射,所属分组=主存块号%分组数

因为主存块号%22 ,相当于留下最后两位相当于留下最后两位位二进制数,故直接在Cache后面对应,两位

CPU 访问主存地址1…1101001110

①根据主存块号的后2位确定所属分组号

②若主存块号的前20位与分组内的某个标记匹配且有效位=1,则Cache命中,访问块内地址为 001110的单元。

③若未命中或有效位=0,则正常访问主存

2.4三种方式的优缺点

 

3.Cache中主存块的替换算法

3.1知识点总览

3.2随机算法(RAND) 

 特点:随机算法——实现简单,但完全没考虑局部性原理,命中率低,实际效果很不稳定

3.3先进先出算法(FIFO)

先进先出算法——实现简单,最开始按#0#1#2#3放入Cache,之后轮流替换 #0#1#2#3 FIFO依然没考虑局部性原理,最先被调入Cache的块也有可能是被频繁访问的

抖动现象: 频繁的换入换出现象(刚被替换的块很快又被调入)

3.4近期最少使用算法(LRU)

说明:LRU算法——基于“局部性原理” ,近期被访问过的主存块,在不久的将来也很有可能被再次访问,因此淘汰最久没被访问过的块是合理的。LRU算法的实际运行效果优秀,Cache命中率高。 若被频繁访问的主存块数量 > Cache行的数量,则有可能发生“抖动”{1,2,3,4,5,1,2,3,4,5,1,2…}

3.5最不经常使用算法(LFU)

此处优先淘汰行号更小的

LFU算法——曾经被经常访问的主存块在未来不一定会用到(如:微信视频聊天相关的块), 并没有很好地遵循局部性原理,因此实际运行效果不如 LRU 

4.Cache写策略

4.1总览

为何不讨论读命中、读不命中的情况? 读操作不会导致Cache和主存的数据不一致

4.2写命中

写回法(write-back) —— 当CPU对Cache写命中时,只修改Cache的内容,而不立即写入主存只有当此块被换出时才写回主存 

减少了访存次数,但存在数据不一致的隐患。-为此引入脏位来表示是否被修改过。

4.3全写法

 

全写法(写直通法,write-through) —— 当CPU对Cache写命中时,必须把数据同时写入Cache

和主存,一般使用写缓冲(write buffer):为了使CPU使用更高效

使用写缓冲,CPU写的速度很快,若写操作不频繁,则效果很好。若写操作很频繁,可能会因为写缓冲饱和而发生阻塞

4.4写不命中

写分配法(write-allocate)——当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache

中修改。通常搭配写回法使用。主存不动,只是修改了Cache中的副本。

非写分配法(not-write-allocate)——当CPU对Cache写不命中时只写入主存,不调入Cache。 搭配全写法使用。(只写主存,不调用Cache)

多级Cache

 

 

标签:主存,第三章,Cache,访问,命中,局部性,CPU,高速缓冲存储器
From: https://blog.csdn.net/2203_75970230/article/details/142446761

相关文章

  • 数据结构--第三章 栈和队列
    注:根据严蔚敏等人的数据结构(C语言版)(第二版)记录,用于自己的复习记录。栈栈是限定仅在表尾进行插入和删除的线性表。表尾端称为栈顶,表头端称为栈底。不含元素的空表称为空栈。栈是后进先出的线性表。一、顺序栈的表示和实现顺序栈指的是利用顺序存储结构实现的栈,即利用一组连......
  • [20240920]跟踪library cache lock library cache pin使用gdb.txt
    [20240920]跟踪librarycachelocklibrarycachepin使用gdb.txt--//前一阵子,写的使用gdb跟踪librarycachelocklibrarycachepin的脚本有一个小问题,无法获得lockaddress以及pinaddress--//地址,有一点点小缺陷,尝试修改完善看看。--//按照https://nenadnoveljic.com/blog/tr......
  • 了解 React Cache 功能
    随着react生态系统的不断扩大,优化数据获取的更强大的工具之一就是缓存功能。此内置功能允许您执行许多操作,例如有效管理和存储服务器数据、减少冗余网络请求以及提高整体应用程序性能。在本文中,我们将了解react中的缓存功能、它的好处以及如何使用它。什么是react缓存功......
  • Spring Cache的使用
    一、简介1.SpringCache是Spring提供的一个缓存框架,在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中,在4.1开始,缓存已支持JSR-107注释和更多自定义的选项。1.SpringCache利用了**AOP**,实现了基于注解的缓存功能,并且进行了合理的抽象,业务代码不用关心底层是使用......
  • php8:开启opcache和JIT(php 8.3.9)
    一,配置文件中的项:opcache.enable=1opcache.enable_cli=0opcache.memory_consumption=128opcache.max_accelerated_files=10000opcache.revalidate_freq=240opcache.save_comments=0opcache.error_log=/data/logs/phplogs/opache_error.logopcache.enable=1    #......
  • 从0开始的stm32单片机学习之旅 第三章
    查看原理图(以最小系统原理图为例)1通过看引脚名称来判断电路是属于哪个功能的1.1电源管脚:引脚图中的VDD、VSS、VREF+、VREF-、VSSA、VDDA等都属于电源引脚。VDD:VDD是单片机的正电源引脚,用于提供单片机的工作电压。它通常连接到电源供应器的正极。VSS:VSS是单片机的地(GN......
  • spring @cacheable 注解使用spel表达式
    这里主要讲一下复杂的spel表达式,简单的不写了解析集合集合需要先自定义一个方法,比如getAuthorsName,然后在注解里通过root.target.getAuthorsName把方法引用进去publicclassBookService{publicStringgetAuthorsName(List<Author>authors){returnauthors.s......
  • 易优eyoucms网站Fatal error: Class '\think\cache\driver\File' not found
     根据提供的错误信息 Class'\think\cache\driver\File'notfound,这个错误表明PHP无法找到类 \think\cache\driver\File。这通常是因为类文件未被正确加载或命名空间配置不正确导致的。以下是一些可能的解决步骤:1.确认类文件路径确保类文件 File.php 的路径正确并且......
  • 第三章 Smart X超融合测试历程第三天
    系列文章目录第一章SmartX超融合测试历程第一天第二章SmartX超融合测试历程第二天第三章SmartX超融合测试历程第三天目录系列文章目录一、测试虚机在线迁移二、测试虚机克隆1.测试克隆一台虚机结果2,测试克隆10台虚拟机的结果三、模拟主机故障测试结果(一台主机......
  • 第三章 实用类介绍(一)
    第三章实用类介绍(一)文章目录第三章实用类介绍(一)一、枚举二、包装类三、Math类一、枚举枚举指由一组固定的常量组成的类型使用enum进行定义publicenum枚举名词{值1,值2}二、包装类每个基本类型在java.lang包中都有一个相应的包装类数据类型转换ne......