如果一個應用程序知道系統當前的內存狀態,它將可以較好地管理可用到的資源。WinCE實現了Win32的GetSystemInfo和GlobalMemoryStatus函數,GetSystemInfo函數原型如下:
1.VOID GetSystemInfo (LPSYSTEM_INFO lpSystemInfo);
它傳遞了一個指針給SYSTEM_INFO結構,定義如下
wProcessorArchitecture參數表示系統微處理器的架構。它的值是定義在Winnt.h中,例如PROCESSOR_ARCHITECTURE_INTEL。Windows CE擴展了這些常數,包括PROCESSOR_ARCHITECTURE_ARM,PROCESSOR_ARCHITECTURE_SHx,等等。增加的常數包括像Win32操作系統支持的網絡CPU(net CPU)。跳過一些參數,我們看dwProcessorType參數,它來自於特定的微處理器類型。常數有Hitachi SHx架構中的PROCESSOR_HITACHI_SH3和PROCESSOR_HITACHI_SH4。最後兩個參數,wProcessorLevel和wProcessorRevision,指明瞭CPU類型的特徵。wProcessorLevel參數類似於dwProcessorType參數,它一個指定的微處理器系列中被定義了,dwProcessorRevision告訴你模式(model)和芯片的步進級別(stepping level)。
typedef struct {
Word wProcessorArchitecture;
Word wReserved;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO;
dwPageSize參數說明了微處理器頁面的大小,以字節爲單位。知道這個值,將會在你直接處理虛擬內存API的時候帶來方便,在此我只作簡短說明。lpMinimumApplicationAddress和lpMaximumApplicationAddress參數說明了應用程序可用到的最小和最大的虛擬內存地址。dwActiveProcessorMask和dwNumberOfProcessors參數顯示被Window XP系統支持的多個處理器數量。因爲Windows CE 只支持一個處理器,所以你可以忽略這個參數。dwAllocationGranularity參數說明了一個完整的虛擬內存區域分配的界限。像Windows XP,Windows CE 規定虛擬區爲64-KB的界限(譯者注:作者此處64-KB的意思是即使你只分配一個字節的內存,系統也將會保留64-KB的虛擬地址空間給它,這個值一般是由硬件代碼實現的,但是不同硬件可能不同值)。
2.GlobalMemoryStatus,Win32 API函數。
此函數用來獲得當前可用的物理和虛擬內存信息,函數定義爲:
VOID GlobalMemoryStatus
(
LPMEMORYSTATUS lpBuffer
);
此函數無返回值,參數是一個指向名爲MEMORYSTATUS的結構的指針。函數的返回信息會被存儲在MEMORYSTATUS結構中。
此函數用來替代用來支持16位應用程序的GetFreeSpace函數。
應用程序應該在申請內存前調用此函數以防止影響到其他程序運行。
這個函數的返回值是動態的,並且可能返回相同的值。
關於MEMORYSTATUS結構:
機構定義:
typedef struct _MEMORYSTATUS
{ // mst
DWORD dwLength; // sizeof(MEMORYSTATUS)
DWORD dwMemoryLoad; // percent of memory in use
DWORD dwTotalPhys; // bytes of physical memory
DWORD dwAvailPhys; // free physical memory bytes
DWORD dwTotalPageFile; // bytes of paging file
DWORD dwAvailPageFile; // free bytes of paging file
DWORD dwTotalVirtual; // user bytes of address space
DWORD dwAvailVirtual; // free user bytes
} MEMORYSTATUS, *LPMEMORYSTATUS;
結構成員的含義:
dwLength MEMORYSTATUS結構的大小,在調GlobalMemoryStatus函數前用sizeof()函數求得,
用來供函數檢測結構的版本。
dwMemoryLoad 返回一個介於0~100之間的值,用來指示當前系統內存的使用率。
dwTotalPhys 返回總的物理內存大小,以字節(byte)爲單位。
dwAvailPhys 返回可用的物理內存大小,以字節(byte)爲單位。
dwTotalPageFile 顯示可以存在頁面文件中的字節數。注意這個數值並不表示在頁面文件在磁盤上的真實物理大小。
dwAvailPageFile 返回可用的頁面文件大小,以字節(byte)爲單位。
dwTotalVirtual 返回調用進程的用戶模式部分的全部可用虛擬地址空間,以字節(byte)爲單位。
dwAvailVirtual 返回調用進程的用戶模式部分的實際自由可用的虛擬地址空間,以字節(byte)爲單位。
MEMORYSTATUS結構,
結構的定義如下:
MEMORYSTATUS STRUCT
dwLength DWORD ;本結構的長度
dwMemoryLoad DWORD ;已用內存的百分比
dwTotalPhys DWORD ;物理內存總量
dwAvailPhys DWORD ;可用物理內存
dwTotalPageFile DWORD ;交換文件總的大小
dwAvailPageFile DWORD ;交換文件中空閒部分大小
dwTotalVirtual DWORD ;用戶可用的地址空間
dwAvailVirtual DWORD ;當前空閒的地址空間
MEMORYSTATUS ENDS