如何在不分配内存地址的情况下保留内存地址

spr*_*aff 10 c linux memory

我想(在*nix中)分配一个大的,有条不紊的地址空间,但不会立即消耗资源,即我想保留一个地址范围,以后再分配它.

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

我想要做的是说"给我一个内存地址范围foo ... foo + 3G 我将分配 ",所以我可以保证这个区域内的所有分配都是连续的,但没有直接分配.

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

稍后我会做一些像allocate_for_real(foo,0,234)那样消耗foo范围的字节0..234.此时,内核将分配一些虚拟页面并将它们映射到foo ... foo + 123 + N.

这在用户空间是否可行?

(关键在于foo中的对象需要连续,并且在创建后无法合理地移动.)

谢谢.

Pro*_*ica 15

简短的回答:它已经这样运作了.

稍微长一点的回答:坏消息是没有特殊的方法来保留范围,但没有分配范围.然而,好消息是,当你分配一个范围时,Linux实际上并没有分配它,它只是保留它供你使用,稍后.

Linux的默认行为是始终接受新的分配,只要剩下地址范围.当你真正开始使用内存时,最好有一些内存或至少交换备份.如果没有,内核将终止一个释放内存的进程,通常是分配最多内存的进程.

因此,使用默认设置的Linux中的问题从"我可以分配多少"转变为" 当我开始使用内存时,我可以分配多少然后仍然活着?"

以下是有关该主题的一些信息.