有人能解释一下为什么要创建ashmem吗?
我现在正在浏览mm/ashmem.c。据我所知,内核认为ashmem是可以映射的文件备份内存,但是,为什么要麻烦地实现ashmem呢?似乎可以通过挂载RAM文件系统,然后使用filemap/mmap共享内存来实现相同的功能。
我确信ashmem可以做更多花哨的事情--从代码上看,它似乎与固定/取消固定页面有关?
发布于 2012-04-02 12:25:15
Ashmem允许与祖先无关的进程按名称共享内存映射,这些内存映射会自动清除。
普通的匿名mmap和System V共享内存缺少其中的一些要求。
当运行的程序不再引用System V共享内存段时(这有时是一种特性,有时是一种麻烦)。
匿名共享mmap可以从父进程传递到子进程,这是不灵活的,因为有时您希望不相关的进程以这种方式共享内存。
发布于 2013-07-07 07:06:52
有人能解释一下为什么要创建ashmem吗?
David Turner ( Android NDK的常客)用Why was bionic/libc/include/sys/shm.h removed?回答了这个问题
...对于纸杯蛋糕,系统V IPC已被删除。有关详细信息,请参阅bionic/libc/docs/SYSV-IPC.TXT。
简而言之,System V IPC在设计上是有漏洞的,并且在Android的运行时环境中不能很好地发挥作用,在Android的运行时环境中,杀死进程来为其他进程腾出空间是很正常的,也是非常常见的。最终的结果是,依赖于这些IPC的任何代码都可能最终填满内核的SysV IPC键的内部表,这只能通过重新启动来安全地解决。
我们希望在未来提供不存在相同问题的替代机制。我们目前提供的一件事是ashmem,它是专门为Android设计的,以避免这种问题(尽管它没有足够的文档记录)。对于信号量和/或消息队列,我们可能需要类似的东西。
https://stackoverflow.com/questions/9970858
复制相似问题