gpt4 book ai didi

c++ - VirtualFree 是否解锁 VirtualLock?

转载 作者:行者123 更新时间:2023-11-30 01:43:19 28 4
gpt4 key购买 nike

我在重写相当陈旧的 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 个分配点)?

第二个问题是:我能否安全地丢弃锁定内存而不会使数组访问面临页面错误或崩溃的危险?

最佳答案

是的。如果区域已被 VirtualLock() 锁定,VirtualFree(MEM_RELEASE/MEM_DECOMMIT) 将解锁该区域。

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

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

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

关于c++ - VirtualFree 是否解锁 VirtualLock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033698/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com