Windows虚拟内存的使用(一)

虚拟内存API:

  VirtualAlloc:虚拟内存的申请

  VirtualFree:虚拟内存的释放

代码如下:

/************************************************************************/
/* 
功能:以直接预定并提交方式进行虚拟内存申请和赋值
参数:无
返回:无
*/
/************************************************************************/
VOID Func()
{
	//1 预定并提交内存
	VOID *pRecv = VirtualAlloc(NULL,//系统决定区域的位置
		1024,				        //申请的内存区域
		MEM_RESERVE | MEM_COMMIT,   //预定并提交的方式
		PAGE_READWRITE);			//内存页的保护方式(只能对整个内存页设置,不能对一个页的部分内存设置)
	float* pfArray = (float*)pRecv;
	//循环赋值
	for (int i = 0; i < 1024/sizeof(float); i++)
	{
		pfArray[i] = 1.0f * rand();
	}
	//直接释放
	VirtualFree(pRecv,0,MEM_RELEASE);
}

VirtualAlloc用来申请虚拟内存空间,第一个参数表示分配区域的开始地址,如果指定地址的内存区域是预定的,那么指定地址向上取整到最近的分配粒度边界。如果指定地址已经被预定和提交,那么指定地址向下取整到最近的分配粒度边界;第二个参数是申请虚拟内存空间的大小(单位是字节),例如上面就申请了1kB的虚拟内存空间;第三个参数是申请内存的方式,如果你只是以MEM_RESERVE进行内存的申请,系统没有为你这次的申请实际分配物理内存,你也就不能对该区域进行内存读写了。如果你想往物理内存中进行数据的读写,你必须以MEM_COMMIT进行内存的申请;第四个参数是内存页的保护方式。内存页有PAGE_NOACCESS,PAGE_READONLY等等保护方式,你可以查看一下MSDN。

注意:用VirtualAlloc以MEM_RESERVE方式申请内存,申请的大小小于64kB或者不是64kB的倍数时,系统会为你预定64kB或者是64kB倍数的虚拟内存空间。如果再想申请已被预订区域时,申请操作会失败。用VirtualAlloc以MEM_COMMIT方式申请一块小于一个页的大小(4kB)或着不是4kB倍数的内存时,系统会在先前预定空间分配一块4kB或者是4kB倍数大小的内存,并且该内存区域全都被清零,这样就没有必要对该区域进行清零操作。(如果只预定1个BYTE,系统至少也会为你预定64KB的空间,如果只提交1BYTE,系统至少也会提交4KB的一个页面)

预定和提交分开方式分开操作代码如下:

/************************************************************************/
/* 
功能:提交和保留分开方式进行内存的操作
参数:无
返回:无
*/
/************************************************************************/
VOID Func2()
{
	//1预定1M的空间
	BYTE* pMem = (BYTE*)VirtualAlloc(NULL,1024 * 5,MEM_RESERVE,PAGE_READWRITE);
	//提交页面
	VirtualAlloc(pMem+1024,3*1024,MEM_COMMIT,PAGE_READWRITE);
	//操作已提交的页面
	double* pdbArray = (double*)(pMem+1024);
	for (int i=0;i<(3*1024)/sizeof(double);i++)
	{
		pdbArray[i] = 1.0f * rand();
	}
	//释放物理页面
	VirtualFree(pMem+1024,3*1024,MEM_DECOMMIT);
	//释放空间
	VirtualFree(pMem,0,MEM_RELEASE);
}

备注:

1 通过释放和再提交页面可以快速的将页面清零。

2 VirtualAlloc的flAllocationType可以指定下列扩展的标志位(需要指定MEM_RESERVE或MEM_COMMIT):

MEM_LARGE_PAGES:启用大页面支持(大于等于2M每个页面,原前的4K页面相对被称为小页面)

MEM_TOP_DOWN:从高端地址保留空间(默认是从低端向高端搜索)

MEM_WRITE_WATCH:开启页面写入监视,利用GetWriteWatch可以得到写入页面的统计情况,利用ResetWriteWatch可以重置起始计数。

MEM_PHYSICAL:用于PAE支持。

3 flAllocationType可以指定MEM_RESET标志(单独使用不能和其他组合使用),告诉系统指定的区域的内容没有改变,不需要将该区域的内容写到页面文件中。以便使这块区域长期存放在RAM中,在使用该区域时不需要耗时换页操作。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Windows 虚拟内存是一种在硬盘上模拟的内存空间,用于扩展计算机的实际物理内存。当计算机的物理内存不足以支持运行的程序时,Windows 将会将一部分数据转移到虚拟内存中,以便释放物理内存供其他程序使用Windows 虚拟内存的大小可以根据需要进行调整,通常默认情况下由系统自动管理。你可以通过以下步骤来调整虚拟内存的设置: 1. 在 Windows 桌面上,右键点击“此电脑”或“我的电脑”,然后选择“属性”。 2. 在系统属性窗口中,点击左侧的“高级系统设置”。 3. 在弹出的窗口中,点击“性能”下的“设置”按钮。 4. 在性能选项卡中,点击“高级”选项卡。 5. 在虚拟内存部分,点击“更改”按钮。 6. 可以选择以下几种方式之一: - 如果你想让系统自动管理虚拟内存大小,请确保选中了“自动管理所有驱动器的分页文件大小”选项。 - 如果你想手动设置虚拟内存大小,请取消选中“自动管理所有驱动器的分页文件大小”,然后选择你想要设置的驱动器,并点击“自定义大小”。 - 在初始大小和最大大小字段中,输入你想要设置的虚拟内存大小(以MB为单位)。 - 点击“设置”按钮,然后点击“确定”关闭所有窗口。 请注意,虚拟内存的设置应根据你的实际需求和计算机配置进行调整。较大的虚拟内存可能会导致硬盘空间的占用增加,而较小的虚拟内存可能会影响系统性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值