《Windows核心编程系列》应用程序中的虚拟内存
作者:网络转载 发布时间:[ 2013/1/8 15:51:37 ] 推荐标签:
系统信息
操作系统的许多值是由系统所运行的主机决定的,如页面大小和分配粒度。使用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;
}
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11