曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4138|回复: 0
打印 上一主题 下一主题

[内存管理] VirtualLock()/VirtualUnlock() -- 将页面锁定到物理内存及解锁

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34397
跳转到指定楼层
楼主
发表于 2012-3-1 19:07:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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() 一样,它们成对使用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-6-19 21:51 , Processed in 0.082495 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表