在Mac OS X上,vm_allocate()
允许创建可清除的内存区域。当检测到记忆压力时,内核可以在任何时间(除非被锁定时)被内核回收。它对于缓存数据等很有用。
我想知道Linux(内核2.6)上是否存在类似的机制。谷歌搜索引导我在Android上讨论可能被清除的共享内存分配的一些信息,但我还没有看到任何有关在vanilla Linux上实际执行此操作的API的讨论。对mmap
,shmat
等的手册页的查看显示没有用于设置可清除区域的标志。 Linux上是否提供此功能?
Android上有关此功能的说明如下:
谢谢!
答案 0 :(得分:2)
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。
答案 1 :(得分:1)
我从来没有听说过Linux这样的功能。
在Linux中,内存可以随时换出。如果它是一个由文件支持的内存映射,那么它可以写入磁盘并释放而不是交换。
您可以获得的最接近的是定期检查当前内存使用情况并自行释放缓存,或者使用带有低内存通知程序的Linux内核,该内存通知程序将发送信号或文件句柄事件当记忆压力很高时。
我说修补内核是因为我认为资源通知程序的任何提议都没有被接受到主线内核中。 Here was one attempt.
使用具有跟踪事件的较新内核,您可以挂钩内存压力跟踪并以此方式执行。但它对其他Linux内核版本来说并不是特别容易移植。
答案 2 :(得分:1)
感谢您的链接!我将代码挖掘到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);
)
主持人
这是一个内核部分/kernel/msm.git›mm›ashmem.c
:http://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它不在主线中。
有一个(失败的)尝试推动它(首先是记录器,并在2009年11月28日星期六晚上9点58分解释来自Greg“KH”的信,主题为“Re:[PATCH 0/2] staging / android修复“)。还有一个谷歌夏季的代码项目提案:http://elinux.org/Mainline_Android_kernel_functionality(这个页面有一个有用的链接和Greg KH关于谷歌的Android补丁和linux的一个很好的演示。)
答案 3 :(得分:0)
似乎(尽我所能),Linux中没有类似的接口可用于用户空间。
Apple可以将可清除内存集成到Mach microkernel中。他们通过专利http://www.faqs.org/patents/app/20090024809(美国专利7831784)保护这项技术。
内核本身使用了一些类似的东西 - 磁盘缓存(页面缓存)。它缓存由FS支持的页面。如果需要更多内存,则可以删除它们(如果不是脏的话)。有关这方面的更多信息,请访问http://www.westnet.com/~gsmith/content/linux-pdflush.htm
此外,madvise()
带有MADV_DONTNEED
标志(http://linux.die.net/man/2/madvise),但这会立即释放(清除)给定的内存区域。