读书笔记——Windows核心编程(15)在应用程序中使用虚拟内存
微软的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)在应用程序中使用虚拟内存的更多相关文章
- 《windows核心编程》 在应用程序中使用虚拟内存
Microsoft Windows 提供了以下三种机制来对内存进行操控: 虚拟内存 最适合用来管理大型对象数组或大型结构数组 内存映射文件 最适合用来管理大型数据流(通常是文件),以及在同一台机器上运 ...
- 读书笔记——Windows核心编程(8)Interlocked单向链式栈
SLists使用了无锁算法来保证原子同步,以提升系统性能,避免了诸如优先级挂和互锁的问题. 注意:所有的链表项必须对齐到MEMORY_ALLOCATION_ALIGNMENT.否则会出现奇葩的错误. ...
- 读书笔记——Windows核心编程(8)Interlocked系列函数
先让我们来复习下小学知识 A+B=C//式中A为被加数,B为加数. A-B=C//式中A为被减数,B为减数. 再让我们来明确一个知识点:返回值为void的Windows函数意味着一定会执行成功. -- ...
- 读书笔记——Windows核心编程(2)比较字符串
1. CompareString 以符合用户语言习惯的方式,EX版本使用UNICODE int CompareString( __in LCID Locale, __in DWORD dwCmpFla ...
- 读书笔记——Windows核心编程(13)Windows内存体系结构
对于32位进程(0x0000 0000~0xFFFF FFFF),有4GB的地址空间. 每个进程都有自己专有的地址空间,当进程的各个线程运行时,它们只能访问属于该进程的内存. 这4GB其实是虚拟地址空 ...
- 读书笔记——Windows核心编程(2)禁止C运行时触发的所有Debug Assertion Failed对话框
1 定义一个函数 void _invalid_parameter( const wchar_t * expression, const wchar_t * function, const wchar_ ...
- Windows核心编程 第八章 用户方式中线程的同步(下)
8.4 关键代码段 关键代码段是指一个小代码段,在代码能够执行前,它必须独占对某些共享资源的访问权.这是让若干行代码能够"以原子操作方式"来使用资源的一种方法.所谓原子操作方式,是 ...
- windows核心编程-第一章 对程序错误的处理
第一章-对程序错误的处理 在开始介绍Microsoft Windows 的特性之前,必须首先了解 Wi n d o w s的各个函数是如何进行错误处理的. 当调用一个Wi n d o w s函数时,它 ...
- Windows核心编程 第八章 用户方式中线程的同步(上)
第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...
随机推荐
- easyui-treegrid节点选择
easyui-treegrid本身不能实现选中父节点子节点全选,必须通过另外的方法来实现,这里说下如何通过修改节点样式添加checkbox来实现级联选择效果 首先需要格式化节点的样式 formatte ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- c#对Aspose.Word替换书签内容的简单封装
辅助类1 json和datatable互转: using System; using System.Collections.Generic; using System.Linq; using S ...
- 运行QQ出现initialization failure 0x0000000c错误和浏览器上不了网
出现QQ出现initialization failure 0x0000000c错误和浏览器上不了网的问题,原因是关机的时候没有正常关闭导致的. 解决方法: 1.我们在开始菜单栏中的附件中找到“命令提示 ...
- Fluent NHibernate and Spring.net
http://blog.bennymichielsen.be/2009/01/04/using-fluent-nhibernate-in-spring-net/ http://comments.gma ...
- Java-链表LinkedList源码原理分析,并且通过LinkedList构建队列
在这里我们介绍一下最简单的链表LinkedList: 看一下add()方法: public boolean add(E e) { linkLast(e); return true; } void li ...
- Ahjesus Nodejs02 使用集成开发环境
下载最新版webstorm, 选择此集成开发环境是因为支持性较好,在vs下也有插件支持,不过感觉有些牵强 附vs插件 NTVS 详细介绍 安装好以后就需要配置npm NPM 国内高速镜像 source ...
- 如何选择RabbitMQ的消息保存方式?
RabbitMQ对于queue中的message的保存方式有两种方式:disc和ram.如果采用disc,则需要对exchange/queue/delivery mode都要设置成durable模式. ...
- Glide
1.简介 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech.这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会 ...
- Android Studio 中 FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':compileDebugAidl'.的问题解答
Android Studio 中 FAILURE: Build failed with an exception. * What went wrong: Execution failed for ta ...