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

C 如何在不分配内存地址的情况下保留内存地址,c,linux,memory,C,Linux,Memory,我希望(在*nix中)分配一个大的、连续的地址空间,但不立即消耗资源,也就是说,我想保留一个地址范围,以后再从中分配 假设我使用foo=malloc(3*1024*1024*1024)来分配3G,但是在一台1G计算机上使用1G交换文件。它会失败,对吗 我想做的是说“给我一个内存地址范围foo…foo+3G,我将分配到其中”,这样我就可以保证这个区域内的所有分配都是连续的,但实际上不会立即分配 在上面的例子中,我想用bar=malloc(123)调用foo=reserve\u memory(3G)

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

假设我使用foo=malloc(3*1024*1024*1024)来分配3G,但是在一台1G计算机上使用1G交换文件。它会失败,对吗

我想做的是说“给我一个内存地址范围foo…foo+3G,我将分配到其中”,这样我就可以保证这个区域内的所有分配都是连续的,但实际上不会立即分配

在上面的例子中,我想用bar=malloc(123)调用foo=reserve\u memory(3G)来跟踪这个调用,这个调用应该会成功,因为reserve\u memory还没有消耗任何资源,它只是保证bar不会在foo…foo+3G的范围内

稍后,我会做一些类似于将_分配给_real(foo,0234)的事情,以消耗foo范围的0..234字节。此时,内核将分配一些虚拟页面并将它们映射到foo…foo+123+N

这在用户空间中是可能的吗

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


谢谢。

简短的回答:它已经可以这样工作了

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

Linux的默认行为是始终接受新的分配,只要还有地址范围。当你真正开始使用内存的时候,最好有一些内存或者至少交换备份。否则,内核将杀死一个进程以释放内存,通常是分配了最多内存的进程

因此,Linux中默认设置的问题从“我可以分配多少”转变为“我可以分配多少,然后在开始使用内存时仍然有效?”


关于这个主题。

我认为,一个简单的方法是使用一个大的
静态
数组

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


一旦达到物理内存的限制,您的程序将严重减速,如果交换空间不足,程序将随机崩溃。

我希望您是在64位平台上,否则3G块分配不太可能成功。虚拟或物理连续?这很好。你能告诉我如何找到这方面的文档吗?一个大的静态数组和一个malloc一样有效,最后也是一样的。