一般来讲,应用程序申请的内存是虚拟内存。这种情况下申请到的内存有可能被操作系统Swap到内存景象文件中,操作系统会根据系统中运行的所有程序对内存的需求来判断哪些内存数据会被Swap Out/In
有些应用程序处于时效性的考虑,希望内存被时刻保留在物理内存中,程序只要不退出,数据就永远在物理内存中,为确保这样的应用,一般来讲有两种方法:
1.Platform SDK: Memory Management 中有一系列的函数可以来实现这样的功能。其中VirtualLock 当仁不让。
2.Windows DDK 中的一些列函数
IoAllocateMdl
MmInitializeMdl
MmProbeAndLockPages
但是似乎大家对于Platform SDK 提供的函数没有足够的信心,在www.ntdev.org 上大家就此问题争论不休,甚至有的人公开怀疑MSDN 文档的准确性。
就我个人认为,我觉得DDK的方法肯定是最为保险的,VirtualLock会不会被swap out了真的很怀疑。如果申请VirtualAlloc的程序长时间不去access这段内存,操作系统仍然会为他保存吗?
不过,今天写这个blog的真正原因是有一个朋友希望用 占用内存的方法来曲线修复自己的内存。我这个朋友的笔记本内存使用docmem检查到有一段内存有问题,为了这区区几M的内存重新买一条又觉得不合适,因此决定采取 首先启动一个程序占用这些内存的方法让操作系统不要为系统中其他的应用分配这段内存,避免出现死机的情况,无论能否成功,这个思想确实是匪夷所思。
BTW:
docmem 可以得到物理内存的实际地址