android的内存分配机制
2011-08-31 13:59
190 查看
ashmem是android的内存分配/共享机制,在dev目录下对应的设备是/dev/ashmem,相比于传统的内存分配机制,如malloc、 anonymous/named mmap,其好处是提供了辅助内核内存回收算法的pin/unpin机制。
ashmme的典型用法是先打开设备文件,然后做mmap映射。
第一步通过调用ashmem_create_region函数,这个函数完成这几件事:
java代码:
fd = open(“/dev/ashmem”, O_RDWR);
ioctl(fd, ASHMEM_SET_NAME, region_name); // 这一步可选
ioctl(fd, ASHMEM_SET_SIZE, region_size);
复制代码
第二步,应用程序一般会调用mmap来把ashmem分配的空间映射到进程空间:
mapAddr = mmap(NULL, pHdr->mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
应用程序还可以通过ioctl来pin和unpin某一段映射的空间,以提示内核的page cache算法可以把哪些页面回收,这是一般mmap做不到的。
可以说ashmem以较小的代价(用户需进行额外的ioctl调用来设置名字,大小,pin和unpin),获得了一些内存使用的智能性。
ashmem本身实现也很小巧,只有不到700行。原因是借助了内核已经有的工具,例如shmem_file_setup(支撑文件),cache_shrinker(slab分配算法的页面回收的回调函数)等。
如果ashmem不使用内核驱动实现,则pin/unpin的语义比较难以实现,或者即使实现,效率也不会很高。但查询android源码,使用pin /unpin很少,看来ashmem还是没有很好地用起来。
如果不使用ashmem驱动,并且舍弃pin/unpin语义,那么模拟ashmem的语义还是很简单的。首先,ashmem_create_region可以为进程创建一个唯一的文件(如进程名+时戳),打开,然后返回这个文件的fd;接着应用程序可以进性一 般的mmap操作了。如果不使用ashmem_create_region接口函数,那么使用anonymous的mmap就可以了,但这种方式属于正在
被丢弃的方式,而且并不是所有的系统都支持,比如Macos就不支持。
ashmme的典型用法是先打开设备文件,然后做mmap映射。
第一步通过调用ashmem_create_region函数,这个函数完成这几件事:
java代码:
fd = open(“/dev/ashmem”, O_RDWR);
ioctl(fd, ASHMEM_SET_NAME, region_name); // 这一步可选
ioctl(fd, ASHMEM_SET_SIZE, region_size);
复制代码
第二步,应用程序一般会调用mmap来把ashmem分配的空间映射到进程空间:
mapAddr = mmap(NULL, pHdr->mapLength, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
应用程序还可以通过ioctl来pin和unpin某一段映射的空间,以提示内核的page cache算法可以把哪些页面回收,这是一般mmap做不到的。
可以说ashmem以较小的代价(用户需进行额外的ioctl调用来设置名字,大小,pin和unpin),获得了一些内存使用的智能性。
ashmem本身实现也很小巧,只有不到700行。原因是借助了内核已经有的工具,例如shmem_file_setup(支撑文件),cache_shrinker(slab分配算法的页面回收的回调函数)等。
如果ashmem不使用内核驱动实现,则pin/unpin的语义比较难以实现,或者即使实现,效率也不会很高。但查询android源码,使用pin /unpin很少,看来ashmem还是没有很好地用起来。
如果不使用ashmem驱动,并且舍弃pin/unpin语义,那么模拟ashmem的语义还是很简单的。首先,ashmem_create_region可以为进程创建一个唯一的文件(如进程名+时戳),打开,然后返回这个文件的fd;接着应用程序可以进性一 般的mmap操作了。如果不使用ashmem_create_region接口函数,那么使用anonymous的mmap就可以了,但这种方式属于正在
被丢弃的方式,而且并不是所有的系统都支持,比如Macos就不支持。
相关文章推荐
- Android内存分配回收机制
- Android(安卓)内存分配机制详解 不需要关闭后台运行程序
- android-手机内存分配和回收机制研究
- android的内存分配机制
- android的内存分配机制
- Android内存分配分配机制 Low Memory Killer
- Android 优化二 Java内存分配机制及内存泄漏
- Android内存分配分配机制
- android内存回收机制
- C++中虚拟函数的内存分配机制
- android内存回收机制
- JAVA虚拟机内存分配与回收机制
- .NET下的内存分配机制
- STL中vector的内存分配机制
- 【转】Android内存机制分析1——了解Android堆和栈
- JAVA虚拟机内存分配与回收机制
- Linux内存分配机制:SLAB / SLUB / SLOB
- 全面介绍Windows内存管理机制及C++内存分配实例(六):堆栈
- C语言------关于系统内存分配机制的一些整理
- Android内存机制分析下篇:分析APP内存使用情况