如何避免第三方库(无源代码)从物理内存中分配内存?

Posted

技术标签:

【中文标题】如何避免第三方库(无源代码)从物理内存中分配内存?【英文标题】:How to avoid thrid party lib(no source codes) to allocate memory from physical memory? 【发布时间】:2013-06-09 01:27:29 【问题描述】:

假设这种情况:我在我的 C++ 应用程序中引用了第三方库,但我根本不希望第三方库使用我的物理内存。相反,我希望它只从硬盘分配内存。我不知道第三方库的源代码,但是由于它运行在 Windows 平台上,所以我认为可以使用 Win32 API 控制内存管理。

我的问题是如何避免第三方库从物理内存中分配内存。

我是不是走错了方向?有人可以帮帮我吗?

PS:我使用的是 Visual C++ 2010。

【问题讨论】:

你为什么想要这个?从内存编写的代码在从磁盘工作时运行速度会慢几个数量级,并且也会占用系统资源。为什么不直接利用操作系统提供的虚拟内存? 存储在硬盘上的数据必须先复制到主内存中,然后您的处理器才能对其进行操作... @Daniel Pryden 我只是想知道是否有可能实现我的设计思想。这只是我的兴趣。 阅读这篇文章:cosmal.ucsd.edu/~gert/ece30/CN5.pdf 它会告诉你为什么将数据存储在慢速大内存(硬盘)中并不会减少小快内存(主内存、缓存)的使用率 【参考方案1】:

对于常规的 C++ 程序或库,在 Windows 中没有“分配物理内存”或“从硬盘分配内存”之类的东西。所有“正常”分配请求都由虚拟内存提供服务。在任何给定时刻,由操作系统决定哪个虚拟内存区域将驻留在物理 RAM 中,哪些将驻留在磁盘上。您的程序和第三方库都无法对此进行控制。

换句话说,您似乎描述的“问题”并不真正存在。在基于虚拟内存的适当设计的操作系统中,物理 RAM 总是被完全占用。未占用的 RAM 是浪费的 RAM - 这是其背后的管理原则。这意味着“节省物理 RAM”的概念在此类操作系统中并不真正存在:物理 RAM 始终是 100% 占用的。

为了将数据存储在虚拟内存中,操作系统首先必须确保将数据加载到物理 RAM 中。出于这个原因,任何使用内存的库都会将其数据加载到物理 RAM 中,无论您是否想要它。否则第三方库根本无法运行。

【讨论】:

我不这么认为,Win32: CreateFileMapping 和我的要求有点相似。 看看这个链接:***.com/questions/16997739/… @Tory:MapViewOfFile返回一个指向物理内存的指针(它是一个虚拟地址,但是数据是从硬盘复制到主存中的) @Tory:你误解了虚拟内存机制。系统虚拟内存本身就是系统交换文件的文件映射。通过对其他文件执行CreateFileMappping,您将简单地引入您自己的预初始化私有交换文件,该文件将与系统交换文件竞争内存使用。它以与常规系统交换文件完全相同的方式影响物理 RAM 使用。 IE。它根本不会以任何方式“提高”内存使用率。 @Tory:您链接的答案说明了同样的事情。恰恰相反,您的CreateFileMappping 可能会因为引入另一个物理 RAM 使用竞争对手而使事情变得更糟。在一个实施良好的系统中,它不应该真的让事情变得更糟,但它无论如何也不会改善任何事情。

以上是关于如何避免第三方库(无源代码)从物理内存中分配内存?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中分配大量数组时避免内存碎片

使用 io.Writer 时避免在 golang 中分配过多的内存

在结构中分配内存时出现不可预测的行为

如何在 C# 中释放在 C++ 中分配的内存

如何在单独的 CUDA 函数中分配 GPU 内存?

如何使用 mmap 在堆中分配内存?