版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本文背景:在编程中,很多Windows或C+的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。本文目的:对Windows内存管理机制了解清楚,有效的利用C+内存函数管理和使用内存。本文内容:本文一共有六节,由于篇幅较多,故按节发表。其他章节请看本人博客的Windows内存管理及C+内存分配实例(一)(三)(四)(五)和(六)。2. 内存状态查询函数2.1系统信息Windows 提供API可以查询系统内存的一些属性,有时候我们需要获取一些页
2、面大小、分配粒度等属性,在分配内存时用的上。请看以下C+程序:SYSTEM_INFO sysInfo;GetSystemInfo(&sysInfo;cout<<"机器属性:"< cout<<"页大小="< cout<<"分配粒度="< cout<<"用户区最小值="< cout<<"用户区最大值="< 结果如下: 可以看出,页面大小是4K,区域分配粒度是64K,进程用户区是0x0001 0
3、0000x7FFE FFFF。 2.2内存状态 内存状态可以获取总内存和可用内存,包括页文件和物理内存。请看以下C+程序:MEMORYSTATUS memStatus;GlobalMemoryStatus(&memStatus;cout<<"内存初始状态:"< cout<<"内存繁忙程度="< cout<<"总物理内存="< cout<<"可用物理内存=&qu
4、ot;< cout<<"总页文件="< cout<<"可用页文件="< cout<<"总进程空间="< cout<<"可用进程空间="< 结果如下:可以看出,总物理内存是1G,可用物理内存是510兆,总页文件是2.5G,这个是包含物理内存的页文件;可用页文件是1.9G。这里还标识了总进程空间,还有可用的进程空间,程序只用了22兆的内存空间。这里说的都是大约数。内存繁忙程序是标识当前系统内存管理的繁忙程序,从0到100,其实用处不大。
5、60; 在函数里面静态分配一些内存后,看看究竟发生什么char stat65536;MEMORYSTATUS memStatus1;GlobalMemoryStatus(&memStatus1;cout<<"静态分配空间:"< printf("指针地址=%x/n",stat;cout<<"减少物理内存="< cout<<"减少可用页文件="< cout<<&q
6、uot;减少可用进程空间="< memSta tus1.dwAvailVirtual< 结果如下: 可以看出,物理内存、可用页文件和进程空间都没有损耗。因为局部变量是分配在线程堆栈里面的,每个线程系统都会建立一个默认1M大小的堆栈给线程函数调用使用。如果分配超过1M,就会出现堆栈溢出。 在函数里面动态分配300M的内存后,看看究竟发生什么char *dynamic=new char300*1024*1024;MEMORYSTATUS memStatus2
7、;GlobalMemoryStatus(&memStatus2;cout<<"动态分配空间:"< printf("指针地址=%x/n",dynamic;cout<<"减少物理内存="< cout<<"减少可用页文件="< cout<<"减少可用进程空间="< 结果如下: 动态分配情况下,系统分配直到内存页文件使用完为止,当然,系统要留一下系统使用的页面。 2.3 进程区域地址查询在给定一个进程空间
8、的地址后,可以查询它所在区域和相邻页面的状态,包括页面保护属性、存储器类型等。 C+静态分配了两次内存,一次是4K大一点,一个是900K左右。char arrayA4097;char arrayB900000;第一次查询:long len=sizeof(MEMORY_BASIC_INFORMATION;MEMORY_BASIC_INFORMATION mbiA;VirtualQuery(arrayA,&mbiA,len;cout<<"静态内存地址属性:"< cout
9、<<"区域基地址="< cout<<"区域邻近页面状态="< cout<<"区域保护属性="< cout<<"页面基地址="< printf("arrayA指针地址=%x/n",arrayA;cout<<"从页面基地址开始的大小="< cout<<"邻近页面物理存储器类型="< cout<<"页面保护属性="<
10、第二次查询:MEMORY_BASIC_INFORMATION mbiB;VirtualQuery(arrayB,&mbiB,len;cout<<"静态内存地址属性:"< cout<<"区域基地址="< cout<<"区域邻近页面状态="< cout<<"区域保护属性="< cout<<"页面基地址="< printf("arrayB指针地址=%x/n",arrayB;cout&l
11、t;<"从页面基地址开始的大小="< cout<<"邻近页面物理存储器类型="< cout<<"页面保护属性="< 说明:区域基地址指的是给定地址所在的进程空间区域;邻近页面状态指的是与给定地址所在页面状态相同页面的属性:MEM_FREE(空闲=65536)、MEM_RESERVE(保留=8192)和MEM_COMMIT(提交=4096)。区域保护属性指的是区域初次被保留时被赋予的保护属性:PAGE_READONLY(2)、PAGE_READWRITE(4)、PAGE_WRI
12、TECOPY(8)和PAGE_EXECUTE_WRITECOPY(128)等等。页面基地址指的是给定地址所在页面的基地址。从页面基地址开始的区域页面的大小,指的是与给定地址所在页面状态、保护属性相同的页面。邻近页面物理存储器类型指的是与给定地址所在页面相同的存储器类型,包括:MEM_PRIVATE(页文件=131072)、MEM_MAPPED(文件映射=262144)和MEM_IMAGE(exe映像=16777216)。页面保护属性指的是页面被指定的保护属性,在区域保护属性指定后更新。 结果如下: 如前所说,这是在堆栈区域0x0004 0000里分配的,后分配的地址arra
13、yB反而更小,符合堆栈的特性。arrayA和arrayB它们处于不同的页面。页面都受页文件支持,并且区域都是提交的,是系统在线程创建时提交的。 C+动态分配了两次内存,一次是1K大一点,一个是64K左右。所以应该不会在一个区域。char *dynamicA=new char1024;char *dynamicB=new char65467;VirtualQuery(dynamicA,&mbiA,len;cout<<"动态内存地址属性:"< cout<
14、;<"区域基地址="< cout<<"区域邻近页面状态="< cout<<"区域保护属性="< cout<<"页面基地址="< printf("dynamicA指针地址=%x/n",dynamicA;cout<<"从页面基地址开始的大小="< cout<<"邻近页面物理存储器类型="< cout<<"页面保护属性="<
15、 VirtualQuery(dynamicB,&mbiB,len;cout<<"动态内存地址属性:"< cout<<"区域基地址="< cout<<"区域邻近页面状态="< cout<<"区域保护属性="< cout<<"页面基地址="< printf("dynamicB指针地址=%x/n",dynamicB;cout<<"从页面基地址开始的大小
16、="< cout<<"邻近页面物理存储器类型="< cout<<"页面保护属性="< 结果如下: 这里是动态分配,dynamicA和dynamicB处于两个不同的区域;同样,页面都受页文件支持,并且区域都是提交的。第二个区域是比64K大的,由分配粒度可知,区域至少是128K。那么,剩下的空间也是提交的吗,如果是的话那就太浪费了。看看就知道了:0x00E2 1000肯定在这个空间里,所以查询如下:VirtualQuery(char*0xE23390,&mbiB,len;cout<<"动态内存地址属性:"< cout<<"区域基地址="< cout<<"区域邻近页面状态="< cout<<"区域保护属性="< cout<<"页面基地址="< printf("dynamicB指针地址=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湖南科技学院《中国古典舞基础训练教学法》2023-2024学年第一学期期末试卷
- 湖南工业大学科技学院《数据库技术基础》2021-2022学年第一学期期末试卷
- 人教版道德与法治九年级上册第三单元第五课第二课时凝聚价值追求分层作业课件
- 2020-2021学年江西省南昌市八年级下学期期末数学试题
- 轻金属工艺装备工程技术研究中心建设可行性研究报告报告
- 乳制品行业市场规模与竞争趋势分析
- 《计算机网络 》课件第1章
- XX省流动人口计划生育管理规定
- 2024至2030年中国液体灌装秤行业投资前景及策略咨询研究报告
- 2024至2030年中国高速毛条机行业投资前景及策略咨询研究报告
- 大锁孙天宇小品《时间都去哪了》台词剧本完整版-一年一度喜剧大赛
- 部编版三年级上册道德与法治期末测试卷
- 从分数到分式教学设计-
- 《人力资源管理》-课件-第八章-国际人力资源管理
- 颅脑损伤课件
- 原材料情况说明范本
- 植物工厂简介
- 齿轮轴 机械加工工艺过程卡片
- 人教版八年级上册数学全册课件PPT
- 新能源系统 课件 第10章 多能互补、可持续能源系统
- 抗生素类药物分析-抗生素类药物概述(药物分析课件)
评论
0/150
提交评论