将内存使用量保持在可用量内

时间:2010-09-24 09:53:53

标签: c++ c windows linux memory-management

我正在编写一个程序(一个定理证明器,因为它发生),其内存要求是“尽可能的,请”;也就是说,它总是可以通过使用更多内存来做得更好,出于实际目的而没有上限,所以它实际需要做的就是使用尽可能多的内存,不多也不少。我可以弄清楚当内存不足时如何优先处理数据以删除最低值的东西;我试图解决的问题是如何判断这种情况何时发生。

理想情况下,我希望系统调用返回“剩余多少内存”或“我们还没有内存?”;据我所知,不存在这样的事情吗?

当然,malloc可以通过返回0来表示内存不足,而new可以调用处理程序;这些都不是理想的信号,但总比没有好。然而,一个问题是我真的想知道物理内存何时耗尽,所以我可以避免深入交换,从而使一切都停止;我不认为有任何方式可以问“我们还要交换吗?”或告诉操作系统“不要交换我的帐户,如果涉及到这个问题就失败了我的请求”?

另一种方法是找出机器中有多少RAM,并监控程序目前使用多少内存。据我所知,通常没有办法告诉前者?我还得到的印象是没有可靠的方法来告诉后者,除非用bookkeeper函数包装malloc / free(这在C ++中更有问题)。

我有什么办法吗?

理想的是便携式解决方案,但我怀疑这不会发生。如果做不到这一点,在Windows上运行的解决方案和在Unix上运行的另一个解决方案将会很好。如果做不到这一点,我可以使用适用于Windows的解决方案和适用于Linux的另一种解决方案。

5 个答案:

答案 0 :(得分:6)

我认为使用所有可用内存的最有用和最灵活的方法是让用户指定要使用的内存量。

让用户在配置文件中或通过接口编写它,然后创建一个不会提供超过此内存的分配器(或类似的东西)。

这样,您不必查找有关当前计算机的统计信息,因为操作系统也可以运行其他程序,因此总会产生偏差。甚至不谈论操作系统管理缓存的方式,32位和64位之间的差异使得地址空间限制了您的分配等。

最后,人工智能(假设用户了解使用环境)在用户提供时实施起来更便宜。

答案 1 :(得分:3)

要了解系统内存仍未使用的数量,在Linux下,您可以解析文件/ proc / meminfo并查找以“MemFree:”开头的行。在Windows下,您可以使用GlobalMemoryStatusEx http://msdn.microsoft.com/en-us/library/aa366589%28VS.85%29.aspx

答案 2 :(得分:2)

当没有可用内存时,依赖malloc返回0可能会导致Linux出现问题,因为Linux overcommits memory allocationsmalloc通常会返回一个有效的指针(除非进程超出虚拟地址空间),但访问它指向的内存可能会触发"OOM killer",这种机制可以杀死你的进程或其他进程。系统。系统管理员可以tune this behavior

答案 3 :(得分:1)

我能想到的最佳解决方案可能是查询在最后一秒内发生了多少页面错误。如果进行了大量的交换,你应该释放一些内存,如果没有,你可以尝试分配更多的内存。

在Windows上,WMI可能会为您提供一些可以使用的统计信息。

但这是一个棘手的问题,因为没有硬性限制,你可以向操作系统询问,然后保持低于。您可以将内存分配到远远超出物理内存耗尽的位置,这意味着您将通过过度交换来削弱您的进程。

所以你真正做的最好的就是某种近似。

答案 4 :(得分:0)

您可以继续将内存分配到有用的位置 - 即需要操作系统交换或分页重要内容的内存。麻烦的是,这不一定很容易分辨出来。

此外,如果您的任务执行任何(重要的)IO,则需要留出一些用于OS缓冲区。

我建议只检查机器中有多少,然后根据该数量分配金额(比例,或保留一些免费等)。