一次开发中,遇到一个问题:YUV图像(由本地磁盘文件读到ION内存中)缩放时,对于缩放模块的输入源来说,使用带cache的方式要比不带cache的方式速度快数10倍。

为什么会出现这个情况呢?

在解释这个前,需要有一些基础知识,可以回想一下volatile的用途。

它使用在什么场景下呢?多个线程同时访问一个全局变量,例如线程1和线程2都对同一个内存地址的全局变量进行读/写操作,这时就需要将这个变量声明为volatile。

为什么呢?为了加快cpu的访问速度,会把一些变量值加载到寄存器中使用,当修改了该值后,其只更新在寄存器中,而不是在实际的mem中,虽然看似在对某内存地址上进行修改。而问题发生切换时,线程2中看到的相同地址下的值可能是线程1修改前的值。

因为cpu被这个线程使用时,cpu觉得“只有我一个人操作这个内存地址,因此我把这个值备份到更快速的地方(cache/register)来加快访问速度,直到万不得已我才把数据加载到mem中”,因此两个线程看到的同一mem地址下的数据可能不相同。

借此机会,再来引申,说明一下write-through和write-back的概念。

Write-through- Write is done synchronously both to the cache and to the backing store.
Write-back (or Write-behind) – Writing is done only to the cache. A modified cache block is written back to the store, just before it is replaced.
翻译:

Write-through(直写)——写操作同时被更新到cache和后端存储。

Write-back(回写)——写操作仅仅被更新到cache中。只有在这个cache将要被更新前,才将旧数据更新到后端存储。

二者各有优缺点:直写模式下,速度较慢,但数据安全。回写模式下,速度快,但数据不安全(设备断电了!)。

机械硬盘就是一个很好的例子,例如往硬盘写数据时,也是使用Write-back模式,先写到硬盘的cache中,cpu就去干其它事情了,而接下来时间磁盘可能偷偷将cahe中的数据刷新到物理介质中。

从磁盘读数据时,也是先将物理介质上一大块数据加载到cache中,下次访问附近的数据时,现在磁盘cache中看下是否能够hit,如果命中了就不必再去物理磁道上去读数据。

OK,联想打住,回到最初的问题。

为什么ion内存分带cache和不带cache呢?很多模块(VideoCodec、cam、disp)都需要频繁对mem数据进行更新。

例如h264码流解码后,需要将解码器的output_buf的数据传给(传mem_addr)缩放模块,假如缩放模块进行soft scale down,cpu则去根据一定的算法在mem中抽取像素值。

假如不带cache,那么速度很慢,因为从phy mem上拿数据毕竟慢,但假如带cache(数据也从phy_mem上刷新到cache),则直接从cache中拿数据则很快。

同时,特别需要注意一点,这个cache是属于cpu的,而其他外设不知道有这个cache,因而外设只是在实际phy_mem上进行数据更新;然而cpu对mem的访问,表面上看似对phy_mem的访问,但实际上可能是对其镜像(cache)的访问。

如何保证内存数据一致性呢?(带cache的一个潜在后果)

当编解码模块写数据了后,cpu去读,则需要调用特定的接口,强制从mem中读数据,而不是从cache中读数据。

当cpu写数据(到cache)了后,编解码模块需要调用特定的接口,将cache中的数据刷新到mem中,编解码模块再从mem中读数据。

Ion内存的带cahce与不带cache问题分享的更多相关文章

  1. ESXi内虚拟机带快照与不带快照的情况下简单性能对比.

    1. 两个虚拟机配置相同都为2vCPU 8G内存 一个虚拟机内包含较多的快照且有内容梗概 一个虚拟机不包含快照直接只有一个虚拟机的vmdk磁盘文件 操作系统未windows server 2008r2 ...

  2. Python中类-带括号与不带括号的区别

    类不带括号我们叫赋值,带括号我们叫实例化. 什么是赋值? a=7 b=a id(7) 140726814208448 id(a) 140726814208448 id(b) 1407268142084 ...

  3. Python调用函数带括号和不带括号的区别

    1.不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不需等该函数执行完成 2.带括号(此时必须传入需要的参数),调用的是函数的return结果,需要等待函数执行完成的结果 如果函数本 ...

  4. C++中#include包含头文件带 .h 和不带 .h 的区别

    C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些 ...

  5. HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理

    原文地址:http://blog.csdn.net/cdefg198/article/details/8315438 万能框架:http://www.sufeinet.com/forum.php?mo ...

  6. 华为CloudIDE免费公测,带你出坑带你飞

    你的代码仓库上线了吗?是不是有时候遇到这样的问题? 只想浏览一下代码,却发现线上浏览效果不佳,高亮显示什么的都没有.而在桌面端浏览要需要先同步代码,再用桌面端的IDE打开.尤其是使用git的时候,先要 ...

  7. python web开发-flask中的url带斜线和不带斜线区别详解

    通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url&qu ...

  8. Android ION内存分配

    The Android ION memory allocator 英文原文 ION heaps ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display c ...

  9. js中new函数后带括号和不带括号的区别

    用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Pare ...

随机推荐

  1. 小白学python-day05-IDE、格式化输出、For While循环、断点、continue、break

    今天是day05,以下是学习总结. 但行努力,莫问前程. ----------------------------------------------------------------------- ...

  2. 10G文件如何对里面单词出现排序

    10G文件如何对里面单词出现排序的问题(只要文件系统支持,不限大小). 其实这个问题很简单,10G文件是很大,但是出现的字符或单词是很有限的. 单字符只有那么一百多个,单词数量满打满算,以英文单词总数 ...

  3. ~~面向对象进阶——__name__=="__main__"~~

    进击のpython 面向对象进阶--__name__=="__main__" 前面我们在讲模块的时候,其实还有一个知识点没有很好的讲 那就是main和name 可能你们在看一些代码 ...

  4. Java后台处理框架之struts2学习总结

    Java后台处理框架之struts2学习总结 最近我在网上了解到,在实际的开发项目中struts2的使用率在不断降低,取而代之的是springMVC.可能有很多的朋友看到这里就会说,那还不如不学str ...

  5. 基于zookeeper集群的云平台-配置中心的功能设计

    最近准备找工作面试,就研究了下基于zookeeper集群的配置中心. 下面是自己设想的关于开源的基于zookeeper集群的云平台-配置中心的功能设计.大家觉得哪里有问题,请提出宝贵的意见和建议,谢谢 ...

  6. 全开源C++ DirectUI 界面库SOUI 3.0更新

    从2019.5.22开始,SOUI版本号更新到2.9.0.2,后面开始准备3.0的开发,历时近3个月,现在3.0的主要工作基本完成. 为了便于大家区别2.x,3.0启用了新的代码仓库:https:// ...

  7. JSON合并,并按时间排序

    mergeJson: function (json1, json2) { var json = Object.assign([], json1, json2); return json.sort(fu ...

  8. hadoop学习(七)----mapReduce原理以及操作过程

    前面我们使用HDFS进行了相关的操作,也了解了HDFS的原理和机制,有了分布式文件系统我们如何去处理文件呢,这就的提到hadoop的第二个组成部分-MapReduce. MapReduce充分借鉴了分 ...

  9. MySQL储存过程详解

    我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的 ...

  10. LeetCode——372. Super Pow

    题目链接:https://leetcode.com/problems/super-pow/description/ Your task is to calculate ab mod 1337 wher ...