分配的内存可以在需要时由操作系统释放

Allocating memory that can be freed by the OS if needed

本文关键字:操作系统 释放 内存 分配      更新时间:2023-10-16

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

如果内存耗尽,我可以稍后重新生成缩略图。

是否有任何跨平台的方法来标记内存可以被删除,如果需要?程序是用c++编写的。


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

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

必须监控系统范围内的空闲内存数量可能无法实现目标(我的内存永远不会被回收以改善磁盘缓存),并且获得低内存通知只会在紧急情况下有所帮助。我希望通过使用lock/unlock方法,可以以更轻量的方式实现这一点,并使系统在非紧急情况下的性能受益。

是否有任何跨平台的方法来标记内存可以被删除,如果需要?该程序是用c++编写的

至少对于Windows,你可以注册一个内存资源通知。

HANDLE WINAPI CreateMemoryResourceNotification(
  _In_  MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);

NotificationType

  • LowMemoryResourceNotification可用物理内存不足
  • HighMemoryResourceNotification Available physical memory is high.

只是要小心响应事件。你可能会创建一个反馈循环(内存低,释放缩略图!)然后内存高,制作所有缩略图)。

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

在Linux中有一个关于在Linux中实现这个特性的讨论。但据我所知,它还没有在Linux中实现。也许他们认为应用程序不应该关心底层内存管理,它可以在操作系统中通过交换透明地处理。

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

但是不幸的是,当前的Linux实现会在posix_madvise被调用时立即释放内存范围。

所以你的问题没有便携的解决方案。

然而,在几乎每个操作系统上,你都可以通过一些操作系统接口读取当前可用的内存。因此,当OS中的可用内存不足时,您可以常规地读取这些值并手动释放内存。

您不需要做什么特别的事情。操作系统会自动从内存中删除最近没有使用过的东西。有些操作系统有特定于平台的方法来改进这一点,但通常不需要特别的操作。

这个问题非常相似,而且答案涵盖了这里没有涉及的内容。分配"temporary"内存(Linux)

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

自动释放缓存空间的所有基础都已经存在于任何带有磁盘缓存的操作系统中,很难想象没有一个API可以实现巨大的差异,特别是在移动web浏览器中。