【发布时间】:2014-02-12 08:35:22
【问题描述】:
考虑一个使用大量页面大小的内存区域(比如 64 kB 左右)的程序,每个内存区域的寿命都很短。 (在我的特殊情况下,这些是绿色线程的备用堆栈。)
如何最好地分配这些区域,以便一旦该区域不再使用,它们的页面就可以返回给内核?天真的解决方案显然是简单地 mmap 每个区域单独,并在我完成它们后再次 munmap 它们。不过,我觉得这是一个坏主意,因为它们太多了。我怀疑 VMM 可能会在一段时间后开始严重扩展;但即使没有,我仍然对理论案例感兴趣。
如果我只是 mmap 自己一个巨大的匿名映射,我可以根据需要分配区域,有没有办法通过该映射为我完成的区域“打孔”?有点像madvise(MADV_DONTNEED),但不同之处在于这些页面应该被视为已删除,因此内核实际上不需要将其内容保留在任何地方,而是可以在它们再次出现故障时重用归零的页面。
我使用的是 Linux,在这种情况下,我不会因为使用特定于 Linux 的调用而烦恼。
【问题讨论】:
-
什么是“多”?几十万?
-
@unwind:老实说,我对理论案例比对实际案例更感兴趣,所以假设是数百万。 :)
-
我不太确定你所说的理论是什么意思。您的问题是一个具体的工程问题,取决于很多因素。我什至不确定linux的具体版本对这类问题没有影响。您的问题基本上归结为,您是否应该在用户空间中模拟系统任务(大块的内存分配)。如果您被困在一个相关功能实施不佳的平台上,您应该只问自己这样的问题。我不认为linux是这种情况,VM管理相当复杂。
-
@JensGustedt:我的意思是能够在内存本身中打孔的问题,而不是在特定的前提下它是否有用。
-
@Dolda2000 但您的基本假设是,仅以最直接的方式使用 API 是不好的,即您可以在用户空间中做得更好。这是一个......不危险,但“奇怪”的概念。内核应该在这些方面擅长。如果它不能管理一百万个
mmap()ed 区域,那么它就坏了,你不应该花时间尝试在用户空间中解决它。至少这是我的感觉,但我不是内核开发人员。