VirtualFree是否解锁了VirtualLock?

时间:2016-06-25 23:03:31

标签: c++ memory-management

我正在重写相当旧的c ++代码,并且偶然发现了内存管理部分。

更具体地说,记忆"需要"首先以类似

的方式分配
int* Buffer;
int numPoints=80000;
Buffer = (int*)VirtualAlloc(NULL, numPoints* sizeof(int), MEM_COMMIT, PAGE_READWRITE);
VirtualLock(Buffer,numPoints * sizeof(int));

但是,缓冲区仅使用VirtualFree而不是VirtualUnlock发布。

所以,第一个问题: VirtualFree是否正在调用VirtualUnlock?

此外,我读了一下VirtualLock。在我的代码中,它显然用于提高性能,因为很多非常大的数组被频繁使用和访问,部分甚至被绘制为2 fps左右的图形...但是,我读到了1. Virtuallock可以降低系统性能,最终再次降低所有内容,并且2. Virtuallock并没有真正提高大缓冲区的性能。后面的声明在这里用strassen HBC(https://software.intel.com/de-de/forums/intel-threading-building-blocks/topic/276995)进行了测试。

因此,最后我决定反对VirtualLock,但https://msdn.microsoft.com/de-de/library/windows/desktop/aa366895(v=vs.85).aspx指出VirtualLock 确保对该地区的后续访问不会导致页面错误 。这是否意味着,注释掉VirtualLock会使*(buffer+10)=1之类的访问失败或产生页面错误(提供缓冲区的分配点数超过11个)?

所以第二个问题是: 我可以安全地丢弃锁定内存,而不会让阵列访问页面错误或崩溃的危险吗?

1 个答案:

答案 0 :(得分:4)

是的。 VirtualFree(MEM_RELEASE / MEM_DECOMMIT)解锁该区域(如果已使用VirtualLock()锁定。

VirtualLock()仍然有用,因为它可以更快地访问。 (此外,某些任务需要非分页内存,就像重叠的IO一样。) 在没有VirtualLock()的情况下,无论物理内存大小如何,都不能保证over-hundres megs字节缓冲区不被分页,因为O.S倾向于保留内核的非分页池和物理内存。 IO缓存。

顺便说一句,您需要使用SetProcessWorkingSetSize()来保护您自己进程的物理内存。 如果没有足够的进程工作集,VirtualLock()可能会失败。

恕我直言,锁定通用软件(在具有未知系统内存大小的各种系统上运行)的巨大内存区域并不是一个好主意,因为它会从关键部分窃取物理内存。 OS 将其用于在专用计算机上运行的软件(如专用服务器或专用编码PC)。