快速RAM中的动态内存分配

Dynamic Memory Allocation in fast RAM

本文关键字:内存 分配 动态 RAM 快速      更新时间:2023-10-16

在Windows 32位和64位机器上,我必须分配内存来存储大量实时流数据,总共大约1GB。如果我使用malloc(),我将获得一个虚拟内存地址,根据我拥有的内存量,这个地址实际上可能会对硬盘驱动器进行一些分页。遗憾的是,我担心高清会影响性能并导致数据丢失。

是否有一种方法来强制内存分配仅在RAM中,即使这意味着我得到一个错误时,没有足够的内存可用(所以用户需要关闭其他东西或使用另一台机器)?我想保证所有的操作都在内存中完成。如果失败,可以强制应用程序退出。

我知道另一个进程可能会进入并占用一些内存,但我并不担心,因为在这台机器上没有发生这种情况(它将是机器上唯一一个做这么大分配的应用程序)。

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

if(!SetProcessWorkingSetSize(this, 300000, 300008))
    printf("Error Changing Working Set Sizen");
// 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 failedn");
}
else
{
    // Protect memory from being swapped
    if(!VirtualLock(m_buffer , sz))
    {
           printf("Memory swap protection failedn");
    }           
}

但是Working set的更改失败了,VirtualLock也失败了。Malloc不返回非空。

[Edit2]我也试过了:

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

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

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

希望有帮助。好运!

我认为VirtualAlloc可能会给你一些你想要的。

这个问题归结起来就是你自己写内存管理器而不是使用CRT函数。

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

我建议使用VirtualLock作为回退,如果这也失败,使用SetProcessWorkingSetSize。如果失败了,那就让它失败吧。

请参阅此链接以了解有关此问题的一些精彩讨论。一个人说:

当您指定LOCK_VM_IN_WSL标志时,您只需告诉Balance Set Manager您不希望某些特定的页面被交换到磁盘上,并要求它在修剪目标进程的工作集时单独留下此页面。这只是一个指示,以便在系统RAM不足时仍然可以交换目标页。然而,当您指定LOCK_VM_IN_RAM标志时,您向内存管理器发出指令,将该页视为不可分页(即做驱动程序在调用MmProbeAndLockPages()以锁定页面时所做的事情,由MDL描述),以便保证该页始终加载在RAM中。


编辑:

一种选择是从主机的内存中创建一个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。

你应该看看地址窗口扩展(AWE)。听起来它符合你的内存限制(强调我的):

AWE在32位虚拟地址空间中使用物理非分页内存和该物理内存各部分的窗口视图。