ashmem有什么特殊的力量?

Rob*_*tin 25 linux android shared-memory

有人可以解释为什么创造了ashmem吗?

我正在浏览mm/ashmem.c.就像我所知,内核正在考虑将ashmem作为文件支持的内存,可以是mmap'd.但是,为什么要去实施ashmem呢?似乎可以通过安装RAM fs然后使用filemap/mmap来共享内存来实现相同的功能.

我确信ashmem可以做更多花哨的东西 - 从查看代码,它似乎与固定/取消固定页面有关?

Kaz*_*Kaz 25

Ashmem允许与祖先无关的进程按名称共享内存映射,并自动清理.

普通的旧匿名mmaps和System V共享内存缺少这些要求.

当运行程序不再引用时,系统V共享内存段会一直存在(有时候这是一个功能,有时候是一种麻烦).

匿名共享mmaps可以从父进程传递到子进程,这是不灵活的,因为有时您希望与该方式不相关的进程共享内存.

  • @Pbasak在这个答案下面作为评论提出时,你的问题很少受到关注.如果您需要这个答案,请考虑将其作为stackoverflow问题. (5认同)
  • 但ashmem需要通过文件描述符共享.创建一个支持文件并允许每个进程将其共享mmap将实现相同的目标,不是吗?我看到这比shmem更好但是它比支持文件更好? (3认同)
  • 它更好,因为,当你真正想要的是共享内存时,创建一个文件是一种迂回的,hacky路线.(必须使用文件描述符仍然是hacky,但是比在那里使用文件更少hacky.文件描述符已经推广到不同类型的资源,例如套接字和设备.) (2认同)

jww*_*jww 6

有人可以解释为什么创造了ashmem吗?

David Turner(Android NDK的常规代表)在为什么删除了bionic/libc/include/sys/shm.h时回答了这个问题:

...系统V IPC已被移除用于蛋糕.有关详细信息,请参阅bionic/libc/docs/SYSV-IPC.TXT.

简而言之,System V IPC在设计上是泄漏的,并且在Android的运行时环境中不能很好地发挥作用,其中杀死进程为其他进程提供空间是正常且非常常见的.最终结果是依赖于这些IPC的任何代码都可能最终填满内核的SysV IPC密钥内部表,这只能通过重新启动来安全地解决.

我们希望在未来提供没有相同问题的替代机制.我们目前提供的一件事是ashmem,它是专门为Android设计的,以避免出现这种问题(虽然它没有记录得那么好).我们可能需要类似于信号量和/或消息队列的东西.