Windows如何知道我没有使用内存?

Mik*_*ail 4 c c++ windows malloc memory-management

我注意到这种奇怪的效果,其中内存未被Windows任务管理器分配,直到触摸它而不是它被malloc-ed或new-ed时.效果在debug优化的release构建中发生.

以下是一个结构示例,虽然在我的代码中,分配和利用发生在不同的线程上,所以我不认为它是优化器,虽然我不知道如何检查.

for (int i = 0 ;i < 1000;i++)
{
buffer[i]=malloc(buffersize);
}
_sleep(1000*60)
for (int i=0;i<1000;i++)
{
memset(buffer[i],0,buffersize);//Only shows up the in the resource manager here
}
Run Code Online (Sandbox Code Playgroud)

我的问题是Windows如何知道我使用了内存?它是监视内存以供第一次使用还是一些编译时优化.

我的好奇心是由于我正在编写的实时采集,需要我触摸内存两次 - >一次分配时,一次实际填充数据.因此,按下一个按钮("aquire!")需要我一次写入64千兆字节的ram,而不是随着时间的推移,增加了相当多的延迟.如果我malloc去,这会增加太多的延迟.

- 编辑 -

我还禁用了Windows页面文件...

Han*_*ant 7

这是Windows等需求页面虚拟内存操作系统的标准行为.malloc()调用仅分配虚拟内存地址空间.在访问内存之前,您实际上并未开始使用RAM .这会生成页面错误,迫使操作系统将您访问的内存页映射到RAM中.

这通常是软页面错误,通过从空闲列表中抓取RAM页面并映射它来非常快速地处理.与硬页面错误相反,当一些RAM页面再次换出到交换文件时,你会受到影响,因为另一个进程需要RAM.从磁盘重新加载页面需要更多时间.

禁用页面文件有助于避免这些硬页面错误.它并没有消除它们,你的代码页也会被换掉.当您强制操作系统退回到它们时,可能会发生这种情况,因为它无法再切换到页面文件.这样的页面在换出时就被丢弃了,当页面出现故障时从可执行文件重新加载.

如果您有软实时要求,那么最好的策略是尽早分配内存并在开始承诺快速响应之前有意访问它.可以简单地使用calloc()而不是malloc()来完成.