我想在Linux/C/C++中使用任意大的缓冲区

Chr*_*ris 6 c c++ linux virtual-memory

基本上我想要一个任意大的堆栈.我知道这是不可能的,但是我能为它留出几TB的虚拟地址空间吗?我希望能够从头开始,并根据需要走缓冲区,Linux可以根据需要从物理内存中引入页面.有可能吗?它是否具有与仅使用malloc-a缓冲区相同的性能?一旦你弹出堆栈,是否有办法向Linux发信号通知你已完成内存?

编辑:我想要这个,因为我想优化一个递归/并行算法,在每次调用时分配大量内存.Malloc对我来说太慢了,我不希望所有的线程都在malloc的锁内相互绊倒.所以基本上它将是我自己的运行时堆栈与真实堆栈(每个线程一个).

实际上,只要运行时堆栈足够大就应该足够好.有没有办法知道/确保堆栈的大小?在64位地址空间中,有足够的空间可以将多个线程堆叠 - 分配千兆字节的数据.那可行吗?

看起来pthread_attr_setstacksize可以用于新线程,但是如果可以从任何线程调用那么这没有多大帮助......

caf*_*caf 1

mmap()您可以使用标志来创建这样的分配MAP_ANONYMOUS | MAP_NORESERVE | MAP_PRIVATE。当您想将其释放回系统时,请使用munmap().

请注意,您要确定是否有足够的内存来满足您的实际使用,唯一的方法是让您的进程接收SIGSEGV- 但这涉及到要求比可用内存大得多的巨大映射的范围。