快速RAM中的动态内存分配

Gus*_*sky 8 c c++ windows memory-management

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

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

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

[编辑:]到目前为止,我的尝试是尝试使用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");
    }           
}
Run Code Online (Sandbox Code Playgroud)

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

[Edit2]我也试过了:

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

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

小智 6

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

希望能帮助到你.祝好运!