微软的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. 程序代码记Log

    private static object s_lock = new object(); public static void TraceLog(string message, string logF ...

  2. BLOCK的应用

    相比看一下枯燥乏味的对于block的讲解,为什么不从大神的代码中领路它的使用方法呢,了解一下大神是如何使用block的呢,见识它的强大.https://github.com/zwaldowski/Bl ...

  3. 《构建之法》第8、9、10章 读书笔记和Sprint总结

    第八章:需求分析 这章主要解析了需求的多面方面,不同的项目需要不同的手段,真正的需求稍纵即逝,需要靠火眼金睛和敏捷的身手来发现并抓住它们.另外,很多时候用户并不知道自己确切的需求,或者不愿意表达完整的 ...

  4. TortoiseSVN的bin目录下面没有svn.exe

    自己在idea联合svn时遇到这个问题,然后bd和gg,发现很多人都乱说,说什么TortoiseSVN是客户端,默认不包含svn.exe,需要安装Subversion.bullshit! 之所以没有, ...

  5. Winform开发框架之字典管理模块的更新,附上最新2013年全国最新县及县以上行政区划代码sql脚本

    在很多项目里面,字典管理是必备的项目模块,而这个又是比较通用的功能,因此可以单独做成一个通用字典管理,例如这个模块,可以通过集成的方式,使用在我的<Winform开发框架>.<WCF ...

  6. 重新想象 Windows 8.1 Store Apps (84) - 图像处理的新特性, Share Contract 的新特性

    [源码下载] 重新想象 Windows 8.1 Store Apps (84) - 图像处理的新特性, Share Contract 的新特性 作者:webabcd 介绍重新想象 Windows 8. ...

  7. Fluent NHibernate example

    http://www.codeproject.com/Articles/26466/Dependency-Injection-using-Spring-NET http://stackoverflow ...

  8. csharp: DataTable Rename ColumnName and remove Column

    enum ChangeNume { /// <summary> /// 简体 /// </summary> gbk=1, /// <summary> /// 英文 ...

  9. 译 PrestaShop开发者指南 第二篇 代码规范

    原文:<http://doc.prestashop.com/display/PS15/Coding+Standards> 废话不多译了,讲重点. 代码风格验证工具:CodeSniffer( ...

  10. 通过代码的方式完成WCF服务的寄宿工作

    使用纯代码的方式进行服务寄宿 服务寄宿的目的是为了开启一个进程,为WCF服务提供一个运行的环境.通过为服务添加一个或者多个终结点,使之暴露给潜在的服务消费,服务消费者通过匹配的终结点对该服务进行调用, ...