博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android匿名共享内存使用简介
阅读量:7232 次
发布时间:2019-06-29

本文共 1768 字,大约阅读时间需要 5 分钟。

hot3.png

最近在优化打印机的打印速度,由于当前的实现存在许多内存拷贝的操作,于是希望借助于android匿名共享内存减少拷贝的次数,达到优化的目的。因为以前并未使用过Ashmem,仅以此篇记录下应用流程。

113245_EFwP_3750358.png

首先明确一点,共享内存一般应用在跨进程之间,原型如上图,fd为此块共享内存的文件描述符,Client和Server端通过文件描述符fd来操作共享内存

Client端实现步骤:

1.使用ashmem_create_region()接口创建一个长度为length的共享内存,并返回此内存块的文件描述赋

data.fd = ashmem_create_region(NULL,length);	if(data.fd < 0)            LOGE(TAG,"Creating code cache, ashmem_create_region "                                "failed with error '%s'", strerror(errno));

2.将此块共享内存以可读可写的方式映射到用户空间,并对此块内存写入数据

data.data = (char *)mmap(NULL, data.length,                                    PROT_READ | PROT_WRITE,                                MAP_SHARED, data.fd, 0);	if(data.data != MAP_FAILED){		LOGE(TAG,"mmap sharemem success....");		memcpy(data.data,gucDotBuffer,length);		}else{		LOGE(TAG,"mmap sharemem failed....'%s'",strerror(errno));		}

3.解映射并关闭文件描述符

munmap(data.data,length);close(data.fd);

4.通过binder通信,将共享内存的文件描述符通过Parcel提供的writeFileDescriptor()接口传递到服务端

Parcel data;data.writeFileDescriptor(ash_data.fd,true);

服务端实现流程:

5.首先通过Parcel接口readFileDescriptor()接口取到共享内存块的文件描述符

Parcel data;fd = data.readFileDescriptor();

6.将共享内存块mmap到服务端进程空间,之后就可以操作这块内存了

data.data = (char *)mmap(NULL, data.length,                         PROT_READ | PROT_WRITE,                         MAP_SHARED, data.fd, 0);if(data.data != MAP_FAILED){	LOGE(TAG,"mmap sharemem success....");}else{	LOGE(TAG,"mmap sharemem failed....'%s'",strerror(errno));}

7.同理,使用完后需要解映射以及关闭文件描述符,防止内存泄漏

munmap(data.data,data.length);close(data.fd);

 

注:补充一下,有一点比较有趣的地方是,Client和Server端的文件描述符fd的值打印出来你会发现两者是不一样的,这是因为,每个进程在进程表中都维护着自身的文件描述符表,binder驱动在传递fd的时候,调用了dup()函数对client端的文件描述符拷贝了一份副本给到Server端,两者值不同,但均指向同一个文件。

注2:每调用多一次dup(),返回值就会多加1

注3:需要依赖的头文件

#include 
#include

 

转载于:https://my.oschina.net/u/3750358/blog/1815998

你可能感兴趣的文章
SpringFramework核心技术一(IOC:自定义一个bean的本质)
查看>>
MCMC(四)Gibbs采样
查看>>
分布式计算框架Gearman原理详解
查看>>
你不可不知的安全问题与9大趋势
查看>>
题解 P1339 【[USACO09OCT]热浪Heat Wave】
查看>>
Flask從入門到入土(一)——程序的基本結構
查看>>
Windows 10不能正常打开开始菜单问题修复
查看>>
7.73 亿 email 信息泄露,你的密码可能在里边
查看>>
JFinal-layui v1.1 更新,极速开发企业应用系统
查看>>
部署WAR包实时查看Tomcat的状态和日志
查看>>
vex使用...mapActions报错解决办法
查看>>
胡捷:区块链是促进个体信任的“天使”,也是消减中心权利的“魔鬼”
查看>>
使用docker-compose快速搭建zookeeper集群
查看>>
TFC暨智能娱乐展乐相科技陈朝阳致开发者:为什么你要信任虚拟现实
查看>>
深入解读HBase2.0新功能之高可用读Region Replica
查看>>
Linux中KVM虚拟机是什么
查看>>
「镁客·请讲」Lucia 焦玉龙:用区块链技术切入长租行业,Lucia要做长租领域的变革者...
查看>>
【加法笔记系列】逻辑门、半加器、全加器、波纹进位加法器
查看>>
递归基础思想
查看>>
通过组策略禁止有本地管理员权限的域用户更改网络配置
查看>>