Android mmap 文件映射到内存介绍

Android 2020android

本文连接: Android mmap 文件映射到内存介绍缓存

Android开发中,咱们可能须要记录一些文件。例如记录log文件。若是使用流来写文件,频繁操做文件io可能会引发性能问题。 为了下降写文件的频率,咱们可能会采用缓存必定数量的log,再一次性把它们写到文件中。若是app异常退出,咱们有可能会丢失内存中的log信息。 那么有什么比较稳妥的写文件方式,既能下降io,又能尽量地保证数据被写入文件呢?app

mmap简介

mmap概念

mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。dom

特色:实现这样的映射关系后,进程就能够采用指针的方式读写操做这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操做而没必要再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而能够实现不一样进程间的文件共享。以下图所示:函数

mmap简介

mmap内存映射原理

mmap内存映射的实现过程,总的来讲能够分为三个阶段:工具

应用进程启动映射,在进程的虚拟地址空间中,寻找一段空闲的知足要求的连续的虚拟地址做为映射区域; 调用系统函数mmap,实现文件物理地址和进程虚拟地址的一一映射; 应用进程对映射区域访问,引起缺页异常,实现文件内容到物理内存(主存)的拷贝。post

mmap优缺点

只有一次数据拷贝:当发生缺页异常时,直接将数据从磁盘拷贝到进程的用户空间,跳过了页缓存。 实现了用户空间和内核空间的高效交互方式:两空间的各自修改操做能够直接反映在映射的区域内,从而被对方空间及时捕捉。 提供进程间共享内存及相互通讯的方式。性能

无论是父子进程仍是无亲缘关系的进程,均可以将自身用户空间映射到同一个文件或匿名映射到同一片区域。从而经过各自对映射区域的改动,达到进程间通讯和进程间共享的目的。spa

同时,若是进程A和进程B都映射了区域C,当A第一次读取C时经过缺页从磁盘复制文件页到内存中;但当B再读C的相同页面时,虽然也会产生缺页异常,可是再也不须要从磁盘中复制文件过来,而可直接使用已经保存在内存中的文件数据。操作系统

mmap注意点

对于大文件而言,内存映射比普通IO流要快,小文件则未必; 不要常常调用MappedByteBuffer.force()方法,这个方法强制操做系统将内存中的内容写入硬盘,因此若是你在每次写内存映射文件后都调用force()方法,你就不能真正从内存映射文件中获益,而是跟disk IO差很少。 读写内存映射文件是操做系统来负责的,所以,即便你的Java程序在写入内存后就挂掉了,只要操做系统工做正常,数据就会写入磁盘。 若是电源故障或者主机瘫痪,有可能内存映射文件尚未写入磁盘,意味着可能会丢失一些关键数据。

参考

Android中的Binder也利用的mmap。Binder传递数据时,只须要复制一次,就能把数据传递到另外一个进程中。参考Binder机制介绍

Android中使用mmap

Android中使用mmap,能够经过RandomAccessFile与MappedByteBuffer来配合。参考drone开发记录 - log记录工具

经过randomAccessFile.getChannel().map获取到MappedByteBuffer。而后调用ByteBuffer的put方法添加数据。

相关文章
相关标签/搜索