我如何保留内存地址而不分配它们

我希望(在* nix中)分配一个大的连续的地址空间,但是不要马上消耗资源,也就是说我想保留一个地址范围,以后再分配给它。

假设我做foo = malloc(3 * 1024 * 1024 * 1024)来分配3G,但是在1G的计算机上有1G的交换文件。 它会失败,对吧?

我想要做的是说“给我一个内存地址范围foo … foo + 3G 我将分配 ”,所以我可以保证在这个区域内的所有分配是连续的,但没有实际分配直接。

在上面的例子中,我想跟随一个bar = malloc(123)调用foo = reserve_memory(3G)调用,它应该成功,因为reserve_memory还没有消耗任何资源,它只是保证吧不会在范围内烟草工业富+ 3G。

后来我会做一些像allocate_for_real(foo,0,234)来消耗foo范围的字节0..234。 在这一点上,内核将分配一些虚拟页面,并将它们映射到foo + 123 + N

这是可能的用户空间?

(这一点是foo中的对象需要是连续的,创build后不能合理地移动。)

谢谢。

Solutions Collecting From Web of "我如何保留内存地址而不分配它们"

简短的回答:它已经这样工作。

稍微长一点的答案:坏消息是,没有特殊的方式来保留范围,但没有分配它。 然而, 消息是,当你分配一个范围时,Linux并没有真正分配它,只是在稍后保留它供你使用。

Linux的默认行为是总是接受一个新的分配,只要有剩下的地址范围 。 当你真正开始使用内存的时候,最好有一些内存或者至少把内存换掉。 如果没有,内核将杀死一个进程来释放内存,通常是分配最多内存的进程。

因此,Linux中默认设置的问题从“我可以分配多少”转移到“当我开始使用内存时,我可以分配多少, 然后还活着

这里是关于这个问题的一些信息 。

我想,一个简单的方法就是用一个大的static数组来做到这一点。

在任何现代系统上,除非你真的能够访问它,否则它不会被映射到现有的存储器(在磁盘上的可执行文件或执行机器的RAM中)。 一旦你访问它(并且系统有足够的资源),它将被奇迹般地初始化为全零。

一旦你达到物理内存的限制,你的程序将严重放慢速度,然后如果用完swap,就会随机崩溃。