mmap的概论
mmap的一大应用就是将内核空间的一段内存映射到各个应用程序的各自的应用地址空间中,然后各个应用程序都可以访问这段内存空间,这就是所谓的内存共享实现进程间的信息的交互。类似于内核的读写锁一样,应用进程对共享内存的访问分为两种:一种是读,一种是写。所有进程的读可以同时并发的访问同一个内存地址,但写跟读是互斥的,即我在读某个内存地址的时候,不能有写的操作,写操作相对于读操作有更高的优先权。并且所有进程对同一个地址的写操作都是互斥的。所以共享内存的实现关键是访问的同步控制。
那么android的property的实现则是利用mmap实现内存共享的一个经典应用实例。android的property为了实现各进程对共享内存写操作的同步,他规定所有对属性变量的写操作请求都会通过socket通讯发送至init后台服务,由init后台服务来处理所有进程的属性变量写请求,这样尽管各个进程可以随意甚至并发的调用设置属性变量的接口,但实际对共享内存进行写操作时,则只会有init后台服务一个入口,在这个init后台服务入口里,实现序列化的写操作,这样就保证了对共享内存的写操作的互斥。
至于属性读跟属性写的互斥则会在后面的代码中有详细介绍
android的property的实现
从上面黑色高亮部分,我们看出,这段共享内存映射到/init进程的[b6fef000,b6ff7000]地址空间,该地址空间是属于应用空间(<3G),并且映射的空间大小是32KB(0x8000).我们应该容易想到,所有使用或支持android 属性的进程,都应该映射文件/dev/__properties__