读书笔记——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的运行性能最好.但是,线程很少能够在所有的时 ...
随机推荐
- Scrum 项目4.0--软件工程
1.准备看板. 2.任务认领,并把认领人标注在看板上的任务标签上. 林宇粲:处理数据的存储:目前先进行数据库表的分析和创建. 蔡舜:对复利计算,单利计算,代码进行编写. 王昕明:编写一些用户登录,操作 ...
- 准备.Net转前端开发-WPF界面框架那些事,值得珍藏的8个问题
题外话 不出意外,本片内容应该是最后一篇关于.Net技术的博客,做.Net的伙伴们忽喷忽喷..Net挺好的,微软最近在跨平台方面搞的水深火热,更新也比较频繁,而且博客园的很多大牛也写的有跨平台相关技术 ...
- 数论 - 组合数学 + 素数分解 --- hdu 2284 : Solve the puzzle, Save the world!
Solve the puzzle, Save the world! Problem Description In the popular TV series Heroes, there is a ta ...
- 译:c#生成条码的web控件
译文:http://www.codeproject.com/Tips/846860/Csharp-Barcode-Generator-Web-Control 在asp.net的web页用c#的web控 ...
- C#修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限
C#修改文件或文件夹的权限,为指定用户.用户组添加完全控制权限 public void SetFileRole(string foldPath) { DirectorySecurity fsec = ...
- LeetCode - Unique Binary Search Trees II
题目: Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. F ...
- 重新想象 Windows 8.1 Store Apps (93) - 控件增强: GridView, ListView
[源码下载] 重新想象 Windows 8.1 Store Apps (93) - 控件增强: GridView, ListView 作者:webabcd 介绍重新想象 Windows 8.1 Sto ...
- ActiveReports 报表控件官方中文入门教程 (1)-安装、激活以及产品资源
本系列文章主要是面向初次接触 ActiveReports 产品的用户,可以帮助您在三天之内轻松的掌握ActiveReports控件的基本使用方法,包括安装.激活.创建报表.绑定数据源以及发布等内容.本 ...
- fibonacci封闭公式
Description 2007年到来了.经过2006年一年的修炼,数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]=0,f[1]=1;f[i] = f[i-1]+f ...
- 泛函编程(24)-泛函数据类型-Monad, monadic programming
在上一节我们介绍了Monad.我们知道Monad是一个高度概括的抽象模型.好像创造Monad的目的是为了抽取各种数据类型的共性组件函数汇集成一套组件库从而避免重复编码.这些能对什么是Monad提供一个 ...