4

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

如果记忆消失了,我总是可以稍后重新生成缩略图。

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


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

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

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

4

4 回答 4

4

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

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

HANDLE WINAPI CreateMemoryResourceNotification(
  _In_  MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);

NotificationType

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

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

于 2013-06-08T01:07:59.427 回答
2

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

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

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

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

因此,您的问题没有便携式解决方案。

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

于 2013-06-08T01:34:31.480 回答
0

这个问题非常相似,并且答案涵盖了此处未涵盖的内容。 分配“临时”内存(在 Linux 中)

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

自动释放缓存空间的所有基础知识已经存在于任何具有磁盘缓存的操作系统中,而且很难想象没有一个 API 可以产生巨大的差异,尤其是在移动 Web 浏览器之类的东西中。

于 2014-07-09T08:18:17.777 回答
0

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

于 2013-06-08T00:59:48.590 回答