计算机组成原理第4章-(Cache)【下】

高速缓冲存储器

我们首先要搞清楚,为什么要引入高速缓冲存储器呢?

首先,在多体并行存储系统中,I/O设备对于主存的使用权大于CPU对于主存的使用权,这也就造

成了CPU可能在一段时间内不能使用主存,从而浪费CPU资源。

其次,主存速度永远跟不上CPU的速度,因此可以说主存是遏制cpu高速计算的“罪魁祸首”。

为此,我们需要在CPU->主存之间引入高速缓冲存储器【Cache】来解决上述问题。

Cache的工作原理

块的基本概念

主存由2^{n}个“可编址”的“”组成,每个字有唯一的n位地址。

为了与Cache映射,将主存和Cache都分成若干块,每块又包含若干字,并且块大小相同。(块大

小就是块内字数)。

同时我们将主存的地址分成两段:

高m位表示主存的块地址低b位表示块内地址

2^{m} = M表示主存的块数(从第0块->2^{m-1}块共2^{m})。

同时,我们还将Cache的地址也分成两段:

高c位表示缓存的块号,低b位表示块内字数,即C = 2^{c}表示缓存块数。

而主存与缓存地址中都用b位表示其块内字数,即B = 2^{b}反映了块的大小,称B为块长。

CPU与Cache工作原理

任何时刻都有一些主存块处在缓存块中。

CPU欲读取主存某字时,有两种可能,一种是所需要的字已在缓存中,即可直接访问Cache(CPU

与Cache之间通常每次传送一个字的数据),这种可能被叫做“CPU访问命中”。

另一种可能是,当所需要的字不在Cache中,需要先将需要的字从主存一次调入Cache中(Cache

与主存之间是字块传送,即一次传送一个字块的数据),这种可能被叫做:“CPU访问未命中”。

一旦主存块成功调入进缓存中,那么就称该主存块与缓存块建立了对应关系

附加

值得注意的是,由于缓存块块数C远小于主存块块数M,因此一个缓存块不能唯一地”、“永久地”只

对应一个主存块,因此还需要在缓存块中设置一个标记,用来区分当前存放的是哪一个主存块。

当CPU读信息时,要将主存地址的高m位(或m位中的一部分)与缓存块的标记进行比较,以判

断所读信息是否在缓存中。

Cache效率衡量标准

因为Cache的容量与块长是影响Cache效率的重要因素。

因此,我们给出一种衡量Cache效率的名词:“命中率”。

命中率是指CPU要访问的信息是否已在Cache内比率

我们假设N_{c}访问Cache总命中次数N_{m}访问Cache总次数,则命中率h为:

h = N_{c} / N_{c} + N_{m}

Cache-主存地址映射【极其重要

将主存地址映射到Cache地址称为地址映射

而地址映射的方式有三种:“直接映射”、“全相连映射”、“组相连映射”。

直接映射

下图给出了直接映射的对应关系:

图中每个主存块只与一个缓存块相对应,映射关系式为:

i = j mod C,其中i为缓存块号,j为主存块号,C为缓存块数。

直接映射的工作过程

主存地址的高m位被分成了两部分,低c位表示的是Cache的字块地址高t位表示主存字块标记

当缓存接收到CPU送来的主存地址后,只需根据中间c位字段(假蛇为00...1)找到Cache字块1

然后根于缓存字块1的标记是否与主存地址的高t位是否相符来判断,若符合则表示已建立对应关

系。

优点

直接映射的优点是:实现简单,只需利用主存地址的某些位直接判断,即可确定所需字块是否在缓

存中。

缺点

直接映射的缺点是:不够灵活,因为每个主存块只能固定地对应某个缓存块,即使缓存内还空着许

多位置也不能占用吗,使缓存的存储空间得不到充分的利用。

全相连映射

全相连映射允许主存中每一字段映射到Cache的任意位置上。

这种方式可以从已被占满的Cache中替换出任一旧字块。

优点

全相连映射的优点是:方式灵活,命中率更高,块冲突率更小

缺点

成本较高,时间较慢

全相连映射的主存字块标记从t位增加到t+c位,并且访问Cache时,主存字块标记需要和Cache的

全部“标记”位进行比较,才能判断吹所访问主存地址是否已在Cache内。

组相连映射

组相连映射是直接映射和全相连映射的一种折中。

它把Cache分为Q组,每组有R块,并有以下关系:

i = j mod Q,i是缓存的组号,j是主存的块号,Q是组数。

组相连映射的工作过程

2^{c}表示Cache的总块数,2^{q}表示Cache的分组个数,2^{r}表示组内包含的块数。

我们假设c = 5,q = 4,那么r = c - q = 1。

其实际含义为:“Cache共有32个字块,共分成了16组,每组有2个字块。

组内有2块的被称为:“二路组相连映射”,组内有4块的被称为:“四路组相连映射”。

此时我们注意到,主存的第j块会映射到Cache的第i组,两者之间一一对应,这体现了直接映射关

系。

另外,主存的第j块可以映射到Cache的第i组中任意一块,这又体现出全相连映射关系。

那么,我们可以得出一个结论:“当r=0时,是直接映射方式。当r=c时,是全相连映射方式。

例题

在这里,我们给出几道例题。

1.假设主存容量为512KB,Cache容量为4KB,每个字块为16个字,每个字32位。

(1):Cache地址有几位?可容纳多少块?

(2):主存地址有几位,可容纳多少块?

(3):在直接映射方式下,主存的第几块映射到Cache中的第5块(设起始字块为第1块)。

(4):画出直接映射方式下主存地址字段中各段的位数。

答:

(1):Cache容量4KB可以得到Cache存储单元个数为:2^{12}个。

即Cache地址就有12位。

每个字块16个字,每个字32位,那么Cache共可以容纳的块数为:

2^{12} / 32 / 16 = 2^{6}块。【2^{12}/32表示:“容量/每字位数=字数”】

(2):主存容量为512KB可以得到主存的存储单元个数为:2^{19}个。

即主存地址就有19位。

每个字块16个字,每个字32位,那么主存共可以容纳的块数为:

2^{19}  / 32 /16 = 2^{13}块。

(3):列数学式子:

N % 2^{6} == 5,解得:N = 5 +64n,N <= 2^{19}

故第5、64+5....块可以映射到Cache的第5块。

(4):

b = 每块的字节数,因此b = 6位(2^{6})。

c = Cache字块地址,Cache共2^{6}块,因此c = 6位。

t = 总长度-b-t,总长度为主存的容量,因此,t = 19 - 6 - 6 = 7位。

2.假设主存容量为512K * 16位,Cache容量为4096 * 16位,块长为4个16位的字,访存地址为字地

址。

(1):在直接映射方式下,设计主存的地址格式。

(2):在全相连映射方式下,设计主存的地址格式。

(3):在二路组相连映射方式下,设计主存的地址格式。

(4):若主存容量为512K * 32位,块长不变,在四路组相连映射方式下,设计主存的地址格式。

答:

(1):主存容量512K,则主存总长度为2^{19},即19位。

Cache容量4096,则Cache长度为2^{12},即12位。

同时块长为4,即b = 2(2^{2})。

c = Cache容量 / 位数 = 4096 / 4 = 2^{10},则c = 10位。

t = 19 - 10 - 2 = 7。


(2):m = n - b = 19 - 2 = 17

(3):因为是二路组相连,则每组有两块,因此r = 1

同时,可以得到Cache共分:

Cache块数 / 2 = Q(组数),Q= 9。

q = Q = 9

s = t + r或者(s = N - q - b) = 8。

(4):主存改为512K * 32位,那么主存共2^{20}位,即主存长度为20位。

又因为是四路组相连映射,因此

Q = 1024 / 4 = 2^{8}

r = 2

q = Q = 8

s = N - q - b = 20 - 8 - 2 = 10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/293652.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

045.Python包和模块_初识包和模块

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

【工具使用-有道云笔记】如何在有道云笔记中插入目录

一&#xff0c;简介 本文主要介绍如何在有道云笔记中插入目录&#xff0c;方便后续笔记的查看&#xff0c;供参考。 二&#xff0c;具体步骤 分为两个步骤&#xff1a;1&#xff0c;设置标题格式&#xff1b;2&#xff0c;插入标题。非常简单~ 2.1 设置标题格式 鼠标停在标…

解决PyCharm打开出现Cannot load settings from file错误

解决PyCharm打开出现Cannot load settings from file错误 背景 pycharm打开过的项目&#xff0c;关闭项目或者IDE后再次打开&#xff0c;右下角会出现cannot load settings from file&#xff0c;如图1所示。 图1 随后&#xff0c;我浏览许多国内外的论坛&#xff0c;帖子&…

linux中playbook的控制语句

本章主要介绍 playbook中的控制语句。 使用 when 判断语句 block-rescue判断 循环语句 一个play中可以包含多个task&#xff0c;如果不想所有的task全部执行&#xff0c;可以设置只有满足某个 条件才执行这个task&#xff0c;不满足条件则不执行此task。本章主要讲解when 和 …

web前端html笔记2

新增状态标签<meter><progress> <meter> 属性 值 描述 high 数值 规定高值 low 数值 规定低值 max 数值 规定最大值 min 数值 规定最小值 optimum 数值 规定最优值 value 数值 规定当前值 <body> <meter high"50" …

三个月真的可以学会自动化测试吗?不是骗局把?

三个月可以学会&#xff0c;但是想要达到精通还需更多的时间。 目前行业内对于自动化测试的还是存在很多误区的&#xff0c;管理层为了自动化而去自动化&#xff0c;学习者学到最后只会用一些工具。 关于学习路线&#xff0c;我放在后面讲&#xff0c;在此之前必须先聊一下行…

Jmeter多种定时器实现方法解析

1、固定定时器&#xff08;Constant Timer&#xff09; 用法(场景)&#xff1a;更真实的模拟用户场景&#xff0c;需要设置等待时间&#xff0c;或是等待上一个请求的时间才执行&#xff0c;给 sampler 之间的思考时间 备注&#xff1a;如果需要每个步骤均延迟&#xff0c;则…

Postman报:400 Bad Request

● 使用Postman发送Post请求报400&#xff0c;入参为JSON&#xff1b; 二、分析 1、Postman请求并没有请求到后台Api&#xff08;由于语法错误&#xff0c;服务器无法理解请求&#xff09;&#xff1b; 2、入参出错范围&#xff1a;cookie、header、body、form-data、x-www-f…

OpenCV-Python(18):图像梯度

目录 背景介绍及应用 学习目标 原理 Sobel算子和Scharr算子 Laplacian 算子 代码示例 重要提醒 背景介绍及应用 图像的梯度是指图像中每个像素点的强度变化情况。计算图像的梯度可以帮助我们了解图像中物体的边界和纹理等信息。梯度在计算机视觉和图像处理领域有着广泛…

Android开发——添加图片

1、首先选择一张需要的图片&#xff0c;通过左侧的Resource Manage选择“”并选择Import Drawables 选择一张图片 并调整以下两个内容 这两个内容的作用借用谷歌官方的Android开发教程的内容&#xff1a; *Android 设备具有不同的屏幕尺寸&#xff08;手机、平板电脑和电视等…

Keil5软件仿真 定时器互补通道 波形输出(Logic Analyzer)

步骤一&#xff1a;管脚配置确认。 ①配置定时器的管脚模式为复用推挽输出模式&#xff08;GPIO_MODE_AF_PP&#xff09;&#xff01;&#xff01;&#xff01;&#xff0c;注意&#xff1a;复用开漏模式软件仿真时无波形。 步骤二&#xff1a;编译程序。 ①点击编译按钮。 …

java: -source 7 中不支持 lambda 表达式 (请使用 -source 8 或更高版本以启用 lambda 表达式)

目录 1、检查项目中 JDK 的设置&#xff1a; 2、检查模块中 JDK 的设置&#xff1a; 3、检查Idea 中的SDK设置 4、检查 IDEA 中 JDK 的设置&#xff08;我出现的问题在这&#xff09;&#xff1a; 今天遇见了一个报错&#xff1a; 问题产生的原因是 JDK 版本太低&#xf…