ashmem有什么特殊功能?

31

有人能解释一下为什么要创建ashmem吗?

我正在浏览mm/ashmem.c。据我所知,内核认为ashmem是可进行mmap映射的文件后端内存。但那么,为什么要费力地实现ashmem呢?似乎可以通过挂载RAM fs,然后使用filemap/mmap来共享内存实现相同的功能。

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

2个回答

28

Ashmem允许没有血缘关系的进程通过名称共享内存映射,这些映射会自动清理。

普通的匿名内存映射和System V共享内存缺少一些要求。

当运行的程序不再引用时,System V共享内存段会继续存在(这有时是一种功能,有时是一种麻烦)。

匿名共享映射可以从父进程传递给子进程,这很不灵活,因为有时您希望没有这种关系的进程共享内存。


3
但是ashmem需要通过文件描述符进行共享。创建一个支持文件并允许每个进程将其mmap为共享的方式可以实现相同的目标,对吗?我明白这比shmem更好,但它怎么比有支持文件更好呢? - Robert Martin
2
这样做更好,因为创建文件时,当你真正想要的是共享内存时,这种方法有点绕路和不专业。虽然必须使用文件描述符仍然有些不专业,但比同时存在一个文件要好得多。文件描述符已经推广到不同类型的资源,例如套接字和设备。 - Kaz
那个固定和取消固定的操作似乎让你在应用程序中实现缓存内存,当需要内存时它会消失,类似于内核缓冲区。API会让你知道内存是否已被清除(你是否仍然拥有缓存)。 - Kaz
1
嗨,这可能是一个天真的问题,但是那些使用dalvik字节码编写的Android应用程序(非本地应用程序)如何从ASHMEM中受益? Android框架中是否有适用于应用程序开发人员的API? - P basak
6
如果您在回答下方留言提问,那么您的问题可能会得到很少的关注。如果您需要答案,请考虑在Stack Overflow上发布问题。 - Kaz

9

请问为什么会创建ashmem?

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

……Cupcake中已经删除了System V IPC。有关详细信息,请参见bionic/libc/docs/SYSV-IPC.TXT。

简而言之,System V IPC是设计上存在漏洞的,不适用于Android的运行时环境,因为杀死进程以为其他进程腾出空间是非常普遍的。最终结果是,任何依赖这些IPC的代码都可能填满内核的SysV IPC密钥内部表,这只能通过重新启动来安全地解决。

我们希望未来提供不具有相同问题的替代机制。我们目前提供的一种机制是ashmem,它专门为Android设计,以避免这种问题(尽管它的文档不够完善)。我们可能需要类似的机制来处理信号量和/或消息队列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接