第十五章:在应用程序中使用虚拟内存

1. Window提供了一下三种机制来对内存进行操控:

◆ 虚拟内存:最适合用来管理大型对象数组或大型结构数组

◆ 内存映射文件:最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据

◆ 堆:最适合用来管理大量的小型对象

预定地址空间区域:

PVOID VirtualAlloc(

PVOID pvAddress,//内存地址(即我们需要使用那块内存,只需传入NULL即可)

SIZE_T dwSize, //以字节为单位的区域大小(CPU页面大小的整数倍)

DWORD fdwAllocationType,//预定区域或调拨物理存储器,前者为MEM_RESERVE

DWORD fdwProtect); //指定区域的保护属性

注意:可以使用MEM_TOP_DOWN标志来指定系统分配的空间是从顶部开始的.另外,我们传给pvAddress必须始终存在于用户模式分区中,否则函数会调用失败并返回NULL.

调拨物理内存:使得fdwAllocationType为MEM_COMMIT.如果同时存在MEM_COMMIT和MEM_RESERVE两个标志,则表示同时预定和调拨物理存储器

为系统使用大页面的整数倍空间:SIZE_T GetLargePageMinimum();//如果CPU不支持大页面,则返回0,同时使fdwProtect取值MEM_LAGE_PAGE标志,此外需要满足:

◆ 要分配的内存块的大小为GetLargeMinimum整数倍

◆ 在调用VirtualAlloc时,必须把MEM_RESERVE|MEM_COMMIT与fdwAllocationType参数按位或.

◆ 在用VirtualAlloc分配内存时必须传PAGE_READWRITE给fdwProtect.

撤销物理存储器及释放区域:

BOOL VirtualFree(

LPVOID pvAddress,

SIZE_T dwSize,//必须为0(撤销pvAddress标示的所有页面)

DWORD fdwFreeType);//必须为MEM_RELEASE

如果撤销部分区域则依次传:需撤销调拨第一个页面地址、释放区域的大小、MEM_DECOMMIT.

改变内存页面的保护属性:

BOOL VirtualProtect(

PVOID pvAddress,//需要改变的内存基址

SIZE_T dwSize,//内存大小

DWORD flNewProtect,//保护属性的区域大小(字节为单位)除PAGE_WRITECOPY和 //PAGE_EXECUTE_WRITECOPY之外的任何属性

PDWORD pflOldProtect)//_out:原来的属性

在使用VirtualAlloc重置(fdwAllocationType为MEM_RESET)时,系统为了确保所重置的页面不牵涉到有效数据,它将使得页面大小向下取整的块重置.另外MEM_RESET只能被单独使用它.

分配物理储存器:(也就是说,把应用和程序的某块地址一直放在内存中).

BOOL AllocateUserPhysicalPages(

HANDLE hProcess,

PULONG_PTR pulRAMPages,//分配内存页的数量(_in,_out)

PULONG_PTR aRAMPages);//页框号(对我们基本没什么用).

将内存块指定给地址窗口:(映射内存块)

BOOL MapUserPhysicalPages(

PVOID pvAddressWindow,//地址窗口的虚拟地址

ULONG_PTR ulRAMPages, //可使用的多少页面内存

PULONG_PTR aRAMPages);//

释放该窗口虚拟地址:

BOOL FreeUserPhysicalPages(

HANDLE hProcess,

PULONG_PTR pulRAMPages,

PULONG_PTR aRAMPages);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值