【问题标题】:How can I reserve memory addresses without allocating them如何保留内存地址而不分配它们
【发布时间】:2011-04-24 06:33:58
【问题描述】:

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

假设我执行 foo=malloc(3*1024*1024*1024) 分配 3G,但在具有 1G 交换文件的 1G 计算机上。它会失败,对吧?

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

在上面的示例中,我想在 foo=reserve_memory(3G) 调用之后使用 bar=malloc(123) 调用,该调用应该会成功,因为 reserve_memory 尚未消耗任何资源,它只是保证 bar 不会在 foo...foo+3G 范围内。

稍后我会执行 allocate_for_real(foo,0,234) 之类的操作来消耗 foo 范围的 0..234 字节。此时,内核会分配一些虚拟页面并将它们映射到 foo...foo+123+N

这在用户空间中可行吗?

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

谢谢。

【问题讨论】:

  • 希望你是64位平台,否则3G块分配不太可能成功。
  • 实际上或物理上连续?

标签: c linux memory


【解决方案1】:

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

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

Linux 的默认行为是总是接受新的分配,只要还有地址 range。但是,当您实际开始使用内存时,最好有一些内存或至少交换备份。如果没有,内核会杀死一个进程来释放内存,通常是分配内存最多的进程。

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

Here is some info 关于这个主题。

【讨论】:

  • 很高兴知道这一点。你能告诉我如何找到这方面的文档吗?
【解决方案2】:

我认为,一种简单的方法是使用大型 static 数组来实现。

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

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

【讨论】:

  • 一个大的静态数组可以和一个malloc一样工作,最后都是一样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多