热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux中mmap函数使用

一、前言除了标准的文件IO,例如open,read,write,内核还提供接口运行应用将文件map到内存,使得

一、前言



除了标准的文件IO,例如open,read,write,内核还提供接口运行应用将文件map到内存,使得内存中的一个字节与文件中的一个字节一一对应。这就是今天要说的mmap,它在android中的用处非常多,比如binder,还有腾讯的开源的IO框架MMKV。这里简单记录下使用。


二、优势和缺势




  • 优势

    1 .读写文件避免了 read()write() 系统调用,也避免了数据的拷贝。
    2 .多个进程 map 同一个对象,可以共享数据。
    3 .可以直接使用指针来跳转到文件某个位置,不必使用 lseek() 系统调用。

  • 劣势

    1 .内存浪费。由于必须要使用整数页的内存。
    img
    mmap原理


三、mmap使用方法



#include void * mmap (void *addr,size_t len,int prot,int flags,int fd,off_t offset);

  • addr
    这个参数是建议地址(hint),没有特别需求一般设为0。这个函数会返回一个实际 map 的地址。
  • len
    文件长度。
  • prot
    表明对这块内存的保护方式,不可与文件访问方式冲突。
    PROT_NONE
    无权限,基本没有用
    PROT_READ
    读权限
    PROT_WRITE
    写权限
    PROT_EXEC
    执行权限
  • flags
    描述了映射的类型。
    MAP_FIXED
    开启这个选项,则 addr 参数指定的地址是作为必须而不是建议。如果由于空间不足等问题无法映射则调用失败。不建议使用。
    MAP_PRIVATE
    表明这个映射不是共享的。文件使用 copy on write 机制映射,任何内存中的改动并不反映到文件之中。也不反映到其他映射了这个文件的进程之中。如果只需要读取某个文件而不改变文件内容,可以使用这种模式。
    MAP_SHARED
    和其他进程共享这个文件。往内存中写入相当于往文件中写入。会影响映射了这个文件的其他进程。与 MAP_PRIVATE冲突。
  • fd
    文件描述符。进行 map 之后,文件的引用计数会增加。因此,我们可以在 map 结束后关闭 fd,进程仍然可以访问它。当我们 unmap 或者结束进程,引用计数会减少。
  • offset
    文件偏移,从文件起始算起。

如果失败,mmap 函数将返回 MAP_FAILED


四、Android中使用mmap



#include
#include
#include
#include
#include
#include extern "C"
JNIEXPORT void JNICALL
Java_com_example_mmap_1demo_MainActivity_writeTestNative(JNIEnv *env, jobject thiz) {std::string file &#61; "/sdcard/mmap.txt";//可读可写&#xff0c;没有就创建&#xff0c;unix打开int m_fd &#61; open(file.c_str(), O_RDWR|O_CREAT, S_IRWXU);//获取当前一页大小int m_size &#61; getpagesize();//将空文件设置成4k大小&#xff0c;4096字节ftruncate(m_fd, m_size);//产生映射 页内容可以写入可以读取 映射内容可以共享int8_t * m_ptr &#61; static_cast<int8_t *>(mmap(0, m_size, PROT_WRITE | PROT_READ, MAP_SHARED, m_fd,0));std::string data("这是一个mmap demo");//内存拷贝memcpy(m_ptr, data.data(), data.size());__android_log_print(ANDROID_LOG_ERROR, "mmap", "写入数据&#xff1a;%s", data.c_str());
}

这个demo通过mmap文件映射到内存&#xff0c;只需要通过内存拷贝memcpy向文件写入数据


推荐阅读
author-avatar
鸡__腿孜然小朋友
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有