mmap()-ped 文件上的用户空间交换

mmap()-ped 文件上的用户空间交换

想象一个具有非常小的内存(几乎是嵌入式的)的系统。对于几乎所有任务来说,这已经足够了,但有一个例外。有一个任务 X,它需要大量的 RAM,而机器却没有。

想象一下,交换也是不可能的(它是一个低内存虚拟机,主机提供商禁止交换)。

我想,我们可以

  • 创建一个大文件
  • mmap()-ing 它
  • 在 glibc 中“请求”(重新配置)malloc()使用此mmap()-ed 区域,而不是物理 RAM。

我们实际上拥有的是仅针对单个进程的用户空间级交换功能。

据我所知,glibc 的 malloc() 实现不是一个很好配置的实现,但是

  • 还有其他的malloc()实现
  • 甚至 glibc malloc 也不是很垃圾,只是深层次的发挥并不常见。

可能吗?是否存在任何或类似的解决方案?

答案1

绝对可以做这样的事情。每个进程需要一个文件才能轻松实现这一点。显然,您将受到虚拟机中磁盘空间的限制。性能也不会很好,因为内核会定期将内存刷新到磁盘。这可以通过使用一些 sysctl 可调参数(搜索 linux 定期写回)来缓解。

然后你必须将其插入malloc另一个。对于 glibc,有一个__morecore()钩子(查看 glibc 的malloc.h)可以用来替换sbrk().那不会抓住全部glibc 分配,因为在某些情况下,glibcmmap()直接调用而不是__morecore().这可以使用进行调整mallopt()。您还可以使用 LD_PRELOAD 库来捕获mmap()调用。但这并不是完全微不足道的。

相关内容