快速RAM中的动态内存分配

时间:2013-01-11 20:03:15

标签: c++ c windows memory-management

在Windows 32位和64位计算机上,我必须分配内存来存储大量实时流式传输的数据,总共大约1GB。如果我使用malloc(),我将获得一个虚拟内存地址,这个地址可能实际上导致一些分页到硬盘驱动器,具体取决于我有多少内存。不幸的是,我担心HD会影响性能并导致数据丢失。

有没有办法强制内存仅在RAM中分配,即使这意味着当内存不足时我会收到错误(因此用户需要关闭其他内容或使用其他机器)?我想保证所有操作都在内存中完成。如果失败,则强制退出应用程序是可以接受的。

我知道另一个进程可能会进入并且本身需要一些内存,但我并不担心,因为在这台机器中没有发生(它将是机器上唯一一个进行大量分配的应用程序)。 / p>

[编辑:] 到目前为止,我的尝试是尝试使用VirtualLock,如下所示:

if(!SetProcessWorkingSetSize(this, 300000, 300008))
    printf("Error Changing Working Set Size\n");

// Allocate 1GB space
unsigned long sz = sizeof(unsigned char)*1000000000;
unsigned char * m_buffer = (unsigned char *) malloc(sz);

if(m_buffer == NULL)
{
    printf("Memory Allocation failed\n");
}
else
{
    // Protect memory from being swapped
    if(!VirtualLock(m_buffer , sz))
    {
           printf("Memory swap protection failed\n");
    }           
}

但是工作集的更改失败了,VirtualLock也是如此。 Malloc确实返回非null。

[EDIT2] 我也试过了:

 unsigned long sz = sizeof(unsigned char)*1000000000;
 LPVOID lpvResult;
 lpvResult = VirtualAlloc(NULL,sz, MEM_PHYSICAL|MEM_RESERVE, PAGE_NOCACHE);

但是lpvResult是0,所以也没有运气。

5 个答案:

答案 0 :(得分:6)

您可以使用mlock, mlockall, munlock, munlockall函数来防止页面被交换(POSIX的一部分,也可以在MinGW中使用)。不幸的是,我没有Windows的经验,但看起来像VirtualLock做同样的事情。

希望它有所帮助。祝你好运!

答案 1 :(得分:4)

我认为VirtualAlloc可能会为您提供所需的一些内容。

这个问题实际上归结为只编写自己的内存管理器而不是使用CRT功能。

答案 2 :(得分:2)

您需要使用带锁定选项2(LOCK_VM_IN_RAM)的未记录的NtLockVirtualMemory函数;确保首先请求并获得SE_LOCK_MEMORY_NAME权限,并注意它可能未被授予(我确定组策略默认权限是什么,但它可能很好地授予任何人)。

我建议使用VirtualLock作为后备,如果失败,则使用SetProcessWorkingSetSize。如果 失败,那么就让它失败我猜...

有关此问题的详细讨论,请参阅this link。一个人说:

  

当您指定LOCK_VM_IN_WSL标志时,您只需告诉Balance Set Manager您不希望某个特定页面被交换到磁盘,并要求它在修剪工作集时单独保留此页面目标过程。这只是一个指示,因此如果系统RAM不足,目标页面仍可能被交换。但是,当您指定LOCK_VM_IN_RAM标志时,您向内存管理器发出一个指令,将此页面视为不可分页(即,当它调用MmProbeAndLockPages()以锁定页面时,请执行驱动程序执行的操作,由MDL描述),以便保证页面有问题始终加载到RAM中。


编辑:

阅读this

答案 3 :(得分:0)

一种选择是从主机内存中创建一个RAM磁盘。虽然在分布式Windows代码中不再有本机支持,但您仍然可以找到免费或通过商业产品提供的驱动程序。例如,DRDataRam提供免费的个人使用驱动程序和商业许可的商业用途产品:http://memory.dataram.com/products-and-services/software/ramdisk

还有以下网址提供的ImDisk虚拟驱动程序:http://www.ltr-data.se/opencode.html/#ImDisk它是开源的,可免费用于商业用途。它使用Microsoft的可信证书进行数字签名。

有关Windows上RAM驱动器的更多信息,请查看ServerFault.com。

答案 4 :(得分:0)

你应该看看Address Windowing Extensions (AWE)。听起来它符合你的内存限制(强调我的):

  

AWE使用物理非分页内存以及32位虚拟地址空间内此物理内存各部分的窗口视图。