如果需要,可以分配操作系统可以释放的内存

时间:2013-06-08 00:57:25

标签: c++ caching memory-management

我正在编写一个程序,为大型文档中的每个页面生成缩略图。出于性能原因,我想尽可能长时间地将缩略图保留在内存中,但我希望操作系统能够回收该内存,如果它确定有另一个更重要的用途(例如用户已开始运行不同的应用。)

如果内存已经消失,我总是可以在以后重新生成缩略图。

是否有任何跨平台方法可以将内存标记为可以删除(如果需要)?该程序是用C ++编写的。


编辑:只是为了澄清,而不是在内存不足时通知或定期监视系统的内存量,我正在考虑分配内存,然后在不使用时“解锁”它。然后操作系统可以在需要时窃取未锁定的内存(即使对于磁盘缓冲区,如果它认为可以更好地利用内存),我只需要做程序员就可以在我打算使用它之前再次“锁定”内存。如果锁失败,我知道内存已被重用于其他内容,所以我需要再次重新生成缩略图,如果锁成功,我可以继续使用之前的数据。

原因是我可能在屏幕上显示可能有20页的文档,但我也可以保留其他200页左右的缩略图以防用户滚动一下。但如果他们暂时做其他事情,那个内存可能会更好地用作磁盘缓存或用于存储网页或其他内容,所以我希望能够告诉操作系统它可以重用我的一些内存,如果它想要。

必须监控系统范围内的可用内存量可能无法达到目标(我的内存永远不会被回收以改善磁盘缓存),获取低内存通知只会在紧急情况下发挥作用。我希望通过锁定/解锁方法,这可以通过更轻量级的方式实现,并在非紧急情况下有益于系统的性能。

4 个答案:

答案 0 :(得分:4)

  

是否有任何跨平台方法可以将内存标记为可以删除(如果需要)?该程序是用C ++编写的

对于Windows,至少可以register for a memory resource notification

HANDLE WINAPI CreateMemoryResourceNotification(
  _In_  MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);
  

NotificationType

     
      
  • LowMemoryResourceNotification可用的物理内存不足。
  •   
  • HighMemoryResourceNotification可用的物理内存很高。
  •   

小心回应两个事件。您可以创建一个反馈循环(内存不足,释放缩略图!然后内存很高,制作所有缩略图!)。

答案 1 :(得分:2)

在AIX中,当可用内存不足时,会有一个信号SIGDANGER发送到应用程序。你可以处理这个信号并释放一些记忆。

Linux人员之间正在讨论将此功能实现到Linux中。但AFAIK尚未在Linux中实现。也许他们认为应用程序不应该关心低级内存管理,它可以通过交换在操作系统中透明地处理。

在posix标准中,有一个函数posix_madvise可能用于将内存区域标记为不太重要。有一条建议POSIX_MADV_DONTNEED指定应用程序期望它在不久的将来不会访问指定的范围。

但遗憾的是,当使用此建议调用posix_madvise时,当前的Linux实现将立即释放内存范围。

因此,您的问题没有可移植的解决方案。

但是,在几乎所有操作系统上,您都可以通过某些操作系统界面读取当前可用内存。因此,当OS中的可用内存不足时,您可以定期读取此值并手动释放内存。

答案 2 :(得分:0)

你没什么需要做的。如果最近没有自动使用,操作系统将从内存中删除内容。一些操作系统具有特定于平台的方法来改进这一点,但通常不需要特殊的东西。

答案 3 :(得分:0)

这个问题非常相似,并且答案涵盖了此处未涉及的内容。 Allocating "temporary" memory (in Linux)

这应该不会太难做,因为这正是页面缓存所做的,使用未使用的内存来缓存硬盘。从理论上讲,有人可以编写一个文件系统,当你从某个文件中读取时,它会计算出一些东西,页面缓存会自动缓存它。

自动释放缓存空间的所有基础知识已经存在于任何具有磁盘缓存的操作系统中,并且很难想象不存在能够产生巨大差异的API,尤其是在移动Web浏览器等方面。