三种Cache写入方式原理简介
三种Cache写入方式原理简介
在386以上档次的微机中,为了提高系统效率,普遍采用Cache(高速缓冲存储器),现在的系统甚至可以拥有多级Cache。Cache实际上是位于CPU与DRAM主存储器之间少量超高速的静态存储器(SRAM),通常的大小为8KB~512KB。
对Cache的工作原理可以进行如下描述:具有Cache的计算机,当CPU需要进行存储器存取时,首先检查所需数据是否在Cache中。如果存在,则可以直接存取其中的数据而不必插入任何等待状态,这是最佳情况,称为高速命中。当CPU所需信息不在Cache中时,则需切换存取主储器,由于速度较慢,需 要插入等待,这种情况称高速未命中。在CPU存取主存储器的时候,按照最优化原则将存储信息同时写入到Cache中以保证下次可能的高速命中。因此,同一数据可能同时存储在主存储器和Cache中;同样,按照优化算法,可以淘汰Cache中的一些不常使用的数据。
所以,提高高速命中率的最好方法是尽量使Cache存放CPU最近一直在使用的指令与数据,当 Cache 装满后,可将相对长期不用的数据删除,提高 Cache的使用效率。为保持 Cache 中数据与主存储器中数据的一致性,避免CPU在读写过程中,将Cache中的新数据遗失,造成错误的读数据,确保Cache 中更新过程的数据不会因覆盖而消失,必须将 Cache 中的数据更新及时准确地反映到主存储器中,这是一个写入过程,通常采用的处理方法有:直写式、缓冲直写式与回写式三种。
1.直写式系统: CPU对Cache写入时,将数据同时写入到主存储器中,这样可保证Cache中的内容与主存储器的内容完全一致。这种方式比较直观,而且简单、可靠,但由于每次对Cache更新时都要对主存储器进行写操作,而这必须通过系统总线来完成,因此总线工作频繁,系统运行速度就会受到影响。
2.缓冲直写式系统:为解决直写式系统对总线速度的影响问题,在主存储器的数据写入时增加缓冲器区。当要写入主存储器的数据被缓冲器锁存后,CPU 便可执行下一个周期的操作,不必等待数据写入主存储器 。 这相对于给主存储器增加了一个单向单次高速缓存。比如,在写入周期之后可以紧接着一个数据已存在于Cache中的读取周期,这样就可避免直写式系统造成的 操作延时。但这个缓冲器只能存储一次写入的数据,当连续两次写操作发生时,CPU仍需等待。
3.回写式系统:以前的两种写入方式系统,都是在 写Cache的同时,对主存储器进行写操作。实际上这不仅是对总线带宽的占用,浪费了宝贵的执行时间,而且对于有的情况是不必要的,可以通过增加额外的标准来判断是否有必要更新数据。回写式系统就是通过在Cache中的每一数据块的标志字段中加入一更新位,解决主存储器不必要的写操作。比如,若Cache 中的数据曾被CPU更新过但还未同时更新主存储器,则该更新位被置1。每次CPU将一块新内容写入Cache时,首先,检查Cache中该数据块的更新 位,若更新位为0,则将数据直接写入Cache;反之,若更新位为1,则先将 Cache 中的该项内容写入到主存储器中相应的位置,再将新数据写回到Cache中。
与直写式系统相比,回写式系统可省下一些不必要的立即回写操作,而在许多情况下这是很频繁出现的。即使一个Cache被更新,若未被新的数据所取代,则 没有必要立刻进行主存储器的写操作。也就是说,实际写入主存储器的次数,可能少于CPU实际所执行的写入周期的次数,但回写式系统的结构较复杂, Cache也必须用额外的容量用来存储标志。
由于回写系统的高效率,现代的Cache大多采取这种方式进行操作。
由上面的介绍可以看出,写透(上述直写式)和写回(上述回写式)有着截然不同的操作,在不同的场合,不同的内存块使用不同的回写策略(如果你的系统可以实现的话)要比使用一种策略要高效得多。具体一点,对于反复存取的内存块置成写回,而把一次写入而很长时间以后再使用的内存置为写透,可以大大提高 cache的效率。
第一点很容易理解,第二点就需要琢磨一下了,由于写透的操作是,当缓存有该地址的数据时同时更新缓存和主存,当缓存没有该地址数据直接写主存,忽略缓存。当该地址的数据很长时间后才被使用到,那么在使用的时候该数据肯定不在cache中(被替换了),所以不如直接写入主存来得直接;
相反,如果使用写回操作,当cache中有该地址数据,需要更新该数据,设置dirty位,很长时间后再使用该数据或被替换的时候才将其刷进主存,这有占了茅坑不拉屎的嫌疑;而当cache没有该地址数据时,情况更糟糕,首先需要将相应的主存数据(一个cache line)导入cache,再更新数据,设置dirty位,再等待被刷回内存,这种情况不仅占用了cache的空间,还多一次从主存中导入数据的过程,同样占据总线,开销很大。至于为什么要先从主存中导入数据,是因为cache往主存回写数据时是按照一个cache line 单位来写的,但被更新的数据可能没有一个cache line这么多,所以为了保证数据一致性,必须先把数据导入cache,更新后再刷回来。
对于很多视频解码来说,帧写入过程是一个一次性的动作,只有在下一次作为参考帧时才会被使用到,所以帧缓冲内存可以设置为写透操作,而下一次使用它的时候很可能是作为参考帧来使用,而作为参考帧不需要反复的存取,只需一次读操作就可以了,所以效率并不会因为不经过cache而降低。实验证明该方法可以使mpeg4 sp解码提高20-30%的效率。
相似的内容cache操作的小技巧还有prefetch操作,prefetch操作是将主存的数据导入cache而期间cpu不需要等待,继续下一 条指令的执行,如果下一条指令也是总线的操作,那么就必须等待prefetch完成以后再开始。所以,在使用该指令时,在prefetch指令后面插入尽 可能大于一次缓存不命中所需要的clock数对应的指令,那么prefetch与其后面的指令可以并行执行,从而省去了等待的过程,相当于抵消缓存不命中 的损失。当然,如果插入的指令太多而cache太小,有可能prefetch的数据进入cache后又被替换掉了,所以,这需要自己去评估。
三种Cache写入方式原理简介相关推荐
- LVS三种请求转发方式和八种调度算法简介
1. LVS的结构 LVS方式的cluster从结构上可分为两部分:前端的负载均衡器(称之为director)和后端的真实服务器(称之为real server).cluster前端的director将 ...
- lvs的调度算法有几种_LVS:三种负载均衡方式比较
1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...
- LVS:三种负载均衡方式比较+另三种负载均衡方式
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- LVS:三种负载均衡方式比较
1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具 ...
- VMware虚拟机的三种联网方法及原理
VMware虚拟机的三种联网方法及原理 博客分类: 操作系统 虚拟机Vmware互联网网络应用网络协议 一.Brigde--桥接 :默认使用VMnet0 1.原理: Bridge 桥"就 ...
- SPA优缺点、解决单页面应用的SEO困难问题以及三种网页渲染方式
SPA特点优点缺点总结 1. 单页Web应用(SPA - Single Page web Application) 也就是说只有一个HTML文件的Web应用, 我们就称之为单页Web应用, 就称之为S ...
- 框架源码系列九:依赖注入DI、三种Bean配置方式的注册和实例化过程
一.依赖注入DI 学习目标 1)搞清楚构造参数依赖注入的过程及类 2)搞清楚注解方式的属性依赖注入在哪里完成的. 学习思路 1)思考我们手写时是如何做的 2)读 spring 源码对比看它的实现 3) ...
- 三种代码版本控制系统的简介 以及 SVN的安装
三种代码版本控制系统的简介 以及 SVN的安装 一.三种代码版本控制系统 1.1 CVS 什么是cvs??? 1.2.Git 什么是Git??? 1.3.SVN 什么是SVN??? SVN的作用??? ...
- Mongodb的三种集群方式的搭建
Mongodb是时下流行的NoSql数据库,它的存储方式是文档式存储,并不是Key-Value形式.关于Mongodb的特点,这里就不多介绍了,大家可以去看看官方说明:http://docs.mong ...
最新文章
- oracle 10.2 64位,Oracle 10.2.0.5 x64升级到11.2.0.3 x64
- 深入理解Spring系列之六:bean初始化
- mysql 环形复制_mysql复制(Replication)
- 对自己有用的VS调试技巧
- RocketMQ核心架构设计思想
- 基于redis实现分布式锁思考
- python中str函数_python字符串str的常用函数
- perl语言编程 第四版_被称作“胶水语言”的PERL,在芯片设计和验证中可以这样使用...
- .NET配置文件的10大安全漏洞
- 【语音处理】基于matlab GUI语音信号综合处理平台【含Matlab源码 290期】
- 搜狗输入法android德语,教你用搜狗输入法打出法语字符
- 一款神仙儿 MySQL 审核平台,吊到不行!
- EXCEL 图表-双坐标轴
- asterisk1.4与asterisk1.6双机互联问题
- redis集群在mac本地重启
- mysql -u root mysql_输入命令mysql -u root -p 报错
- 「干货」12.5米数字高程DEM专题图制作教程
- Directx+CEGUI把界面集成到游戏中,支持全屏方式(c++)
- Android一键锁屏功能的实现
- 高精度加法【c++实现】
热门文章
- 【转】[完全免费] 在线UML Sequence Diagram 时序图工具 - 教程第3部分
- 第八节:Task的各类TaskTResult返回值以及通用线程的异常处理方案
- nuget 包管理器
- linux 14.04安装方法,Ubuntu 14.04 安装配置GNOME经典界面
- 查看linux不显示ip,linux系统查看IP地址,不显示IP地址或者只显示127.0.0.1
- mysql实验三单表和多表查询_数据库实验三(单表查询)
- 【Python学习】 - 手写数字识别 - python读入mnist数据集的多种方法
- 【HDU - 5468】Puzzled Elena(容斥原理,dfs序,数学,素因子分解,有坑)
- *【HDU - 1506】【POJ - 2559】Largest Rectangle in a Histogram(单调栈或动态规划)
- 群辉挂载linux nfs,Debian 9 挂载访问已设置的群晖NFS共享文件目录