【问题标题】:What special powers does ashmem have?ashmem有什么特殊的能力?
【发布时间】:2012-04-15 18:49:44
【问题描述】:

谁能解释为什么要创建 ashmem?

我现在正在浏览mm/ashmem.c。据我所知,内核将 ashmem 视为可以 mmap 的文件支持的内存。但是,为什么还要麻烦实施 ashmem 呢?似乎可以通过挂载 RAM fs 然后使用 filemap/mmap 共享内存来实现相同的功能。

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

【问题讨论】:

    标签: android linux shared-memory


    【解决方案1】:

    Ashmem 允许与祖先无关的进程按名称共享内存映射,这些映射会被自动清理。

    普通的旧匿名 mmap 和 System V 共享内存缺少其中一些要求。

    当正在运行的程序不再引用 System V 共享内存段时(这有时是一个特性,有时是一个麻烦)。

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

    【讨论】:

    • 但是 ashmem 需要通过文件描述符共享。创建一个支持文件并允许每个进程映射它共享将实现相同的目标,不是吗?我知道这比 shmem 好,但它比拥有后备文件更好吗?
    • 这更好,因为,当你真正想要的是共享内存时创建一个文件是一种迂回的、笨拙的路线。 (必须使用文件描述符仍然是 hacky,但也比在其中拥有文件更 hacky。文件描述符已经泛化到不同类型的资源,例如套接字和设备。)
    • 固定和取消固定业务似乎可以让您在应用程序中实现高速缓存内存,当需要内存时它会消失,类似于内核缓冲区。 API 让您知道内存是否已被清除(您是否还有缓存)。
    • 嗨这可能是一个幼稚的问题,但是用 dalvik 字节码编写的 android 应用程序(不是本机应用程序)如何从 ASHMEM 中受益。他们有任何适用于应用程序开发人员的android框架中的api吗?
    • @Pbasak 当您的问题在此答案下方作为评论提出时,您的问题将很少受到关注。如果您需要这个问题的答案,请考虑将其设为 stackoverflow 问题。
    【解决方案2】:

    谁能解释为什么要创建 ashmem?

    David Turner(Android NDK 的常客)在Why was bionic/libc/include/sys/shm.h removed? 中回答了这个问题:

    ... 纸杯蛋糕的 System V IPC 已被删除。看 bionic/libc/docs/SYSV-IPC.TXT 了解详情。

    简而言之,System V IPC 在设计上存在漏洞,在 Android 的运行时环境,杀死进程以腾出空间 其他的只是正常的,很常见。最终结果是任何 依赖这些 IPC 的代码最终可能会填满内核的 SysV IPC 密钥的内部表,只能安全地保存 通过重启解决。

    我们希望在未来提供没有的替代机制 同样的问题。我们目前提供的一件事是 ashmem,它 专为Android设计以避免此类问题 (尽管它的文档记录不如应有的那么好)。我们可能需要 信号量和/或消息队列类似的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-06
      • 2011-05-07
      • 2015-06-15
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 2015-09-06
      • 1970-01-01
      相关资源
      最近更新 更多