Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 分配操作系统可以在需要时释放的内存_C++_Caching_Memory Management - Fatal编程技术网

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

C++ 分配操作系统可以在需要时释放的内存,c++,caching,memory-management,C++,Caching,Memory Management,我正在编写一个程序,为大型文档中的每个页面生成缩略图。出于性能原因,我希望尽可能长时间地将缩略图保存在内存中,但我希望操作系统能够回收该内存,前提是它确定该内存还有其他更重要的用途(例如,用户已开始运行不同的应用程序) 如果内存消失了,我可以随时重新生成缩略图 是否有跨平台的方法标记内存,以便在需要时删除?程序用C++编写, 编辑:我只是想澄清一下,我不是在内存不足时得到通知,也不是定期监控系统的内存量,而是更多地考虑分配内存,然后在不使用时“解锁”内存。如果需要,操作系统可以窃取未锁定的内存

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

如果内存消失了,我可以随时重新生成缩略图

是否有跨平台的方法标记内存,以便在需要时删除?程序用C++编写,


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

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


必须监控系统范围内的可用内存量可能无法达到目标(我的内存永远不会被回收以改进磁盘缓存),而获取内存不足通知只会在紧急情况下有所帮助。我希望通过使用锁定/解锁方法,可以以更轻量级的方式实现这一点,并在非紧急情况下提高系统的性能。

您不需要做什么特别的事情。如果最近没有自动使用,操作系统将从内存中删除这些内容。一些操作系统有特定于平台的方法来改进这一点,但一般来说,不需要特殊的方法

是否有跨平台的方法标记内存,以便在需要时删除?程序是用C语言编写的++

至少对于Windows,您可以

NotificationType

  • 低内存资源化
    可用物理内存不足
  • 高内存资源化
    可用物理内存高

对这两件事都要小心。您可以创建一个反馈循环(内存不足,释放缩略图!然后内存不足,生成所有缩略图!)。

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

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

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

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

所以你的问题没有可移植的解决方案


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

这个问题非常类似,其答案涵盖了此处未涉及的内容。

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


任何带有磁盘缓存的操作系统都已经具备了自动释放缓存空间的所有基本功能,很难想象没有API可以为某些东西带来巨大的变化,特别是在移动web浏览器等方面。

如果这些东西最近没有被自动使用,操作系统将从内存中删除它们。我想你指的是页面文件。听起来OP希望在影响整个机器的性能之前生成尽可能多的缩略图。但是如果他没有做什么特别的事情,那么他只需要填写页面文件。@ta.speot.is:大概他在一台服务器级机器上,有很多页面文件。如果他愿意的话,他可以有一个可配置的限制,很难说不去猜测他的应用程序的细节。我只是想澄清一下,与其在内存不足时得到通知,或者定期监控系统的内存量,我想的更多的是分配内存,然后在不使用时“解锁”内存。除了在内存不足的情况下,释放内存有什么好处?如果内存不低,为什么操作系统/另一个应用程序不为自己的缓存目的花费更多的内存?这似乎是一个过早优化的案例。@ta.speot.is:假设您有4GB内存,而缩略图占用1GB。然后有足够的空闲内存,所以一切都很好。但是,假设您在一个只有2GB内存的系统上。如果这是唯一一个运行的应用程序,那么使用1GB的缩略图就可以了,但是由于可用内存非常少,如果你去加载一个新的应用程序,操作系统可以收回整个1GB的内存就好了
HANDLE WINAPI CreateMemoryResourceNotification(
  _In_  MEMORY_RESOURCE_NOTIFICATION_TYPE NotificationType
);