欢迎来到天天文库
浏览记录
ID:22513870
大小:773.50 KB
页数:50页
时间:2018-10-29
《全面介绍windows内存管理机制及c++内存分配实例》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、全面介绍Windows内存管理机制及C++内存分配实例(一):进程空间在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。本文目的:对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。本文内容:本文一共有六节,由于篇幅较多,故按节发表。其他章节请看本人博客的Windows内存管理及C++内存分配实例(二)(三)(四)(五)和(六)。1. 进程地址空间1.1地址空间· 32
2、64位的系统
3、CPU
4、 操作系统运行在硬件CPU上,32位操作系统运行于32位CPU上,64位操作系统运行于64位CPU上;目前没有真正的64位CPU。32位CPU一次只能操作32位二进制数;位数多CPU设计越复杂,软件设计越简单。 软件的进程运行于32位系统上,其寻址位也是32位,能表示的空间是232=4G,范围从0x00000000~0xFFFFFFFF。· NULL指针分区范围:0x00000000~0x0000FFFF作用:保护内存非法访问例子:分配内存时,如果由于某种原因分配不成功,则返回空指针0x00000000;当用户继续使用比如改写数据时
5、,系统将因为发生访问违规而退出。 那么,为什么需要那么大的区域呢,一个地址值不就行了吗?我在想,是不是因为不让8或16位的程序运行于32位的系统上呢?!因为NULL分区刚好范围是16的进程空间。· 独享用户分区范围:0x00010000~0x7FFEFFFF作用:进程只能读取或访问这个范围的虚拟地址;超越这个范围的行为都会产生违规退出。例子: 程序的二进制代码中所用的地址大部分将在这个范围,所有exe和dll文件都加载到这个。每个进程将近2G的空间是独享的。注意:如果在boot.ini上设置了/3G,这个区域的范围从2G扩大为3G
6、:0x00010000~0xBFFEFFFF。· 共享内核分区范围:0x80000000~0xFFFFFFFF作用:这个空间是供操作系统内核代码、设备驱动程序、设备I/O高速缓存、非页面内存池的分配、进程目表和页表等。例子: 这段地址各进程是可以共享的。 注意:如果在boot.i
7、ni上设置了/3G,这个区域的范围从2G缩小为1G:0xC0000000~0xFFFFFFFF。 通过以上分析,可以知道,如果系统有n个进程,它所需的虚拟空间是:2G*n+2G(内核只需2G的共享空间)。 1.2地址映射· 区域区域指的是上述地址空间中的一片连续地址。区域的大小必须是粒度(64k) 的整数倍,不是的话系统自动处理成整数倍。不同CPU粒度大小是不一样的,大部分都是64K。区域的状态有:空闲、私有、映射、映像。在你的应用程序中,申请空间的过程称作保留(预订),可以用VirtualAlloc;删除空间的过程为释放,可以用VirtualF
8、ree。 在程序里预订了地址空间以后,你还不可以存取数据,因为你还没有付钱,没有真实的RAM和它关联。这时候的区域状态是私有;默认情况下,区域状态是空闲;当exe或DLL文件被映射进了进程空间后,区域状态变成映像;当一般数据文件被映射进了进程空间后,区域状态变成映射。· 物理存储器Windows各系列支持的内存上限是不一样的,从2G到64G不等。理论上32位CPU,硬件上只能支持4G内存的寻址;能支持超过4G的内存只能靠其他技术来弥补。顺便提一下,Windows个人版只能支持最大2G内存,Intel使用AddressWindowsExtensi
9、on(AWE) 技术使得寻址范围为236=64G。当然,也得操作系统配合。 内存分配的最小单位是4K或8K,一般来说,根据CPU不同而不同,后面你可以看到可以通过系统函数得到区域粒度和页面粒度。· 页文件页文件是存在硬盘上的系统文件,它的大小可以在系统属性里面设置,它相当于物理内存,所以称为虚拟内存。事实上,它的大小是影响系统快慢的关键所在,如果物理内存不多的情况下。 每页的大小和上述所说内存分配的最小单位是一样的,通常是4K或8K。· 访问属性物理页面的访问属性指的是对页
此文档下载收益归作者所有