Windows内存体系
文章平均质量分 66
力求全面的介绍在Ring3层开发过程中需要了解的Windows内存体系方面的知识。
china_jeffery
持续学习者;
擅长开发开源组件及相关工具;
长期致力于应用各种IT新技术提升生产效率和解决实际问题;
展开
-
Windows内存体系(1) -- 虚拟地址空间
一、实模式下内存分配机制在8086或者80186以前,要运行一个程序,操作系统会把这些程序全都装入内存,程序都是直接运行在物理内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。例如某台计算机总的内存大小是128M ,现在同时运行两个程序 A和B ,A需占用内存10M , B需占用内存110...原创 2018-03-19 14:07:17 · 34325 阅读 · 7 评论 -
Windows内存体系(2) -- 页交换文件
一、页交换文件虚拟地址空间只是操作系统为进程“虚拟”出来的一块地址区域,并不代表任何实际的空间。而“页交换文件”却对应了实际的空间,这个空间一般是磁盘上名为“pagefile.sys”的文件。“页交换文件”的大小和位置可以在系统设置(系统属性 -> 高级 -> 性能 -> 设置 -> 高级 )中进行设置: 从微软的官方文档来看,“虚拟内存”等于“物理内存”+...原创 2018-03-19 15:59:18 · 34740 阅读 · 8 评论 -
Windows内存体系(3) -- 虚拟内存使用实例
虚拟内存方面的API属于页面粒度API,通过这些API分配的内存的最小粒度是64KB。另外通过前面的《Windows内存体系(2) – 页交换文件》文章,我们可以知道,这些API分配(调拨)的内存区域最初都是位于“页交换文件”上面,当程序对该区域的某些“页面”(对虚拟内存的管理以页面为单位进行的)进行读写时,才会将这些页面交换到物理内存上面。从《Windows内存体系(1) – 虚拟地址空间》...原创 2018-03-20 15:17:03 · 31736 阅读 · 0 评论 -
Windows内存体系(4) -- 内存映射文件
“内存映射文件”可以将硬盘上的文件映射到虚拟地址空间,这样就不需要将所有东西都放入到页交换文件中,比如系统有许多程序同时运行时,如果将这些程序文件都加载到页交换文件中,页交换文件将会变得非常大。事实上,Windows也并没有将硬盘上的程序文件复制到页交换文件中,因为这样不仅会让页交换文件将会变得非常大,也会浪费很多时间,特别是可执行程序非常大的时候。当用户要求执行一个应用程序时,系统会打开该应...原创 2018-03-19 17:50:12 · 33581 阅读 · 1 评论 -
Windows内存体系(5)-- 内存映射文件技术的使用
前面的《Windows内存体系(3) – 内存映射文件》文章,对内存映射文件技术的原理进行了介绍,本篇文章着重介绍该技术的使用场景。一、内存映射文件技术介绍常用的有Win32 API的CreateFile()、WriteFile()、ReadFile()和MFC提供的CFile类都可以实现文件的读写操作。一般来说,以上这些函数可以满足大多数场合的要求,但是对于某些特殊应用领域所...原创 2018-03-02 22:08:26 · 52976 阅读 · 1 评论 -
Windows内存体系(6) -- 彻底理解内存对齐
一、内存为什么要对齐虽然所有的变量都是保存在特定地址的内存中,但最好还是按照内存对齐的要求来存储。这主要出于两个方面的原因考虑: 平台原因: 不是所有的硬件平台(特别是嵌入式系统中使用的低端处理器)都能访问任意地址上的任意数据,某些硬件平台只能访问对齐的地址,否则会出现硬件异常。 性能原因: 如果数据存放在未对齐的内存空间中,则处理器访问变量时需要进行两次内存访问才能完整读取该...原创 2017-12-24 23:40:51 · 94745 阅读 · 3 评论 -
Windows内存体系(7) -- 堆
一、为什么要使用堆?应用程序虽然可以使用页面粒度的函数(如VirualAlloc)来分配一个最小为64KB的内存块,但是很多时候我们并不需要分配这么大的内存块,我们可能只想分配1K,2K的内存块,那么这个时候无论从内存的使用率,还是从性能的角度来看,再分配这么大的一个内存区域显然不是最优的了。为了满足这种需求,Windows提供了一个被称为“堆管理器”的组件,它负责管理大内存区域中的内存分...原创 2018-03-20 18:16:29 · 33604 阅读 · 1 评论 -
Windows内存体系(8) -- 内存管理API分层结构
从上图可以看到,虚拟内存机制(Virtual Memory)是windows内存体系的基础,无论你是使用堆,还是使用内存映射文件,它们的底层都是基于虚拟内存来实现的。从上往下,每一层的API在内部会依次调用下一层的API。下图中列举了每层API中经常使用的函数:CRT Memory Functions:malloc, free, new, deleteLocal, Global M...原创 2018-03-20 22:33:55 · 31828 阅读 · 0 评论 -
Windows内存体系(9) -- 跨MT模块的内存相互释放的问题
在阅读本文之前,需要先对MT和MD运行时库有所了解,参考:《理解C/C++运行时库》。另外建议先阅读《Windows内存体系》系列文章的前几篇文章,对“虚拟内存”,“堆”,“内存API体系结构”有所了解。《Windows核心编程 第五版》第19章 DLL基础(511页)中给出了一个建议:“当一个MT版本的模块如果提供一个内存分配函数的时候,它必须同时提供另一个用来释放内存的函数。”。说...原创 2018-03-22 17:21:52 · 49584 阅读 · 0 评论 -
Windows内存体系(10) -- 使用std::string跨MT模块传参
前面的《Windows内存体系(9) – 跨MT模块的内存相互释放的问题》文章解释了跨MT模块分配的内存相互释放为什么会崩溃的问题。一、问题描述这篇文章主要介绍我们在实际开发中经常遇到的一个问题:针对MT模块定义接口函数时,接口参数使用std::string类型,在程序运行时遇到"Debug Assertioni Failed"错误的问题。 上面的错误提示是debug_heap....原创 2018-03-28 12:11:51 · 43802 阅读 · 1 评论