每当使用 new / malloc 时,操作系统都会创建一个新的(或重用)堆内存段,与页面大小对齐并将其返回给调用进程。所有这些分配将构成进程的虚拟内存。在 32 位计算中,任何进程最多只能扩展到 4 GB。堆分配越高,进程内存的增加率越高。尽管有很多可用的内存管理/内存池,但所有这些实用程序最终都会再次创建一个堆并有效地重用它。
另一方面,mmap(内存映射)提供了将文件可视化为内存流的能力,并使程序能够直接在文件上使用指针操作。但在这里,mmap 实际上是在进程空间中分配地址范围。因此,如果我们 mmap 一个大小为 3GB 的 3GB 文件并获取进程的 pmap,您可以看到该进程消耗的总内存 >= 3GB。
我的问题是,是否可以有一个基于文件的内存池[就像映射文件一样],但是,它并不构成进程内存空间。我想象一下像内存数据库这样的东西,它由一个文件支持,读/写速度非常快,它支持指针操作[即获取指向记录的指针并存储任何东西,就像我们使用 new / malloc 一样],它可以在磁盘上增长,而无需触及进程虚拟 4GB 限制。
可能吗 ?如果是这样,我开始工作的一些指示是什么。我不是要求一个现成的解决方案/链接,而是从概念上理解它是如何实现的。