VirtualLock() 和 VirtualUnlock() 函数原型如下:
[C++] 纯文本查看 复制代码 BOOL WINAPI VirtualLock(
__in LPVOID lpAddress,
__in SIZE_T dwSize
);
BOOL WINAPI VirtualUnlock(
__in LPVOID lpAddress,
__in SIZE_T dwSize
);
VirtualLock() 函数可以将虚拟地址空间中内存页面的一片区域锁定在物理内存里。它有两个参数,第 1 个参数 lpAddress 是要锁定内存页的基地址,第 2 个参数 dwSize 是要锁定的区域大小,以字节为单位。在锁定的过程中,会按照页面的对齐机制进行锁定。比如说,给定的基地址 lpAddress 如果落在一个页面的中间,而 dwSize 所指的偏移不超过该页面,那么就将 lpAddress + dwSize 所在的那个页面锁起来;若是 dwSize 已经造成跨页(假设跨到下一页),那么就将这两个页都锁到内存中。
注意,所有要锁定的页面必须是已”提交的“。使用 VirtualLock() 可能会造成性能的损失,因为它会造成可用内存减少,这样一来对于另外的一些关键内存页就不得不交换到磁盘上。但是如果程序所运行的机器拥有巨大的物理内存,那么从这个角度来讲,还提高了性能。像在这些拥有巨大物理内存的机器上,我们可能会比较喜欢手动禁用掉所有的虚拟内存,也就是设置磁盘上的分页文件为 0 MB,这就意味着,我们自信物理内存足以胜任运行我们所需要的工作程序。然而,像一些游戏,他们依然会需要虚拟内存,如果之前就已经禁止掉所有的虚拟内存,那么游戏就会运行失败。
实际上,每个版本的 Windows 都有一个底线,即对于一个进程来说,它能够锁定的内存是有个上限值的,这也避免了造成系统性能的巨大损失。
解除锁定使用 VirtualUnlock() 函数,一般的,该函数中的参数要和 VirtualLock() 一样,它们成对使用。 |