Ion内存的带cahce与不带cache问题分享
一次开发中,遇到一个问题: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问题分享的更多相关文章
- ESXi内虚拟机带快照与不带快照的情况下简单性能对比.
1. 两个虚拟机配置相同都为2vCPU 8G内存 一个虚拟机内包含较多的快照且有内容梗概 一个虚拟机不包含快照直接只有一个虚拟机的vmdk磁盘文件 操作系统未windows server 2008r2 ...
- Python中类-带括号与不带括号的区别
类不带括号我们叫赋值,带括号我们叫实例化. 什么是赋值? a=7 b=a id(7) 140726814208448 id(a) 140726814208448 id(b) 1407268142084 ...
- Python调用函数带括号和不带括号的区别
1.不带括号时,调用的是这个函数本身 ,是整个函数体,是一个函数对象,不需等该函数执行完成 2.带括号(此时必须传入需要的参数),调用的是函数的return结果,需要等待函数执行完成的结果 如果函数本 ...
- C++中#include包含头文件带 .h 和不带 .h 的区别
C++中#include包含头文件带 .h 和不带 .h 的区别? 如 #include <iostream> 和 #include <iostream.h> 包含的东西有哪些 ...
- HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理
原文地址:http://blog.csdn.net/cdefg198/article/details/8315438 万能框架:http://www.sufeinet.com/forum.php?mo ...
- 华为CloudIDE免费公测,带你出坑带你飞
你的代码仓库上线了吗?是不是有时候遇到这样的问题? 只想浏览一下代码,却发现线上浏览效果不佳,高亮显示什么的都没有.而在桌面端浏览要需要先同步代码,再用桌面端的IDE打开.尤其是使用git的时候,先要 ...
- python web开发-flask中的url带斜线和不带斜线区别详解
通过flask进行路由配置的时候,有一个细节,就是同样的url,带上"/"和不带"/"有什么区别. 举例说明: 比如有个url,名字为"/url&qu ...
- Android ION内存分配
The Android ION memory allocator 英文原文 ION heaps ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display c ...
- js中new函数后带括号和不带括号的区别
用new创建构造函数的实例时,通常情况下new 的构造函数后面需要带括号(譬如:new Parent()). 有些情况下new的构造函数后带括号和不带括号的情况一致,譬如: function Pare ...
随机推荐
- vue教程(三)-slot\keep-alive的使用
一.slot其实就是填坑操作,父组件传递dom结构,是vue提供的一种内置组件(组件知识请查看上篇博客内容) 写法:<slot></slot> 例子: var child = ...
- linux初学者-系统日志(二)
linux初学者-系统日志(二) 先前在(一)中介绍到在不同主机间日志同步的方法,在一台主机上可以看到另一台主机的日志.这里会介绍系统日志方面的一些其他内容. 1.日志的采集格式 在日志的采集中,由图 ...
- sklearn学习 第一篇:knn分类
K临近分类是一种监督式的分类方法,首先根据已标记的数据对模型进行训练,然后根据模型对新的数据点进行预测,预测新数据点的标签(label),也就是该数据所属的分类. 一,kNN算法的逻辑 kNN算法的核 ...
- netty源码解解析(4.0)-16 ChannelHandler概览
本章开始分析ChannelHandler实现代码.ChannelHandler是netty为开发者提供的实现定制业务的主要接口,开发者在使用netty时,最主要的工作就是实现自己的ChannelHan ...
- android 界面提示框架WisdomProgressHUD,为金典而生
一:简述 今天给android开发者们,推荐一个金典的界面提示框架WisdomProgressHUD,使用简洁方便. WisdomProgressHUD 是一个半透明的 HUD 指示器. Wisdom ...
- 在Linux - Centos上安装Python3(上)
必看内容 在Linux上安装Python常用的2种方法 1.Python源码编译安装,有点复杂,适合老司机 2.从EPEL/IUS仓库安装,新手建议使用些方法,比较简单,目前2019-07-31提供最 ...
- 二进制文件安装k8s所需要的证书服务
利用二进制文件安装etcd所需要的证书服务 CFSSL是CloudFlare开源的一款PKI/TLS工具. CFSSL 包含一个命令行工具 和一个用于 签名,验证并且捆绑TLS证书的 HTTP API ...
- 机房ping监控 smokeping+prometheus+grafana(续) 自动获取各省省会可用IP
一.前言 1.之前的文章中介绍了如何使用smokeping监控全国各省的网络情况:https://www.cnblogs.com/MrVolleyball/p/10062231.html 2.由于之前 ...
- 跟着大彬读源码 - Redis 8 - 对象编码之字典
目录 1 字典的实现 2 插入算法 3 rehash 与 渐进式 rehash 总结 字典,是一种用于保存键值对的抽象数据结构.由于 C 语言没有内置字典这种数据结构,因此 Redis 构建了自己的字 ...
- 作为前端的你,CC游戏开发可以上车
1. 初来乍到 打开 Cocos Creator 点击新建空白项目,在默认布局的左下区域,一个黄黄assets文件夹映入眼帘.作为前端的你对这个文件是不是再熟悉不过了.是的,和你想象的一样,开发游戏中 ...