【发布时间】: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块分配不太可能成功。
-
实际上或物理上连续?