![mmap()-ped 文件上的用户空间交换](https://linux22.com/image/164992/mmap()-ped%20%E6%96%87%E4%BB%B6%E4%B8%8A%E7%9A%84%E7%94%A8%E6%88%B7%E7%A9%BA%E9%97%B4%E4%BA%A4%E6%8D%A2.png)
想象一个具有非常小的内存(几乎是嵌入式的)的系统。对于几乎所有任务来说,这已经足够了,但有一个例外。有一个任务 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()
调用。但这并不是完全微不足道的。