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

时间:2010-10-12 11:37:41

标签: 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还没有消耗任何资源,它只是保证吧不会在foo ... foo + 3G范围内。

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

这是否可以在用户空间中使用?

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

谢谢。

2 个答案:

答案 0 :(得分:15)

简短的回答:它已经就是这样。

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

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

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

Here is some info关于这个主题。

答案 1 :(得分:0)

我认为,一个简单的方法就是使用大型static数组。

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

一旦达到物理内存的限制,你的程序将严重减慢,如果你的交换用完,你的程序会随机崩溃。