我希望(在* nix中)分配一个大的,有条不紊的地址空间,但不会立即消耗资源,即我想保留一个地址范围,以后再从中分配。
假设我做foo = malloc(3 * 1024 * 1024 * 1024)来分配3G,但是在1G计算机上有1G的交换文件。它会失败,对吗?
我想要做的是说“给我一个内存地址范围foo ... foo + 3G 我将分配”所以我可以保证这个区域内的所有分配都是连续的,但没有直接分配。
在上面的例子中,我想跟随一个bar = malloc(123)调用的foo = reserve_memory(3G)调用,该调用应该成功,因为reserve_memory还没有消耗任何资源,它只是保证吧不会在foo ... foo + 3G范围内。
稍后我会做像allocate_for_real(foo,0,234)那样消耗foo范围的字节0..234。此时,内核将分配一些虚拟页面并将它们映射到foo ... foo + 123 + N
这是否可以在用户空间中使用?
(关键在于foo中的对象需要连续,并且在创建后无法合理地移动。)
谢谢。
答案 0 :(得分:15)
简短的回答:它已经就是这样。
稍微长一点的回答:坏消息是没有特殊的方式来保留范围,但没有分配范围。然而,好新闻是,当你分配一个范围时,Linux实际上并没有分配它,它只是保留它供你使用,稍后。
Linux的默认行为是始终接受新的分配,只要剩下地址 range 即可。当你真正开始使用内存时,最好有一些内存或至少交换备份。如果没有,内核将终止一个释放内存的进程,通常是分配最多内存的进程。
因此,当我开始使用内存时,Linux中使用默认设置的问题会从“我可以分配多少”转移到“我可以分配多少,然后仍然活着”?
Here is some info关于这个主题。
答案 1 :(得分:0)
我认为,一个简单的方法就是使用大型static
数组。
在任何现代系统中,除非您真正访问它,否则它不会映射到现有内存(在磁盘上的可执行文件中或执行机器的RAM中)。一旦你访问它(并且系统有足够的资源),它将奇迹般地初始化为全零。
一旦达到物理内存的限制,你的程序将严重减慢,如果你的交换用完,你的程序会随机崩溃。