三种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后又被替换掉了,所以,这需要自己去评估。

 


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

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

相关文章

Minor GC和Full GC

我们在日常开发中可能经常会听大家谈论GC,但是其实很多人对GC的种类其实并不是很了解,接下来我们简单介绍下Minor GC和Full GC及他们的区别。 MinorGC: 也可以叫作新生代GC,指的是发生在新生代的垃圾收集动作。因为新生代中对象大…

linux安装软件的几种方法

见:http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安装方式步骤: 1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录; 2、打开一个终端,su -成root用户; …

Android NDK MediaCodec在ijkplayer中的实践

https://www.jianshu.com/p/41d3147a5e07 从API 21(Android 5.0)开始Android提供C层的NDK MediaCodec的接口。 Java MediaCodec是对NDK MediaCodec的封装,ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要内容是&a…

leetcode-49-字母异位词分组(神奇的哈希)

题目描述: 给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [[&quo…

【精心总结】java内存模型和多线程必会知识

内存模型 (1)java内存模型到底是个啥子东西? java内存模型是java虚拟机规范定义的一种特定模型,用以屏蔽不同硬件和操作系统的内存访问差异,让java在不同平台中能达到一致的内存访问效果,是在特定的协议下…

工作流 activity 视频教程 + redis 视频教程 百度网盘分享地址

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 云盘下载都没有密码,直接下载,解压有密码:chongxiangmengxiangjiaoyu, 解压完成后就可以…

快速解决 GRADLE 项目下载 gradle-*-all.zip 慢的问题

1、首先根据项目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 属性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序结构与控制流

1. 条件语句 if、else与elif语句用于控制条件代码的执行。条件语句的一般格式如下: if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要执行任何操作,可以省略条件语句的else和elif子句。…

webrtc 源码结构

apiWebRTC 接口层。包括 DataChannel, MediaStream, SDP相关的接口。各浏览器都是通过该接口层调用的 WebRTC。call存放的是 WebRTC “呼叫(Call)” 相关逻辑层的代码。audio存放音频网络逻辑层相关的代码。音频数据逻辑上的发送,接收等代码。…

mysql查询流程解析及重要知识总结

时光荏苒啊!在过两个月我就工作满三年了,大学毕业的情景还历历在目,而我已经默默的向油腻中年大叔进发了。作为一名苦逼的后端工程师,我搞过一段时间python,现在靠java糊口,但后来才发现,始终不…

界面无小事(八):RecyclerView增删item

界面无小事(一): RecyclerViewCardView了解一下 界面无小事(二): 让RecyclerView展示更多不同视图 界面无小事(三):用RecyclerView Toolbar做个文件选择器 界面无小事(四):来写个滚动选择器吧! 界面无小事(五):自定义TextView 界面无小事(六):来做个好看得侧拉菜单! 界面无小事…

Failed to install Tomcat7 service 解决

见: http://blog.csdn.net/desow/article/details/21446197 tomcat 安装时出现 Failed to install Tomcat7 service 今天在安装tomcat时提示 Failed to install Tomcat7 service了,花了大半天的时间找到了原因,下面分享给大家,希望…

保守官僚 诺基亚就这样迷失在智能机时代?

7月19日,诺基亚发布了二季度财报,净亏损达到了17亿美元,其中智能手机份额和销售量进一步下滑,这个智能手机的领导者,正在因智能手机而急速坠落。诺记亚领先业界近十年就把握住了智能手机的趋势,并推出了首款…

django集成ansibe实现自动化

动态生成主机列表和相关参数 def create_admin_domain(admin_node):workpath BASE_DIR /tools/ansible/scripthosts_file BASE_DIR /tools/ansible/host/ createhostfile()yml_file BASE_DIR /tools/ansible/yml/ create_admin_domain.ymldomain_path admin_node.doma…

extend 对象继承

function extend(o, n, override) {for (var p in n) {if (n.hasOwnProperty(p) && (!o.hasOwnProperty(p) || override))o[p] n[p];} }// 默认参数 var options {pageIndex: 1,pageTotal: 2 };// 新设置参数 var userOptions {pageIndex: 3,pageSize: 10 }extend(o…

【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)

本次我们通过源码介绍ApplicationContext容器初始化流程,主要介绍容器内bean的实例化和初始化过程。ApplicationContext是Spring推出的先进Ioc容器,它继承了旧版本Ioc容器BeanFactory,并进一步扩展了容器的功能,增加了bean的自动识…

如何将自己的Java项目部署到外网

见:http://jingyan.baidu.com/article/90bc8fc864699af653640cf7.html 做b/s模式的web开发不同于c/s模式的客户端开发,c/s模式我们只要做好生成可执行文件发送给其他人,其他人就可以用了。但是c/s模式不同,在同一局域网下&#xf…

[Swift]LeetCode916.单词子集 | Word Subsets

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址&a…

揭秘腾讯研究院输出策略:产品和人才的孵化器

直到现在,腾讯研究院创始人郑全战仍坚持面试招入研究院的每一个人,并做详细记录。天赋上的灵性、性格中的包容是他看重的,当然首先人要踏实。大约6年前,郑全战加入腾讯,负责筹建中国互联网公司中的第一个研究院&#x…

java后端必会【基础知识点】

(一)java集合类(done) 在java集合类中最常用的是Collection和Map的接口实现类。Collection又分为List和Set两类接口,List的实现类有ArrayList、LinkedList、Vector、Stack,Set接口的实现类有HashSet、Tree…