微软的Windows提供了三种机制对内存进行操控

1 虚拟内存(最适合管理大型对象数组或大型结构数组)

2 内存映射文件(大型数据流/文件,共享数据)

3  堆(大量的小型对象)

预订地址空间区域VirtualAlloc

PVOID VirtualAlloc(PVOID pvAddress,//内存地址,传NULL则由系统指定位置,必须始终位于进程的用户分区中,如果不是分配粒度的整数倍,则下去整到64K的整数倍。

SIZE_T dwSize,//区域大小,系统始终分配页面大小的整数倍

DWORD fdwAllocationType,//预订操作MEM_RESERVE,以及一些其他的标志。

DWORD fdwProtect);//保护属性,当预订和调拨时的保护属性一致时,效率会更高。

只预订区域是根本不会消耗物理存储器的。

给区域调拨物理存储器VirtualAlloc

PVOID VirtualAlloc(PVOID pvAddress,//内存地址。

SIZE_T dwSize,//调拨的大小。无需一下子给整个区域都调拨物理存储器。

DWORD fdwAllocationType,//调拨操作MEM_COMMIT,以及一些其他的标志。

DWORD fdwProtect);

同时预订和调拨物理存储器VirtualAlloc

同时使用MEM_RESERVE|MEM_COMMIT

撤销调拨物理存储器及释放区域VirtualFree

BOOL VirtualFree(LPVOID pvAddress,

SIZE_T dwSize,//释放时必须为0,系统可以知道大小的。撤销时为0,则全部撤销,系统会释放整个区域。

DWORD fdwFreeType);//释放必须为MEM_RELEASE,撤销而不释放必须为MEM_DECOMMIT,撤销调拨也是基于页面粒度的

改变保护属性VirtualProtect

BOOL VirtualProtect(PVOID pvAddress,//必须位于进程的用户分区

SIZE_T dwSize,

DWORD flNewProtect,

PDWORD pflOldProtect);//返回原来的保护属性,必须传有效地址给该参数。

保护属性是与整个物理存储器页相关联的,我们不能给一个字节指定保护属性。

如果有相邻的区域,又想改变跨区域连续页面的保护属性,那么必须调用VirtualProtect多次。

重置物理存储器的内容VirtualAlloc

使用MEM_RESET

当调用VirtualAlloc时,基地址通常会被向下去整到页面大小的整数倍,而大小则会被向上取整到页面大小的整数倍。

因此,如果传入的是MEM_RESET,则Virtualalloc会向相反的方向进行取整操作。

要注意的是MEM_RESET只能单独使用,不能与其他标志位或操作。

读书笔记——Windows核心编程(15)在应用程序中使用虚拟内存的更多相关文章

  1. 《windows核心编程》 在应用程序中使用虚拟内存

    Microsoft Windows 提供了以下三种机制来对内存进行操控: 虚拟内存 最适合用来管理大型对象数组或大型结构数组 内存映射文件 最适合用来管理大型数据流(通常是文件),以及在同一台机器上运 ...

  2. 读书笔记——Windows核心编程(8)Interlocked单向链式栈

    SLists使用了无锁算法来保证原子同步,以提升系统性能,避免了诸如优先级挂和互锁的问题. 注意:所有的链表项必须对齐到MEMORY_ALLOCATION_ALIGNMENT.否则会出现奇葩的错误. ...

  3. 读书笔记——Windows核心编程(8)Interlocked系列函数

    先让我们来复习下小学知识 A+B=C//式中A为被加数,B为加数. A-B=C//式中A为被减数,B为减数. 再让我们来明确一个知识点:返回值为void的Windows函数意味着一定会执行成功. -- ...

  4. 读书笔记——Windows核心编程(2)比较字符串

    1. CompareString 以符合用户语言习惯的方式,EX版本使用UNICODE int CompareString( __in LCID Locale, __in DWORD dwCmpFla ...

  5. 读书笔记——Windows核心编程(13)Windows内存体系结构

    对于32位进程(0x0000 0000~0xFFFF FFFF),有4GB的地址空间. 每个进程都有自己专有的地址空间,当进程的各个线程运行时,它们只能访问属于该进程的内存. 这4GB其实是虚拟地址空 ...

  6. 读书笔记——Windows核心编程(2)禁止C运行时触发的所有Debug Assertion Failed对话框

    1 定义一个函数 void _invalid_parameter( const wchar_t * expression, const wchar_t * function, const wchar_ ...

  7. Windows核心编程 第八章 用户方式中线程的同步(下)

    8.4 关键代码段 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.这是让若干行代码能够"以原子操作方式"来使用资源的一种方法.所谓原子操作方式,是 ...

  8. windows核心编程-第一章 对程序错误的处理

    第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...

  9. Windows核心编程 第八章 用户方式中线程的同步(上)

    第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...

随机推荐

  1. [Perl]抓取个人的所有闪存+格式化保存为文本

    以下代码保存为utf8文本格式 环境:ActivePerl v5.16 built for MSWin32-x86 两个要调整的地方: for my $i (17..45) {  这里改成自己对应的页 ...

  2. 无意中在sql日志中发现如下内容,

    日期,源,严重性,消息01/06/2015 09:06:13,登录,未知,Length specified in network packet payload did not match number ...

  3. WebApi中跨域解决办法

    在做Web开发中,常常会遇到跨域的问题,到目前为止,已经有非常多的跨域解决方案.由于时间有限,本文不会深入. 笔者遇到的问题是Js调用WebAPI中的数据进行跨域的场景.涉及若干跨域方案: 方案1:j ...

  4. 安装、部署... Windows服务 .net程序 安装 命令

    @echo offInstallutil.exe 程序目录 F:\test\TestWindows.exe 服务程序目录@sc start "服务名称"@sc config &qu ...

  5. 【基础】Html跨域跳转问题整理

    今天遇到一个问题,是有关 跨域跳转问题,涉及到知识比较基础. 具体问题是:  A站点的 PageA (Post数据)到 B站点的 PageB,PageB接受到后Redirect到B站的 PageC:  ...

  6. 改变Visual Studio 2012的皮肤

    习惯了用vs的绿色背景,vs2012有自己的主题管理工具--Theme Editor vs2012默认没有安装Theme Editor,菜单:工具->扩展和更新,搜索栏里面输入Theme Edi ...

  7. [moka同学笔记]yii表单dropdownlist样式

    <?= $form->field($modelUser,'name') ?> <div class="form-group field-community-mobil ...

  8. js 当前日期及时间

    返回时间格式 : 2016-07-22 10:22:30 function getNowFormatDate() { var date = new Date(); var seperator1 = & ...

  9. 中国各城市PM2.5数据间的相关分析

    code{white-space: pre;} pre:not([class]) { background-color: white; }if (window.hljs && docu ...

  10. 基于进程的Quartz.NET管理系统QuartzService(一)

    需求 在处理定时任务大家可能都用过Quartz.NET,但在生产环境中大家肯定也遇到过如下的问题: 发布的时候需要停掉所有的Job,再整个一起打包发布 没有管理界面(其实在github也有几个这方面的 ...