在Mac上,vm_allocate()允许创建可清除的内存区域。当检测到内存压力时,内核可能会在任何时候(锁定时除外)回收此区域。它对于缓存数据等非常有用。
我想知道Linux (内核2.6)上是否存在类似的机制。谷歌搜索将我带到一些关于Android的信息,讨论可以被清除的共享内存的分配,但我还没有看到任何关于在普通Linux上实际做到这一点的API的讨论。查看mmap、shmat等的手册页时,没有显示用于设置可清除区域的标志。此功能在Linux上可用吗?
Android上关于此功能的说明如下所示:
MemoryFile Reference
MemoryFile Sample
谢谢!
发布于 2011-03-31 17:46:09
2.6.39-rc1中也有类似的系统。这就是所谓的“超越记忆”:
来自2011年的
提供的Transcendent Memory and Friends, TmemNotVirt-Linuxcon2011-Final.pdf (还列出了一些类似的术语)
更新:维基百科上也有short into:https://en.wikipedia.org/wiki/Transcendent_memory
在计算中,超越内存(
)是丹·马根海默探索的一个概念。超越内存是一类未知的动态可变大小的内存,只能由内核间接寻址,可以配置为持久的或“短暂的”(意味着它将存在一段时间,但可能在没有警告的情况下消失),并且仍然足够快,可以同步访问
可以将超越内存看作是一种RAM磁盘,它具有一些有趣的特性:没有人知道它有多大,写入磁盘可能不会成功,写入磁盘的数据可能会在再次读取之前消失。乍一看,它似乎是一种相对无用的设备,但人们希望超越内存能够在一些情况下提高性能。
由Oracle公司的Dan Magenheimer在Linux内核2.6.39.1实现中引入。Xen4.0支持虚拟机管理程序中的tmem。
发布于 2011-03-21 23:39:03
我从来没有听说过Linux有这样的特性。
在Linux中,内存可以在任何时候换出。如果它是一个文件支持的内存映射,那么它可以被写入磁盘并释放,而不是交换。
您所能得到的最接近的方法可能是定期检查当前内存使用情况并自行释放缓存,或者使用带有低内存通知程序的Linux内核,该通知程序将在内存压力较高时发送信号或文件句柄事件。
我之所以说补丁内核,是因为我不认为任何关于资源通知器的提议都已经被主线内核接受。Here was one attempt.
使用带有跟踪事件的较新内核,您可能会挂接内存压力跟踪,并以这种方式完成。不过,它并不能特别移植到其他Linux内核版本。
发布于 2011-03-22 07:40:35
感谢你的链接!我将代码挖掘到ashmem_pin_region函数。它是device 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.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似乎是谷歌的一个扩展:http://cs736-android.pbworks.com/w/page/5834465/ASHMEM http://elinux.org/Android_Kernel_Features,它不在主线上。
有一个(失败的)尝试推动它(在第一个记录器,解释信来自Greg "KH“在星期六,2009年11月28日晚上9:58,主题"Re:补丁0/2阶段/android修复”)。还有一个谷歌夏天的代码项目提案:http://elinux.org/Mainline_Android_kernel_functionality (这个页面有一个有用的链接和Greg KH关于谷歌的android补丁和linux的很好的演示文稿)。
https://stackoverflow.com/questions/5379347
复制相似问题