【问题标题】:LInux reserve memory for later allocation c++LINux为以后分配c ++保留内存
【发布时间】: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


【解决方案1】:

即使你分配了所有你需要的内存,在你的程序开始时,你害怕的情况是另一个进程会使用内存。除非你是那台机器上唯一的进程,否则总会有另一个正在运行的进程。因此,您想要的解决方案是一个“保留”的 RAM 空间,除了您的进程之外没有人可以访问。这意味着内核永远不会将此空间交换为 HD(因此内核不会执行任何物理访问)。

幸运的是,除非您更改内核并重新编译它,否则这是不可能的。考虑一下您有多个进程为自己“保留”内存的可能性。如果您有 4Gb RAM,那么您将被卡住:(

【讨论】:

    猜你喜欢
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2014-03-04
    • 2011-01-30
    • 2020-08-12
    相关资源
    最近更新 更多