VirtualFree是否解锁VirtualLock ?

Does VirtualFree unlock VirtualLock?

本文关键字:VirtualLock 解锁 是否 VirtualFree      更新时间:2023-10-16

我正在重写相当旧的c++代码,并在内存管理部分绊倒了。

更具体地说,"所需"内存首先以类似于 的方式分配。
int* Buffer;
int numPoints=80000;
Buffer = (int*)VirtualAlloc(NULL, numPoints* sizeof(int), MEM_COMMIT, PAGE_READWRITE);
VirtualLock(Buffer,numPoints * sizeof(int));

但是,只有VirtualFree释放了Buffer,而VirtualUnlock没有。

所以,第一个问题: VirtualFree调用VirtualUnlock吗?

此外,我读了一些关于VirtualLock。在我的代码中,它显然是用于提高性能,因为很多非常大的数组被使用和访问非常频繁,部分甚至被绘制为2 fps左右的图形…然而,我读到1。Virtuallock会降低系统性能,最终会再次减慢系统运行速度。对于大缓冲区,Virtuallock并没有真正提高性能。后一种说法在这里用株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个已分配的点)?

所以第二个问题是:我可以安全地放弃锁定内存而不把数组访问页面错误或崩溃的危险?

是的。VirtualFree(MEM_RELEASE/MEM_DECOMMIT)将被VirtualLock()锁定的区域解除锁定。

和VirtualLock()仍然是有用的,因为它使更快的访问。(此外,有些任务需要非分页内存,比如重叠的IO。)如果没有VirtualLock(),无论物理内存大小如何,都不能保证超过数百兆字节的缓冲区是非分页的,因为操作系统倾向于为内核的非分页池保留物理内存&IO缓存。

顺便说一下,你需要SetProcessWorkingSetSize()来为你自己的进程保护物理内存。如果没有足够的进程工作集,VirtualLock()可能会失败。 对于通用软件(运行在各种未知系统内存大小的系统上)来说,锁定巨大的内存区域并不是一个好主意,因为它从操作系统的关键部分窃取了物理内存将它用于在专用机器上运行的软件(如专用服务器或专用编码PC)。