在我们的产品中,我们使用malloc
完全依赖 mmap 进行内存分配的实现。我们也公平地使用alloca
ing。我们刚刚遇到了一个问题,mmap 将分配应该保留给堆栈空间的区域(因此,当我们的一个较大的 alloca 溢出到 malloc 的区域中时,会导致非常糟糕的事情发生)。
我们进程分配的限制是我们的VM地址空间,而不是物理内存。我们在进程运行时观察了 /proc/*/maps 文件,并观察了 malloc 占用了所有可用的地址空间。它最终诉诸于在堆栈 rlimit-set 范围内分配地址,并最终alloca
延伸到其中。
我们试图通过alloca
在启动时设置我们的整个堆栈限制来解决它,但这并没有证明跨平台稳定(它尝试访问alloca
我的 2.4 开发盒上的 d 内存时出现段错误,而它在 2.6 生产机器上工作) .
有没有办法实际保留地址空间?还有什么可以做的?