虚拟内存状态

来源:互联网 发布:bootstrap less源码 编辑:程序博客网 时间:2024/05/17 09:07
 

一、  获取系统信息

我们可以调用系统信息获取函数来获得本系统的页面大小、分配粒度的大小等信息。

系统信息获取函数:

VOID GetSystemInfo(LPSYSTEM_INFO psinf);

参数类型:

LPSYSTEM_INFO psinf 用于返回系统信息的数据结构

所包含信息:

dwPageSizeCPU页面的大小

lpMinimumApplicationAddress:进程可用的地址空间中的最小地址

lpMaximumApplicationAddress:进程可用的地址空间中的最大地址

dwAllocationGranularity:保留的地址空间区域的分配粒度

dwNumberOfProcessors:计算机中CPU的数目

dwActiveProcessorMask:用于指明那个CPU是活动的

wProcessorArchitecture:处理器结构

wProcessorLevel:更详细的处理器结构

wProcessorRevision:更详细的处理机级别

验证程序:

#include <iostream>

#include <windows.h>

using namespace std;

 

void main()

{

     /*获取进程信息*/

     LPSYSTEM_INFO systemInfo = new SYSTEM_INFO();

     GetSystemInfo(systemInfo);

     cout << "Page Size " << systemInfo->dwPageSize << endl;

     cout << "Allocation Granularity : " << systemInfo->dwAllocationGranularity << endl;

     cout << "Minimum application address : " << systemInfo->lpMinimumApplicationAddress << endl;

     cout << "Maxmum application address : " << systemInfo->lpMaximumApplicationAddress << endl;

     cout << "Number of processors : " << systemInfo->dwNumberOfProcessors << endl;

     cout << "Active processor mask : " << systemInfo->dwActiveProcessorMask << endl;

     cout << "Processor architecture : " << systemInfo->wProcessorArchitecture << endl;

     cout << "Processor level : " << systemInfo->wProcessorLevel << endl;

     cout << "Processor revision : " << systemInfo->wProcessorRevision << endl;

     cout << endl;

 

     system("pause");

}

输出结果:

Page Size 4096

Allocation Granularity : 65536

Minimum application address : 00010000

Maxmum application address : 7FFEFFFF

Number of processors : 2

Active processor mask : 3

Processor architecture : 0

Processor level : 6

Processor revision : 3846

二、  查看虚拟内存状态

我们可以通过相关函数检索当前内存状态的动态信息。

获取函数:

         GlobalMemoryStatus(LPMEMORYSTATUS pmst);       /*内存小于4G*/

     GlobalMemoryStatusEx(LPMEMORYSTATUSEX pmst);   /*内存大于4G或合计交换文件大小大于4G*/

函数参数:

     LPMEMORYSTATUS pmst:用于返回信息的数据结构

LPMEMORYSTATUSEX pmst:用于返回信息的数据结构

包含信息:

     dwLength:参数结构体的字节数

     dwTotalPhys:物理存储器的总字节数

     dwAvailPhys:可供分配的物理存储器的总字节数

     dwTotalPageFile:硬盘上调页文件中包含的最大字节数

     dwAvailPageFile:调页文件中尚未提交给任何进程的总的字节数

     dwTotalVirtual:每个近处的地址空间中私有的总字节数

     dwAvailVirtual:当前进程中所有空闲区域的总和

验证程序:

#include <iostream>

#include <windows.h>

using namespace std;

 

void main()

{

     /*获取虚拟内存状态*/

     LPMEMORYSTATUS memoryStatus = new MEMORYSTATUS();

     memoryStatus->dwLength = sizeof(MEMORYSTATUS);

     GlobalMemoryStatus(memoryStatus);

     cout << "memoryStatus" << endl;

     cout << "MemoryStatus length : " << memoryStatus->dwLength << endl;

     cout << endl;

     cout << "Total Phys : " << memoryStatus->dwTotalPhys << endl;

     cout << "Avail Phys : " << memoryStatus->dwAvailPhys << endl;

     cout << endl;

     cout << "Total Page File : " << memoryStatus->dwTotalPageFile << endl;

     cout << "Avail Page File : " << memoryStatus->dwAvailPageFile << endl;

     cout << endl;

     cout << "Total Virtual : " << memoryStatus->dwTotalVirtual << endl;

     cout << "Avail Virtual : " << memoryStatus->dwAvailVirtual << endl;

 

     cout << endl;

     cout << "memoryStatusEx" << endl;

 

     /*获取内存大于4G,或者合计交换文件的大小大于4G情况下的虚拟内存状态*/

     LPMEMORYSTATUSEX memoryStatusEx = new MEMORYSTATUSEX();

     memoryStatusEx->dwLength = sizeof(MEMORYSTATUSEX);

     GlobalMemoryStatusEx(memoryStatusEx);

     cout << "MemoryStatus length : " << memoryStatusEx->dwLength << endl;

     cout << endl;

     cout << "Total Phys : " << memoryStatusEx->ullTotalPhys << endl;

     cout << "Avail Phys : " << memoryStatusEx->ullAvailPhys << endl;

     cout << endl;

     cout << "Total Page File : " << memoryStatusEx->ullTotalPageFile << endl;

     cout << "Avail Page File : " << memoryStatusEx->ullAvailPageFile << endl;

     cout << endl;

     cout << "Total Virtual : " << memoryStatusEx->ullTotalVirtual << endl;

     cout << "Avail Virtual : " << memoryStatusEx->ullAvailVirtual << endl;

     cout << "Avail Extended Virtual : " << memoryStatusEx->ullAvailExtendedVirtual << endl;

 

     system("pause");

}

输出结果:

memoryStatus

MemoryStatus length : 32

 

Total Phys : 2147483647

Avail Phys : 2147483647

 

Total Page File : 4294967295

Avail Page File : 3689095168

 

Total Virtual : 2147352576

Avail Virtual : 2140684288

 

memoryStatusEx

MemoryStatus length : 64

 

Total Phys : 3218522112

Avail Phys : 2473451520

 

Total Page File : 4421079040

Avail Page File : 3689095168

 

Total Virtual : 2147352576

Avail Virtual : 2140684288

Avail Extended Virtual : 0

三、  确定地址空间的状态

我们可以通过调用相应函数来确定地址空间真能干内存地址的大小、存储器类型、保护属性等信息。

获取地址空间状态的函数:

         VirtualQuery(LPCVOID pvAddr, PMEMORY_BASIC_INFORMATION pmbi, DWORD dwLength);

函数参数:

     LPCVOID pvAddr:指针类型,包含需要查询其信息的内存地址

     PMEMORY_BASIC_INFORMATION pmbi:用于返回信息的数据结构

     DWORD dwLength:用于设定EMORY_BASIC_INFORMATION结构大小

包含信息:

     BaseAddress:经过四舍五入的页面边界值

     AllocationBase:包含pvAddress参数中舍得的地址区域的基地址

     AllocationProtect:该地址空间区域初次保留时的保护属性

     Protect:该区域的保护属性,包括(R E W

     State:所有相邻页面的状态,包括自由(MEM_FREE)、保留(MEM_RESERVE)、提交(MEM_COMMIT

     Type:所有相邻页面的存储类型,包括映像(MEM_IMAGE)、映射(MEM_MAPPED)、私有(EM__PRIVATE

     注:私有受系统页文件的支持,映像受内存映射的映像文件支持(exe/dll)。

验证程序:

#include <iostream>

#include <windows.h>

using namespace std;

 

void main()

{

     /*获取地址空间的状态*/

     PMEMORY_BASIC_INFORMATION memoryBasicInfo = new MEMORY_BASIC_INFORMATION();

     PVOID addr = NULL; /*作为指针变量单独使用,此处不需与其他地址绑定*/

     cout << "Virtual Memory Status" << endl;

 

     while(true)

     {

         VirtualQuery((void *)addr, memoryBasicInfo, sizeof(MEMORY_BASIC_INFORMATION));

         cout << memoryBasicInfo->BaseAddress << "/t" << memoryBasicInfo->AllocationBase << "/t"

               << memoryBasicInfo->RegionSize  << "/t" ;

         switch(memoryBasicInfo->State)

         {

         case MEM_FREE:

              {

                   cout << "free";

                   break;

              }

         case MEM_RESERVE:

              {

                   cout << "reserve";

                   break;

              }

         case MEM_COMMIT:

              {

                   cout << "commit";

                   break;

              }

         }

 

         cout << "/t";

 

         switch(memoryBasicInfo->AllocationProtect)

         {

         case PAGE_NOACCESS:

              {

                   cout << "N";

                   break;

              }

         case PAGE_READONLY:

              {

                   cout << "R";

                   break;

              }

         case PAGE_EXECUTE:

              {

                   cout << "E";

                   break;

              }

         case PAGE_EXECUTE_READ:

              {

                   cout << "ER";

                   break;

              }

         case PAGE_EXECUTE_READWRITE:

              {

                   cout << "ERW";

                   break;

              }

         }

 

         cout << "/t";

 

         switch(memoryBasicInfo->Protect)

         {

         case PAGE_NOACCESS:

              {

                   cout << "N";

                   break;

              }

         case PAGE_READONLY:

              {

                   cout << "R";

                   break;

              }

         case PAGE_EXECUTE:

              {

                   cout << "E";

                   break;

              }

         case PAGE_EXECUTE_READ:

              {

                   cout << "ER";

                   break;

              }

         case PAGE_EXECUTE_READWRITE:

              {

                   cout << "ERW";

              }

         }

 

         cout << "/t";

 

         switch(memoryBasicInfo->Type)

         {

         case MEM_IMAGE:

              {

                   cout << "image";

                   break;

              }

         case MEM_MAPPED:

              {

                   cout << "mapped";

                   break;

              }

         case MEM_PRIVATE:

              {

                   cout << "private";

                   break;

              }

         }

 

         cout << endl;

 

         if((int)memoryBasicInfo->BaseAddress + memoryBasicInfo->RegionSize >= 0x7FFF0000)

         {

              break;

         }

         addr = ((PBYTE)memoryBasicInfo->BaseAddress + memoryBasicInfo->RegionSize);

     }

 

     system("pause");

}

输出结果:

Virtual Memory Status

00000000        00000000        65536   free            N

00010000        00010000        12288   commit                  private

00013000        00000000        53248   free            N

00020000        00020000        4096    commit                  private

00021000        00000000        61440   free            N

00030000        00030000        1036288 reserve                 private

0012D000        00030000        4096    commit                  private

0012E000        00030000        8192    commit                  private

00130000        00130000        12288   commit  R       R       mapped

00133000        00000000        53248   free            N

00140000        00140000        12288   commit                  private

00143000        00140000        1036288 reserve                 private

00240000        00240000        24576   commit                  private

00246000        00240000        40960   reserve                 private

00250000        00250000        12288   commit                  mapped

00253000        00250000        53248   reserve                 mapped

00260000        00260000        90112   commit  R       R       mapped

00276000        00000000        40960   free            N

00280000        00280000        266240  commit  R       R       mapped

002C1000        00000000        61440   free            N

002D0000        002D0000        266240  commit  R       R       mapped

00311000        00000000        61440   free            N

00320000        00320000        24576   commit  R       R       mapped

00326000        00000000        40960   free            N

00330000        00330000        266240  commit  R       R       mapped

00371000        00000000        61440   free            N

00380000        00380000        16384   commit                  private

00384000        00380000        49152   reserve                 private

00390000        00390000        12288   commit  R       R       mapped

00393000        00000000        446464  free            N

00400000        00400000        4096    commit          R       image

00401000        00400000        102400  commit                  image

0041A000        00400000        229376  commit          ER      image

00452000        00400000        28672   commit          R       image

00459000        00400000        4096    commit                  image

0045A000        00400000        20480   commit                  image

0045F000        00000000        2084179968      free            N

7C800000        7C800000        4096    commit          R       image

7C801000        7C800000        540672  commit          ER      image

7C885000        7C800000        12288   commit                  image

7C888000        7C800000        8192    commit                  image

7C88A000        7C800000        606208  commit          R       image

7C91E000        00000000        8192    free            N

7C920000        7C920000        4096    commit          R       image

7C921000        7C920000        499712  commit          ER      image

7C99B000        7C920000        12288   commit                  image

7C99E000        7C920000        8192    commit                  image

7C9A0000        7C920000        77824   commit          R       image

7C9B3000        00000000        47435776        free            N

7F6F0000        7F6F0000        28672   commit  ER      ER      mapped

7F6F7000        7F6F0000        1019904 reserve ER              mapped

7F7F0000        00000000        8060928 free            N

7FFA0000        7FFA0000        208896  commit  R       R       mapped

7FFD3000        00000000        20480   free            N

7FFD8000        7FFD8000        4096    commit                  private

7FFD9000        00000000        24576   free            N

7FFDF000        7FFDF000        4096    commit                  private

7FFE0000        7FFE0000        4096    commit  R       R       private

7FFE1000        7FFE0000        61440   reserve R       N       private