高速缓冲存储器的功能、结构与工作原理


2.3 高速缓冲存储器(Cache)

  2.3.1 高速缓冲存储器的功能、结构与工作原理

  高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。 Cache的功能是用来存放那些近期需要运行的指令与数据。目的是提高CPU对存储器的访问速度。为此需要解决2个技术问题:一是主存地址与缓存地址的映象及转换; 二是按一定原则对Cache的内容进行替换。
  Cache的结构和工作原理如图2.3.1所示。

007.gif

  主要由三大部分组成:
  Cache存储体:存放由主存调入的指令与数据块。
  地址转换部件:建立目录表以实现主存地址到缓存地址的转换。
  替换部件:在缓存已满时按一定策略进行数据块替换,并修改地址转换部件。

  2.3.2 地址映象与转换

  地址映象是指某一数据在内存中的地址与在缓冲中的地址,两者之间的对应关系。下面介绍三种地址映象的方式。

  1.全相联方式

  地址映象规则:主存的任意一块可以映象到Cache中的任意一块
  (1) 主存与缓存分成相同大小的数据块。
  (2) 主存的某一数据块可以装入缓存的任意一块空间中。
  全相联方式的对应关系如图2.3.2所示。如果Cache的块数为Cb,主存的块数为Mb,则映象关系共有Cb×Mb种。

008.gif

  图2.3.3示出了目录表的格式及地址变换规则。 目录表存放在相关(联)存储器中,其中包括三部分:数据块在主存的块地址、存入缓存后的块地址、及有效位(也称装入位)。由于是全相联方式,因此,目录表的容量应当与缓存的块数相同。

010.gif

  举例:某机主存容量为1M,Cache的容量为32KB, 每块的大小为16个字(或字节)。 划出主、缓存的地址格式、 目录表格式及其容量。
  009.gif
  容量:与缓冲块数量相同即211=2048(或32K/16=2048)。  优点:命中率比较高,Cache存储空间利用率高。
  缺点:访问相关存储器时,每次都要与全部内容比较,速度低,成本高,因而应用少。

  2.直接相联方式

  地址映象规则: 主存储器中一块只能映象到Cache的一个特定的块中。
  (1) 主存与缓存分成相同大小的数据块。
  (2) 主存容量应是缓存容量的整数倍,将主存空间按缓存的容量分成区,主存中每一区的块数与缓存的总块数相等。
  (3) 主存中某区的一块存入缓存时只能存入缓存中块号相同的位置。
  图2.3.4示出了直接相联映象规则。 可见,主存中各区内相同块号的数据块都可以分别调入缓存中块号相同的地址中,但同时只能有一个区的块存入缓存。由于主、缓存块号相同,因此,目录登记时,只记录调入块的区号即可。

011.gif

  图2.3.5示出了主、 缓冲地址格式、目录表的格式及地址变换规则。主、缓存块号及块内地址两个字段完全相同。目录表存放在高速小容量存储器中,其中包括二部分:数据块在主存的区号和有效位。目录表的容量与缓存的块数相同。

012.gif

  地址变换过程:用主存地址中的块号B去访问目录存储器, 把读出来的区号与主存地址中的区号E进行比较, 比较结果相等,有效位为1,则Cache命中,可以直接用块号及块内地址组成的缓冲地址到缓存中取数;比较结果不相等,有效位为1, 可以进行替换,如果有效位为0,可以直接调入所需块。
  优点:地址映象方式简单,数据访问时,只需检查区号是否相等即可,因而可以得到比较快的访问速度,硬件设备简单。
  缺点:替换操作频繁,命中率比较低。
  举例:上例中,主存容量为1M, Cache的容量为32KB,每块的大小为16个字(或字节)。划出主、缓存的地址格式、目录表格式及其容量。
  013.gif
  容量:与缓冲块数量相同即211=2048(或32K/16=2048)。

  3.组相联映象方式

  组相联的映象规则:
  (1) 主存和Cache按同样大小划分成块。
  (2) 主存和Cache按同样大小划分成组。
  (3) 主存容量是缓存容量的整数倍,将主存空间按缓冲区的大小分成区,主存中每一区的组数与缓存的组数相同。
  (4) 当主存的数据调入缓存时,主存与缓存的组号应相等,也就是各区中的某一块只能存入缓存的同组号的空间内,但组内各块地址之间则可以任意存放, 即从主存的组到Cache的组之间采用直接映象方式;在两个对应的组内部采用全相联映象方式。
  图2.3.6示出了组相联的映象关系, 图中缓存共分Cg个组,每组包含有Gb块; 主存是缓存的Me倍,所以共分有Me个区, 每个区有Cg组,每组有Gb块。那么, 主存地址格式中应包含4个字段:区号、区内组号、组内块号和块内地址。 而缓存中包含3个字段:组号、组内块号、块内地址。主存地址与缓存地址的转换有两部分,组地址是按直接映象方式,按地址进行访问,而块地址是采用全相联方式,按内容访问。组相联的地址转换部件也是采用相关存储器实现,见图2.3.7。
  相关存储器中每个单元包含有: 主存地址中的区号E与组内块号B,两者结合在一起,其对应的字段是缓存块地址b。相关存储器的容量,应与缓存的块数相同。当进行数据访问时,先根据组号,在目录表中找到该组所包含的各块的目录,然后将被访数据的主存区号与组内块号,与本组内各块的目录同时进行比较。如果比较相等,而且有效位为“1”则命中。

014.gif

015.gif

   可将其对应的缓存块地址b送到缓存地址寄存器的块地址字段,与组号及块内地址组装即形成缓存地址。如果比较不相等,说明没命中,所访问的数据块尚没有进入缓存,则进行组内替换;如果有效位为0,则说明缓存的该块尚未利用, 或是原来数据作废,可重新调入新块。
  优点:块的冲突概率比较低,块的利用率大幅度提高,块失效率明显降低。
  缺点:实现难度和造价要比直接映象方式高。

  2.3.3 替换策略

  根据程序局部性规律可知:程序在运行中,总是频繁地使用那些最近被使用过的指令和数据。这就提供了替换策略的理论依据。综合命中率、实现的难易及速度的快慢各种因素,替换策略可有随机法、先进先出法、最近最少使用法等。

  1.随机法(RAND法)

  随机法是随机地确定替换的存储块。设置一个随机数产生器,依据所产生的随机数,确定替换块。这种方法简单、易于实现,但命中率比较低。

  2.先进先出法(FIFO法)

  先进先出法是选择那个最先调入的那个块进行替换。当最先调入并被多次命中的块,很可能被优先替换,因而不符合局部性规律。这种方法的命中率比随机法好些,但还不满足要求。先进先出方法易于实现,例如Solar-16/65机Cache采用组相联方式,每组4块,每块都设定一个两位的计数器,当某块被装入或被替换时该块的计数器清为0,而同组的其它各块的计数器均加1,当需要替换时就选择计数值最大的块被替换掉。

  3.最近最少使用法(LRU法)

  LRU法是依据各块使用的情况, 总是选择那个最近最少使用的块被替换。这种方法比较好地反映了程序局部性规律。
  实现LRU策略的方法有多种。 下面简单介绍计数器法、寄存器栈法及硬件逻辑比较对法的设计思路。
  计数器方法:缓存的每一块都设置一个计数器,计数器的操作规则是:
  (1) 被调入或者被替换的块, 其计数器清“0”,而其它的计数器则加“1”。
  (2) 当访问命中时,所有块的计数值与命中块的计数值要进行比较,如果计数值小于命中块的计数值, 则该块的计数值加“1”;如果块的计数值大于命中块的计数值,则数值不变。最后将命中块的计数器清为0。
  (3) 需要替换时,则选择计数值最大的块被替换。
  例如IBM 370/65机的Cache用组相联方式,每组4块,每一块设置一个2位的计数器,其工作状态如表2.3.1。

表2.3.1 计数器法实现LRU策略

主存块地址
块4
块2
块3
块5
块号
计数器
块号
计数器
块号
计数器
块号
计数器
Cache块0
1
10
1
11
1
11
5
00
Cache块1
3
01
3
10
3
00
3
01
Cache块2
4
00
4
01
4
10
4
11
Cache块3
XX
2
00
2
01
2
10
操作
起始状态
调入
命中
替换

  寄存器栈法:设置一个寄存器栈, 其容量为Cache中替换时参与选择的块数。如在组相联方式中,则是同组内的块数。堆栈由栈顶到栈底依次记录主存数据存入缓存的块号, 现以一组内4块为例说明其工作情况,如表2.3.2所示,表中1~4为缓存中的一组的4个块号。

表2.3.2 寄存器栈法实现

缓存操作
初始状态
调入2
命中块4
替换块1
寄存器0
3
2
4
1
寄存器1
4
3
2
4
寄存器2
1
4
3
2
寄存器3
1
1
3

  (1) 当缓存中尚有空闲时,如果不命中,则可直接调入数据块,并将新访问的缓冲块号压入堆栈,位于栈顶。其他栈内各单元依次由顶向下顺压一个单元,直到空闲单元为止。
  (2) 当缓存已满,如果数据访问命中,则将访问的缓存块号压入堆栈,其他各单元内容由顶向底逐次下压直到被命中块号的原来位置为止。如果访问不命中,说明需要替换,此时栈底单元中的块号即是最久没有被使用的。所以将新访问块号压入堆栈,栈内各单元内容依次下压直到栈底,自然,栈底所指出的块被替换。
  比较对法:比较对法是用一组硬件的逻辑电路来记录各块使用的时间与次数。
  假设Cache的每组中有4块, 替换时,是比较4块中那一块是最久没使用的,4块之间两两相比可以有6种比较关系。如果每两块之间的对比关系用一个RS触发器,则需要6个触发器(T12,T13,T14,T23,T24,T34), 设T12=0表示块1比块2最久没使用,T12=1表示块2比块1最久没有被使用。 在每次访问命中或者新调入块时,与该块有关的触发器的状态都要进行修改。 按此原理,由6个触发器组成的一组编码状态可以指出应被替换的块。例如,块1被替换的条件是:T12=0,T13=0,T14=0;块2被替换的条件是:T12=1,T23=0,T24=0等等。

  2.3.4 Cache的一致性问题

  Cache的内容是主存内容的一部分, 是主存的副本,内容应该与主存一致。由于:
  (1) CPU写Cache,没有立即写主存;
  (2) I/O处理机或I/O设备写主存。
  从而造成Cache与主存内容的不一致,如图2.3.8所示。

016.gif

  对Cache进行写操作时引起的不一致的解决方法:

  1.全写法亦称写直达法(WT法-Write through)

  方法:在对Cache进行写操作的同时,也对主存该内容进行写入。
  优点:可靠性较高,操作过程比较简单。
  缺点:写操作速度得不到改善,与写主存的速度相同。

  2.写回法(WB法-Write back)

  方法:在CPU执行写操作时,只写入Cache,不写入主存。
  优点:速度较高。
  缺点:可靠性较差,控制操作比较复杂。

  2.3.5 Cache性能分析

  1.Cache系统的加速比

  存储系统采用Cache技术的主要目的是提高存储器的访问速度,加速比是其重要的性能参数。Cache存储系统的加速比SP(Speedup)为:

017.gif

  其中:Tm为主存储器的访问周期,Tc为Cache的访问周期,T则为Cache存储系统的等效访问周期,H为命中率。
  可以看出,加速比的大小与两个因素有关:命中率H及Cache与主存访问周期的比值Tc/Tm,命中率越高加速比越大。图2.3.9示出了加速比与命中率的关系。

018.gif

  2.Cache的命中率

  影响Cache命中率的因素很多,如Cache的容量,块的大小,映象方式,替换策略以及程序执行中地址流的分布情况等等。一般地说,Cache容量越大则命中率越高, 当容量达到一定程度后,容量的增加命中率的改善并不大;Cache块容量加大, 命中率也明显增加,但增加到一定值之后反而出现命中率下降的现象;直接映象法命中率比较低,全相联方式命中率比较高,在组相联方式中,组数分得越多,则命中率下降。

转载于:https://www.cnblogs.com/freebye/archive/2005/04/08/133699.html

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

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

相关文章

spring集成RabbitMQ配置文件详解(生产者和消费者)

1&#xff0c;首先引入配置文件org.springframework.amqp&#xff0c;如下&#xff1a; <dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit</artifactId><version>1.7.1.RELEASE</version></de…

Multiverse: Revolutionary Backend for Alembic // Multiverse: 下一代Alembic后端

J CUBE&#xff0c;日本最大的动画公司Polygon Picture&#xff08;以下简称PPI&#xff09;公司成立的专职R&D公司隆重推出Multiverse&#xff0c;下一代Alembic存储后端。 我们还开发了针对Autodesk Maya的工具&#xff0c;运用Multiverse在流程中。 "multiverse&qu…

近半年能力没进步原因分析与求助

2019独角兽企业重金招聘Python工程师标准>>> 20180907 思维方式有缺陷&#xff0c;想到的解决方法经常不是最有效率的。导致工作时间内基本没自由学习的时间。 业余时间不够专注&#xff0c;学习方向经常变&#xff0c;没能坚持搞透一个点就换书看&#xff0c;没有总…

windows下安装Redis并部署成服务

文章来源&#xff1a;https://www.cnblogs.com/weiqinl/p/6490372.html windows下安装Redis并部署成服务 Redis 是一个开源&#xff08;BSD许可&#xff09;的&#xff0c;内存中的数据结构存储系统&#xff0c;它可以用作数据库、缓存和消息中间件。 一&#xff1a;下载 下载地…

.net core高性能通讯开源组件BeetleX

BeetleX beetleX是基于dotnet core实现的轻量级高性能的TCP通讯组件&#xff0c;使用方便、性能高效和安全可靠是组件设计的出发点&#xff01;开发人员可以在Beetlx组件的支持下快带地构建高性能的TCP通讯服务程序&#xff0c;在安全通讯方面只需要简单地设置一下SSL信息即可实…

按组排名

rank() over,dense_rank() over,row_number() over的区别 1.rank() over&#xff1a;查出指定条件后的进行排名。特点是&#xff0c;加入是对学生排名&#xff0c;使用这个函数&#xff0c;成绩相同的两名是并列&#xff0c;下一位同学空出所占的名次。 select name,subject,sc…

[FxCop.设计规则]13. 定义自定义属性参数的访问属性

13. 定义自定义属性参数的访问属性 翻译概述&#xff1a; 一个比较无聊的规则&#xff0c;实在看不出在什么情况下&#xff0c;一个开发者会做出违反这条规则的设计。没有别的内容&#xff0c;只是说应该为自定义特性的构造函数中的参数提供一个相关的属性去读取它们的值。…

centos7安装Cloudera Manager

第一部分&#xff1a;准备工作一&#xff0c;修改hostname $vim /etc/sysconfig/network $source /etc/sysconfig/network例如&#xff1a; NETWORKINGyes HOSTNAMEspark01reboot重启服务器 二&#xff0c;关闭selinux查看SELinux状态1&#xff0c;/usr/sbin/sestatus -v #如果…

Grove——.NET中的ORM实现

Grove——.NET中的ORM实现 发布日期&#xff1a; 6/30/2005| 更新日期&#xff1a; 6/30/2005作者&#xff1a;林学鹏 ORM的全称是Object Relational Mapping&#xff0c;即对象关系映射。它的实质就是将关系数据&#xff08;库&#xff09;中的业务数据用对象的形式表示出来&a…

[book]道法自然

前不久读了王咏刚的〈凌波微步〉和〈凌波微步II〉&#xff0c;感觉不错。今天把他老人家的《道法自然》也买了下来。在dearbook看到关于这本书的长篇大评&#xff0c;也一块copy了下来&#xff1a;http://www.dearbook.com.cn/book/viewbook.aspx?pnoTS0023954认真的作者&…

列表嵌套字典,根据字典某一key排序

在返回列表嵌套字典时候&#xff0c;往往需要对数据进行一定的处理&#xff1a;按照字典中某一个key排序 In [87]: a [{"name": "牛郎", "age": 23},{"name":"许仙", "age": 20},{"name":"董永&q…

写出C语言中5种数据类型的名称及其关键字,求C语言中的32个关键字及其意思?...

关键字如下&#xff1a;一、数据类型关键字(12个)&#xff1a;(1) char &#xff1a;声明字符型变量或函数(2) double &#xff1a;声明双精度变量或函数(3) enum &#xff1a;声明枚举类型(4) float&#xff1a;声明浮点型变量或函数(5) int&#xff1a; 声明整型变量或函数(6…

想要设计自己的微服务?看这篇文章就对了

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由我就静静地看 发表于云社区专栏 本文通过使用Spring Boot&#xff0c;Spring Cloud和Docker构建的概念验证应用程序的示例&#xff0c;为了解常见的微服务架构模式提供了一个起点。 该代码在Github上…

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒&#xff09;&#xff0c;获得表锁定的时间不算作执行时间。慢日志默认写入到参数datadir(数据目录)指定的路径下。默认文件名是[hostname]_slow.log&#xff0c;默认超时是10秒&#xff0c;默认不开…

分数相同名次排名规则C语言,如何给数据排名(相同分数相同名次)-excel篇

使用Rank函数来做数据排名该函数是返回一个数值在一个数字列表中的排名。语法&#xff1a;RANK(number,ref,order)RANK(对象,范围,参数)number(必填参数):是特定单位格中的数据&#xff0c;需要在整个数字列表中排名的单个对象。ref(必填参数):是指需要排名的整体数列。即范围&…

MySql的连接查询

若一个查询同时涉及到两个或者两个以上的表&#xff0c;则称之为连接查询。常见的包括&#xff1a;等值连接查询&#xff0c;自然连接查询&#xff0c;非等值连接查询&#xff0c;自身连接查询&#xff0c;外连接查询&#xff08;左右连接&#xff09;。 1.等值与非等值连接查询…

qt运行C语言后无显示,qt designer启动后不显示界面问题的原因与解决办法-站长资讯中心...

Qt 5.6.1无论是在vs里双击ui文件还是直接启动designer.exe都一直无法显示界面&#xff0c;但任务管理器中可以看到该进程是存在的。前几天还正常的&#xff0c;但昨天加了一块NVIDIA的显卡(机器自带核显)&#xff0c;可能与此有关。幸好还可以通过QtCreator打开ui文件进行编辑。…

OpenSolaris北京用户组的第一次活动

OpenSolaris北京用户组的第一次活动作者: BadcoffeeEmail: blog.olivergmail.comBlog: http://blog.csdn.net/yayong2005年10月10月15号&#xff0c;OpenSolaris北京用户组在北京西郊宾馆会议厅组织了成立以来的第一次活动。尽管OpenSolaris早在2005年6月14日就正式开放源代码&…

Android PermissionUtils:运行时权限工具类及申请权限的正确姿势

Android PermissionUtils&#xff1a;运行时权限工具类及申请权限的正确姿势 ifadai 关注 2017.06.16 16:22* 字数 318 阅读 3637评论 1喜欢 6PermissionUtil 经常写Android运行时权限申请代码&#xff0c;每次都是复制过来之后&#xff0c;改一下权限字符串就用&#xff0c;把…

Linux基础监控小工具nmon

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c; nmon所记录的信息是比较全面的&#xff0c;它能在系统运行过程中实时地捕捉系统资源的使用情况&#xff0c;并且能输出结果到文件中。nmon工具可以帮助在一个屏幕上显示所有重要的性能优化信息&…