全面介绍Windows内存管理机制及C内存分配实例(二)_第1页
全面介绍Windows内存管理机制及C内存分配实例(二)_第2页
全面介绍Windows内存管理机制及C内存分配实例(二)_第3页
全面介绍Windows内存管理机制及C内存分配实例(二)_第4页
全面介绍Windows内存管理机制及C内存分配实例(二)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论