【发布时间】:2016-12-01 10:01:42
【问题描述】:
是否有可能为 c++ 程序中的后续分配保留内存?
背景: 我正在使用 Preempt RT 补丁开发 Debian。我的程序使用大约 100MB 内存。防止所有页面与 mlockall() 交换。主要有2个运行线程,1个实时运行,不分配内存。另一个线程以略低的优先级运行并分配/释放内存。 在极少数情况下,后台进程会分配所有空闲内存并且系统开始交换。现在我的“快速”线程需要一小块内存。现在内核给了我那个新的小块,但来自交换。所以我的程序被一个巨大的延迟打断了,比如说 3 秒。
问题: 有没有办法保留内存,比如说200MB。如果我的程序将分配它肯定可以不交换?
【问题讨论】:
-
我不明白。如果您的所有页面都锁定在内存中,它们如何被换出?如果您的 fast 线程需要一些 extra 内存(例如,因为它的堆栈正在增长),解决方案是确保堆栈在启动时增长超过其最大值,然后锁定整个堆栈。
-
但是你说你的实时线程不分配内存。如果你的意思是它只分配一点内存,而不是经常分配,那么你需要确保它从分配器中获取内存,该分配器返回由后台线程预先锁定的内存。
-
我所有的实际页面都运行良好。但我的 fast 线程想要在堆上分配新页面。有空闲内存,但仅在磁盘上的交换中,而不在物理内存中。所以内核中断了我的 fast 线程很长一段时间,将一些其他页面交换到磁盘,在 ram 中给我那个新页面。此时,而不是更早,
mlockall(MCL_FUTURE)将阻止此页面被换出。 -
@flunk:那为什么不在程序开始时分配呢?
-
基本上你不能只分配你需要的内存并且在RAM中有虚拟内存供你的实时线程使用。选一个。 (我会预先分配可配置的内存量,然后让用户自己弄清楚。)
标签: c++ linux memory-management