我希望(in * nix)分配一个庞大的,连续的地址空间,但是不会立即消耗资源,即我想要稍后保留一个地址范围.
假设我做foo = malloc(3 * 1024 * 1024 * 1024)来分配3G,但是在1G的交换文件的1G计算机上.它会失败,对吧?
我想做的是说“给我一个内存地址范围foo … foo 3G我将分配给我”,所以我可以保证在这个区域内的所有分配是连续的,但没有实际分配.
在上面的例子中,我想使用一个bar = malloc(123)调用来执行foo = reserve_memory(3G)调用,因为reserve_memory还没有消耗任何资源,所以它应该是成功的,它只是保证这个bar不在范围内foo … foo 3G.
后来我会做一些像alloc_for_real(foo,234)这样的东西来消耗foo范围的0..234的字节.在这一点上,内核将分配一些虚拟页面并将其映射到foo … foo 123 N
这是否可能在用户空间?
(这里的意思是,foo中的对象需要是连续的,创建后不能被合理地移动.)
谢谢.
解决方法
简短的答案:它已经这样工作了.
稍长的答案:坏消息是,没有特殊的方式来保留一个范围,而不是分配.然而,好消息是,当您分配一个范围时,Linux实际上并不会分配这个范围,而是稍后保留供您使用.
只要存在地址范围,Linux的默认行为就是始终接受新的分配.当您实际开始使用内存时,最好有一些内存或至少交换备份.如果没有,内核会杀死一个进程来释放内存,通常是分配最多内存的进程.
因此,使用默认设置的Linux中的问题会从“我可以分配多少”转移到“我可以分配多少,然后在开始使用内存时仍然存活”.
Here is some info关于这个问题.