【问题标题】:Purgeable Memory Regions on LinuxLinux 上的可清除内存区域
【发布时间】:2011-03-21 14:52:04
【问题描述】:

在 Mac OS X 上,vm_allocate() 允许创建可清除内存区域。当检测到内存压力时,内核可以随时回收这个区域(除了它被锁定的时候)。它对于缓存数据等很有用。

我想知道 Linux(内核 2.6)上是否存在类似的机制。谷歌搜索让我找到了一些关于 Android 的信息,讨论了可能被清除的共享内存的分配,但我还没有看到任何关于在 vanilla Linux 上实际执行此操作的 API 的讨论。对mmapshmat 等的手册页的回顾显示没有设置可清除区域的标志。这个功能在 Linux 上可用吗?

有关此功能在 Android 上的说明如下:

MemoryFile Reference

MemoryFile Sample

谢谢!

【问题讨论】:

  • 来自XNU fxr.watson.org/fxr/source/osfmk/vm/…的一段代码
  • 感谢@osgx 的格式修复。 XNU 代码确实是我在 OS X 下看到的。
  • 你能添加一些关于android讨论的链接吗?

标签: linux caching linux-kernel memory-management


【解决方案1】:

在 2.6.39-rc1 中有类似的系统。叫做“超然记忆”:

更新:维基百科上也有简短的内容:https://en.wikipedia.org/wiki/Transcendent_memory

在计算中,超验内存(又名“tmem”)是 Dan Magenheimer 探索的一个概念。 超越内存是一类未知且动态可变大小的内存,只能由内核间接寻址,可以配置为持久内存或“临时内存”(意味着它会存在一段时间,但可能会在没有警告的情况下消失),并且仍然足够快,可以同步访问

可以将超内存想象成一种具有一些有趣特性的 RAM 磁盘:没有人知道它有多大,写入磁盘可能不会成功,并且,写入磁盘的数据可能会在被读回之前消失再次。乍一看,它可能看起来像是一种相对没用的设备,但希望超越记忆能够在某些情况下提高性能。

在 Linux 内核 2.6.39 中引入。[1][2]由 Oracle Corporation 的 Dan Magenheimer 实施。 Xen 4.0 在管理程序中支持 tmem。

【讨论】:

  • 这看起来可行。我猜只需要等待 2.6.39 稳定 :)
  • 感谢您的引用。我想知道为什么这篇文章从维基百科上被删除了:“文章大部分是复制粘贴的,缺乏不同的来源,可能不引人注目”。对我来说,这是一个相当模糊的理由。
【解决方案2】:

我从未听说过 Linux 有这样的功能。

在 Linux 中,内存可以随时换出。如果它是文件支持的内存映射,则可以将其写入磁盘并释放而不是交换。

您可能最接近的方法是定期检查当前内存使用情况并自行释放缓存,或者使用修补了内存不足通知程序的 Linux 内核,该通知程序将发送信号或文件句柄事件当内存压力大时。

我说一个打补丁的内核是因为我认为任何关于资源通知器的提议都没有被主线内核接受。 Here was one attempt.

使用带有跟踪事件的较新内核,您可能会挂钩内存压力跟踪并这样做。不过,它不能特别移植到其他 Linux 内核版本。

【讨论】:

    【解决方案3】:

    感谢您的链接!我挖掘代码到ashmem_pin_region 函数。它是设备http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-dev.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=1&ct=rc&l=76上的ioctl (ioctl(fd, ASHMEM_PIN, &pin);)

    主机上无操作:http://www.google.com/codesearch/p?hl=en#2wSbThBwwIw/libcutils/ashmem-host.c&q=ashmem_pin_region&exact_package=git://android.git.kernel.org/platform/system/core.git&sa=N&cd=2&ct=rc&l=86

    这是一个内核部分/kernel/msm.git›mm›ashmem.chttp://www.google.com/codesearch/p?hl=en#KMCRKdMbI4g/mm/ashmem.c&q=ASHMEM_PIN&exact_package=git://android.git.kernel.org/kernel/msm.git&sa=N&cd=1&ct=rc&l=463

    ASHMEM 似乎是一个 google 扩展:http://cs736-android.pbworks.com/w/page/5834465/ASHMEM http://elinux.org/Android_Kernel_Features 它不在主线中。

    有一个(失败的)尝试推送它(起初 - 记录器,并解释了 Greg “KH” 于 2009 年 11 月 28 日星期六晚上 9:58 发来的信,主题“Re: [PATCH 0/2]登台/安卓修复”)。还有一个谷歌夏天的代码项目提案:http://elinux.org/Mainline_Android_kernel_functionality(这个页面有一个有用的链接和来自 Greg KH 的关于谷歌的 android 补丁和 linux 的很好的演示。)

    【讨论】:

    • 这就是我所担心的,因为谷歌已经把它放在了 Android 上,所以该功能存在。感谢您挖掘这些信息!
    • 这正是我想要的。遗憾的是,从 3.13 开始,它不在主线内核中。
    【解决方案4】:

    似乎(据我所知),Linux 中的用户空间无法使用类似的界面。

    Apple 将可清除内存集成到 Mach 微内核中。他们通过专利http://www.faqs.org/patents/app/20090024809(美国专利7831784)保护这项技术。

    还有一些类似的,内核自己使用的——磁盘缓存(page cache)。它缓存页面,由 FS 支持。如果需要更多内存,可以删除它们(如果不是脏的)。更多信息请访问http://www.westnet.com/~gsmith/content/linux-pdflush.htm

    另外,madvise() 带有 MADV_DONTNEED 标志 (http://linux.die.net/man/2/madvise) 但这会立即释放(清除)给定的内存区域。

    【讨论】:

    • 我写了一个快速测试程序来试验madvise(),结果和你提到的一样。 pdflush 的东西似乎在内核中,对用户空间不可用。不确定添加后续问题是否合适,但是对于尝试实现缓存设置,您会建议什么,就像您可以通过 vm_allocate() 获得的那样?诀窍是让受影响的区域在系统内存压力下被丢弃——但当然,在用户空间中,您只能在内核尝试分配后收到通知,而不是在分配时收到通知。
    • 我只能写(或找到)一个特殊的虚拟文件系统,它允许在内存中存储,但不会在任何物理设备上备份(存储)数据,只能在页面缓存中。跨度>
    • 这样的文件系统必须在内核中,就像您上面提到的磁盘缓存一样,不是吗?对于这个应用程序(用户级应用程序),自定义文件系统有点矫枉过正。不过感谢您的帮助和想法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2015-10-14
    • 1970-01-01
    相关资源
    最近更新 更多