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

前端之家收集整理的这篇文章主要介绍了如何在不分配内存的情况下保留内存地址前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我希望(in * nix)分配一个庞大的,连续的地址空间,但是不会立即消耗资源,即我想要稍后保留一个地址范围.

假设我做foo = malloc(3 * 1024 * 1024 * 1024)来分配3G,但是在1G的交换文件的1G计算机上.它会失败,对吧?

我想做的是说“给我一个内存地址范围foo … foo 3G我将分配给我”,所以我可以保证在这个区域内的所有分配是连续的,但没有实际分配.

在上面的例子中,我想使用一个bar = malloc(123)调用来执行foo = reserve_memory(3G)调用,因为reserve_memory还没有消耗任何资源,所以它应该是成功的,它只是保证这个bar不在范围内foo … foo 3G.

后来我会做一些像alloc_for_real(foo,234)这样的东西来消耗foo范围的0..234的字节.在这一点上,内核将分配一些虚拟页面并将其映射到foo … foo 123 N

这是否可能在用户空间?

(这里的意思是,foo中的对象需要是连续的,创建后不能被合理地移动.)

谢谢.

解决方法

简短的答案:它已经这样工作了.

稍长的答案:坏消息是,没有特殊的方式来保留一个范围,而不是分配.然而,好消息是,当您分配一个范围时,Linux实际上并不会分配这个范围,而是稍后保留供您使用.

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

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

Here is some info关于这个问题.

猜你在找的C&C++相关文章