如何保证当一个进程调用malloc()时,它会立即分配物理内存?

时间:2012-09-28 14:18:31

标签: c++ windows memory-management malloc

我正在寻找一种方法来为进程预先分配内存(PHYSICAL memory),这样当我调用new / malloc时,它绝对可以保证可用于C ++堆。无论其他进程正在尝试如何处理系统内存,我都需要将此内存用于我的进程。换句话说,我想为C ++堆保留物理内存,以便在调用malloc()时它立即可用。 以下是详细信息:

我正在开发一个实时系统。该系统由几个需要大量内存的进程组成。流程A是关键任务流程,它必须能够生存并且不受任何其他流程的不良行为的影响。它通常适合0.5 GB的内存,但有时需要2.5 GB。其他进程尝试使用任何数量的内存。

我担心的是其他进程可能会分配大量内存,从而耗尽系统中的物理内存储备。然后,当进程A需要更多内存FAST时,它不可用,并且系统将不得不交换页面,这将花费很长时间。 至关重要的是,进程A可以毫不拖延地获得所需的所有内存,而对于其他进程失败,我很好。

我在64位Windows 7上运行。

编辑: SetProcessWorkingSetSize会工作吗?含义:调用这个足够大的内存可以保护我的进程A不受系统中任何其他进程的影响。

2 个答案:

答案 0 :(得分:2)

VirtualLock正是您要找的。它会强制操作系统将页面保留在内存中,只要它们处于工作集大小(这是MK在其答案中链接的功能)。但是,无法将此内存提供给malloc / new - 您必须实现自己的内存分配器。

答案 1 :(得分:1)

我认为这个问题很奇怪,因为Windows 7并不是实时应用程序的首选操作系统。也就是说,似乎有一个界面可以帮助你:

AllocateUserPhysicalPages