来自Windows核心编程 – 第十四章
主要是通过一些Windwos函数来了解与系统内存管理和进程中虚拟地址空间相关的信息。
14.1 系统信息
操作系统中有许多值是由系统所运行的主机决定的,如页面大小和分配粒度等。
我们应该在进程初始化的时候取得这些值,然后再使用它们。
GetSystemInfo 函数用来取的与主机相关的值:
1 |
WINBASEAPI VOID WINAPI GetSystemInfo (LPSYSTEM_INFO lpSystemInfo); |
启动时,系统会确定这些值应该是多少。对一个给定的系统来说,由于这些值始终都是不变的,因此在任何一个进程中只需调用该函数一次就足够了。
使用时需要传入一个 SYSTEM_INFO 结构的地址。
以下四个成员是与内存有关的,分别是:
dwPageSize CPU页面大小,x86和x64都是4096Byte
lpMinimumApplicationAddress 进程可用地址的最小内存地址
lpMaximumApplicationAddress 进程私有空间中最大内存地址
dwAllocationGranularity 分配粒度,Windows平台上都是 65535
除此之外还有部分与内存无关的成员,列举如下:
wReserved 为今后拓展保留。
dwNumberOfProcess 机器中CPU数量
dwActiveProcessorMask 一个位掩码,表示哪些CPU处于活动状态
wProcessorArchitecture 处理器结构体系
wProcessorLevel 进一步细分处理器结构
wProcessorRevision 再进一步细分…
14.2 虚拟内存状态
Windows下的 GlobalMemoryStatus函数 可以用来取得当前内存状态的动态信息。
1 |
WINBASEAPI VOID WINAPI GlobalMemoryStatus (LPMEMORYSTATUS lpBuffer); |
传入一个 MEMORYSTATUS 结构的地址做参数。
如果预计应用程序会装在4GB及以上内存机器上运行,或者页交换文件大小大于4GB,那么就应该调用新的函数如下:
1 |
WINBASEAPI WINBOOL WINAPI GlobalMemoryStatusEx (LPMEMORYSTATUSEX lpBuffer); |
注意下传入的数据结构也不一样了…
14.3 NUMA机器中的内存管理 – 略
14.4 确定地址空间的状态
Windows提供了一个函数,可以用来查询与地址空间中内存地址有关的特定信息。
这个函数是:
1 2 3 4 |
WINBASEAPI SIZE_T WINAPI VirtualQuery ( LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZE_T dwLength); |
另外还提供了一个 VirtualQueryEx ,运行一个进程查看另一个进程的内存信息。这里不列举。
恩,大致就这些,并没有详细列举。