系统信息

  操作系统的许多值是由系统所运行的主机决定的,如页面大小和分配粒度。使用GetSystemInfo可以获得与主机有关的值:


VOID GetSystemInfo(LPSYSTEM_INFO psi);

SYSTEM_INFO结构定义如下:

typedef struct _SYSTEM_INFO{

    union{

                 struct  {

                              WORD wProcessorArchitecture;

                              WORD wReserved;

                           };
           };
    DWORD dwPageSize;

    LPVOID lpMinimumApplicationAddress;

    LPVOLID lpMaximumApplicationAddress;

    DWORD_PTR dwActiveProcessorMask;

    DWORD dwNumberOfProcessor;

    DWORD dwProcessorType;

    DWORD dwAllocationGranularity;

    WORD wProcessorLevel;

    WORD wProcessorRevision;

}SYSTEM_INFO,*LPSYSTEM_INFO;
 


  上述这么多成员只有四个与内存有关。

  dwPageSize表示cpu页面大小在x86和x64机器中,该值为4K。

  lpMinimumApplicationAddress给出进程中可用地址空间小的内存地址。由于每个进程地址空间开始的64K是闲置的,因此该值为64K。

  lpMaximumApplicationAddress给出每个进程私有地址空间中大的

  可用内存地址。

  dwAllocationGranularity表示用于预定地址空间区域的分配粒度

  其他的成员稍微做下介绍:

  wReserved为今后拓展保留,不要使用。

  dwNumOfProcessor机器cpu的数量。

  dwActiveProcessorMask位掩码,用来表示哪些cpu处于活动状态。可以用来运行线程。

  dwProcessorType已经作废。不再使用。

  wProcessorArchitecture表示处理器的体系结构。如x86,x64;

  wProcessorLevel进一步细分处理器的体系结构,比如Intel奔腾2或奔腾4.

  wProcessorRevision进一步对wProcessLevel进行细分。

  //以下代码演示了可重置内存及以上介绍的各个函数的使用。


#include"windows.h"
#include<iostream>
#include"tchar.h"
TCHAR TextData[]=TEXT("c:Usersyangyangdocumentsvisual studio 2010ProjectsMEM_RESETMEM_RESETmain.cppc:Usersyangyangdocumentsvisual studio 2010ProjectsMEM_RESETMEM_RESETmain.cpp");
int main(int argc,char**argv)
{
 
 PTSTR pszData=(PTSTR)VirtualAlloc(NULL,1024,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
 if(pszData==NULL)
 {
  MessageBox(NULL,TEXT("分配失败"),TEXT(""),MB_OK);
 }
 _tcscpy_s(pszData,1024,TextData);
 int ret=MessageBox(NULL,TEXT("以后是否还要访问该段内存?"),TEXT(""),MB_YESNO);
 if(ret==IDNO)
 {
  MEMORY_BASIC_INFORMATION mbi;
  VirtualQuery(pszData,&mbi,sizeof(mbi));
  VirtualAlloc(pszData,mbi.RegionSize,MEM_RESET,PAGE_READWRITE);
 }

 MEMORYSTATUS mst;
 GlobalMemoryStatus(&mst);
 PVOID pvAddress=VirtualAlloc(NULL,mst.dwAvailVirtual,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
 if(pvAddress)
 {
  ZeroMemory(pvAddress,mst.dwAvailVirtual);
 }
 if(!_tcscmp(TextData,pszData))
 {
  MessageBox(NULL,TEXT("已经保存!"),TEXT(""),MB_YESNO);
 }
 else
 {
  MessageBox(NULL,TEXT("未保存!"),TEXT(""),MB_YESNO);
 }
 getchar();
 VirtualFree(pvAddress,0,MEM_RELEASE);
 VirtualFree(pszData,0,MEM_RELEASE);
 return 0;
}