【发布时间】:2014-04-20 16:32:59
【问题描述】:
我正在尝试找到任何允许进程分配“临时”内存的系统功能 - 即被进程视为可丢弃的内存,并且可以在需要内存时被系统带走,但允许尽可能从可用内存中受益的进程。换句话说,进程告诉系统在进程不使用内存块时牺牲它是可以的。释放块也比交换它更可取(交换它而不是重建它的内容更昂贵或同样昂贵)。
系统(例如 Linux)在内核中有这些东西,例如 F/S 内存缓存。我正在寻找类似的东西,但对用户空间可用。
我知道有一些方法可以从程序中做到这一点,但处理这个问题实际上更多的是内核工作。在某种程度上,我在问内核:
- 如果您需要减少我或其他进程的驻留,请先关闭这些临时页面
- 如果您要关闭这些临时页面,请不要将它们换掉,只需取消映射即可
具体来说,我对适用于 Linux 的解决方案很感兴趣,但有兴趣了解是否存在适用于任何其他操作系统的解决方案。
更新
我希望它如何工作的示例:
- 映射页面(过度交换)。与现在可用的内容没有区别。
- 告诉内核该页面是“临时的”(因为没有更好的名称),这意味着如果该页面消失,我不希望它被分页。
- 告诉内核我需要临时页面“返回”。如果页面在我将其标记为“临时”后未映射,我会被告知发生了这种情况。如果没有,则它开始表现得像一个常规页面。
以下是现有 MM 需要解决的问题:
要使页面不被分页,我必须将它们分配给空。但是,他们可以随时被调出,恕不另行通知。使用 mincore() 进行测试并不能保证在 mincore() 完成时页面仍然存在。使用 mlock() 需要提升的权限。
所以,我最接近的方法是使用 mlock() 和匿名页面。按照我之前概述的期望,它将是:
- 映射一个匿名的锁定页面。 (MAP_ANON|MAP_LOCKED|MAP_NORESERVE)。用魔法在页面上加盖印章。
- 为了使页面“临时”,解锁页面
- 当需要页面时,再次锁定它。如果魔法存在,那就是我的数据,否则它就丢失了,我需要重新构建它。
但是,当我使用页面时,我真的不需要将页面锁定在 RAM 中。此外,如果内存过度使用,MAP_NORESERVE 也会出现问题。
【问题讨论】:
-
您还需要内核在丢弃页面时告诉您的进程……这是一个难题。
-
@BasileStarynkevitch 一点也不。我只需要“签出”一个页面。如果它存在,我会得到它,并且在我重新签入之前它不再是临时的。
-
在下面查看我的改进答案。当内核已调出某个页面并再次调入(因为您的程序访问它)时,您希望发生什么? 请编辑您的问题以改进它
标签: linux memory memory-management