计算机组成原理3.6高速缓冲存储器Cache

桃浪十七丶
• 阅读 1458

3.6.1 Cache工作的基本原理

利用程序访问的局部性原理,包括空间局部性和时间局部性。举个粒子,比如现在使用Chrome浏览器,后台还在运行网愈云音乐,之前使用了VSC和绘图,则Cache把主存中存放的Chrome和网愈云的相关数据暂存到Cache块中,VSC和绘图工具依然保留在主存中。当我需要使用VSC时,Cache又会把VSC的相关数据暂存到Cache块中提供CPU访问。

计算机组成原理3.6高速缓冲存储器Cache

3.6.2 Cache和主存的映射方式

用一个题目举粒子,假设某个计算机主存地址空间为256MB,按字节编址,,其数据Cache有8个Cache行(块),行(块)长为64B。

1)直接映射

直接映射。每一块主存块只能放入Cache块中的唯一位置。 计算机组成原理3.6高速缓冲存储器Cache Cache由“有效位”“标记位”和“Cache块”组成,主存由“块号”“主存块”组成。

这里需要先明白几个注意的点: 1、有效位初始全部置为0,有效时候为1,无效为0; 2、每一块Cache块的大小与主存块的块长应保持一致; 3、Cache块的标记应该与主存块的块号一致; 4、直接映射需要对主存块号对Cache块数进行取余操作,主存块在Cache中的位置=主存块号%Cache总块数,题目中则是,主存块号%2^3^,相当于保留了主存块号的末尾3位,Cache中的标记位为主存块号的其余几位。此时Cache块号是主存块号的末尾3位。如下图 计算机组成原理3.6高速缓冲存储器Cache 题目中主存地址空间256MB=2^28^B,Cache块长64B=2^6^,推断主存块块长也是64B,因此主存块应该有2^28^/2^6^=2^22^个,取余运算后Cache块的块号应是后3位,Cache块的标记为主存块号前22-3=19位,块内地址即为块长,主存块和Cache块有下图关系 计算机组成原理3.6高速缓冲存储器Cache 则直接映射CPU访存过程为: 将主存块号与Cache块的标记比较,若主存块的前19位与Cache块标记一致且Cache的有效为位为1,表示命中,根据标记位访问对应块内地址的数据。若不一致或者有效位为0表示未命中,则正常访问主存。

2)全相联映射

全相联映射。每一块主存块都可以转入Cache的任意位置。 计算机组成原理3.6高速缓冲存储器Cache 这里借用学习时候的讲义来说明, Cache由“有效位”“标记位”和“Cache块”组成,主存由“块号”“主存块”组成。

这里需要先明白几个注意的点: 1、有效位初始全部置为0,有效时候为1,无效为0; 2、每一块Cache块的大小与主存块的块长应保持一致; 3、Cache块的标记应该与主存块的块号一致;

这个题目中主存地址空间256MB=2^28^B,Cache块长64B=2^6^,推断主存块块长也是64B,因此主存块应该有2^28^/2^6^=2^22^个,块内地址即为块长,主存块有下图关系 计算机组成原理3.6高速缓冲存储器Cache 则全相联映射CPU访存过程为: 将主存块号与Cache块的标记比较,若一致且Cache的有效为位为1,表示命中,根据标记位访问对应块内地址的数据。若不一致或者有效位为0表示未命中,则正常访问主存。

3)组相联映射

组相联映射。主存块的数据可以放入特定Cache块组内的任意一个Cache块中,即为,组间采取直接映射,组内采取全相联映射。唯一不同点是,若题目采取2路组相联映射,那么取余运算是主存块号%分组数量,换言之,直接相联映射可以看作是1路组相联映射。本题组相联映射的主存块和Cache块关系是 计算机组成原理3.6高速缓冲存储器Cache

则组相联映射CPU访存过程为: 根据主存块号后两位确定在Cache中所属分组,若主存块号前20位与Cache块标记一致,且有效位为1,表示命中,若未名中则正常访问主存。

3.6.3 Cache中主存块的替换算法

1、随机(RAND)算法,任意访问,当需要替换时随意替换确定的Cache块。 2、先进先出(FIFO,First In First Out)算法,选择最早调入Cache的Cache块进行替换。没有依据局部性原理,最早调入的可能是最常用的数据。 3、近期最少使用(LRU,Least Recently Used)算法,选择一段时间内访问次数最少的Cache块进行替换,作为堆栈类算法它依据了局部性原理。 手算LRU,观察哪个Cache块是一段时间内使用最少的,将其替换。 机器实现LRU,为每一个Cache块设置一个计数器,记录该Cache块有多久没有被访问,初始计数器为0。命中Cache块时,对应计数器归0,比其低的计数器+1,剩余不做改变;未名中且还有空闲Cache块时,数据放入空闲Cache块且对应计数器归0,其余非空闲Cache块+1;未名中且Cache无空闲块时,将访问的数据替换到计数最大的Cache块,并且计数器归0,其余Cache块计数器+1。

3.6.4 Cache写策略

Cache设置“脏位”,初始为0,CPU对Cache写命中,脏位变为1. 1、全写法,CPU对Cache写命中时,同时把数据写入Cache和主存,,此处会增加一个用SRAM做的FIFO写缓冲来暂存写入Cache的数据,当CPU执行其他时会把写缓冲的数据写入对应的主存块。 2、写回法,CPU对Cache写命中时,只把数据写如Cache,等该Cache块要被替换时候再把数据同步到主存中。 3、写分配法,若CPU未对Cache命中,会访问主存并把数据调入Cache进行修改,适合配合写回法使用。 3、非写分配法,若CPU未对Cache命中,会直接把数据写入主存,不会把主存数据调入Cache进行修改,适合配合全写法。 现代计算机通常设置了多级Cache,多级Cache之间采用全写法和非写分配法保证数据一致,Cache和主存之间采用写回法和写分配法。 计算机组成原理3.6高速缓冲存储器Cache 不求点赞,只求评论给出批评和建议

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
添砖java的啾 添砖java的啾
2年前
distinct效率更高还是group by效率更高?
目录00结论01distinct的使用02groupby的使用03distinct和groupby原理04推荐groupby的原因00结论先说大致的结论(完整结论在文末):在语义相同,有索引的情况下groupby和distinct都能使用索引,效率相同。在语义相同,无索引的情况下:distinct效率高于groupby。原因是di
桃浪十七丶 桃浪十七丶
2年前
计算机组成原理3.7虚拟存储器
3.7.1虚拟存储器概念3.7.2页式存储器主存和Cache之间是分块映射存储,同样,利用局部性原理,也可以将主存和辅存之间进行分块映射存储。举个粒子,假如现在使用微信文字聊天,该部分程序占用大小了4KB的空间,那么可以分为大小位1KB的四块,分别映射存储到主存中。如下图,分页式存储,在这个问题中就是把程序进程逻辑上大小相等的四块页面,每个页面大小与主存块
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
2个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这