mmap 的理解

来源:互联网 发布:2016淘宝返利网排名 编辑:程序博客网 时间:2024/05/30 07:13
前几天下到了一本[Android系统原理及开发要点详解].(韩超,梁泉),准备学习一下ANDROID。

书中第三章讲到了Ashmem匿名共享内存驱动,但是简简单单几句话,就告诉我这种内核机制可以为用户空间程序提供分配内存的机制,实现类似malloc的功能。但是作为辅助Android系统运行的专用驱动(这里不是指操作硬件的驱动),我还是需要对他进行更深的理解。
        Ashmem 的一些详细介绍里有讲解到mmap这个东东,所以我决定先对他进行一个了解。因为linux我仅仅只是一个了解阶段,前段时间虽然有做基于Actions相关的一些工作,但对类LIUNX的UCOS内部实现也并不了解。
      http://www.ibm.com/developerworks/cn/linux/l-ipc/part5/index1.html 这里有一篇详解mmap的文章,我个人认为看完后还是能理解的。下面我将一些重点再重新理一下:
   
采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据[1]:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时,并不总是读写少量数据后就解除映射,有新的通信时,再重新建立共享内存区域。而是保持共享区域,直到通信完毕为止,这样,数据内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此,采用共享内存的通信方式效率是非常高的。

这里可以让我们了解到共享内存是最快的IPC(进程间通信)方式,书中后面也介绍Framebuffer 显示驱动中 mmap可以将的Framebuffer 的内存映射到用户空间,这样android设备的各个AP都可以操作映射的内存来改变显示的内容了。

mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。
注:实际上,mmap()系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
作者上面说的主要是想表达:mmap()并不一定用在共享内存方面,也可以像读写内存一样对普通文件的操作,比如说:你现在需要频繁的读写一个文件,采用这种方式比普通文件的读写效率也是高很多的。另外上面链接中的作者实例中的结论也是我们平时在使用mmap需要注意的地方

原创粉丝点击