首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

内存管理机制(详细介绍) (2)

内存管理机制(详细介绍) (2)

结果如下:

可以看出,总物理内存是1G,可用物理内存是510兆,总页文件是2.5G,这个是包含物理内存的页文件;可用页文件是1.9G。这里还标识了总进程空间,还有可用的进程空间,程序只用了22兆的内存空间。这里说的都是大约数。
内存繁忙程序是标识当前系统内存管理的繁忙程序,从0到100,其实用处不大。

·        在函数里面静态分配一些内存后,看看究竟发生什么
char stat[65536];
            MEMORYSTATUS memStatus1;
            GlobalMemoryStatus(&memStatus1);
            cout<<"静态分配空间:"<<endl;
            printf("指针地址=%x\n",stat);
cout<<"减少物理内存="<<memStatus.dwAvailPhys-memStatus1.dwAvailPhys<<endl;
cout<<"减少可用页文件="<<memStatus.dwAvailPageFile-memStatus1.dwAvailPageFile<<endl;
cout<<"减少可用进程空间="<<memStatus.dwAvailVirtual-              
memSta tus1.dwAvailVirtual<<endl<<endl;
结果如下:


可以看出,物理内存、可用页文件和进程空间都没有损耗。因为局部变量是分配在线程堆栈里面的,每个线程系统都会建立一个默认1M大小的堆栈给线程函数调用使用。如果分配超过1M,就会出现堆栈溢出。

·        在函数里面动态分配300M的内存后,看看究竟发生什么
char *dynamic=new char[300*1024*1024];
            MEMORYSTATUS memStatus2;
            GlobalMemoryStatus(&memStatus2);
            cout<<"动态分配空间:"<<endl;
            printf("指针地址=%x\n",dynamic);
cout<<"减少物理内存="<<memStatus.dwAvailPhys-memStatus2.dwAvailPhys<<endl;
cout<<"减少可用页文件="<<memStatus.dwAvailPageFile-memStatus2.dwAvailPageFile<<endl;
cout<<"减少可用进程空间="<<memStatus.dwAvailVirtual-memStatus2.dwAvailVirtual<<endl<<endl;
结果如下:


动态分配情况下,系统分配直到内存页文件使用完为止,当然,系统要留一下系统使用的页面。

2.3 进程区域地址查询
在给定一个进程空间的地址后,可以查询它所在区域和相邻页面的状态,包括页面保护属性、存储器类型等。
·        C++静态分配了两次内存,一次是4K大一点,一个是900K左右。
char arrayA[4097];
            char arrayB[900000];
第一次查询:
            long len=sizeof(MEMORY_BASIC_INFORMATION);
            MEMORY_BASIC_INFORMATION mbiA;
            VirtualQuery(arrayA,&mbiA,len);
            cout<<"静态内存地址属性:"<<endl;
            cout<<"区域基地址="<<mbiA.AllocationBase<<endl;
            cout<<"区域邻近页面状态="<<mbiA.State<<endl;
            cout<<"区域保护属性="<<mbiA.AllocationProtect<<endl;
            cout<<"页面基地址="<<mbiA.BaseAddress<<endl;
            printf("arrayA指针地址=%x\n",arrayA);
            cout<<"从页面基地址开始的大小="<<mbiA.RegionSize<<endl;
            cout<<"邻近页面物理存储器类型="<<mbiA.Type<<endl;
            cout<<"页面保护属性="<<mbiA.Protect<<endl<<endl;
第二次查询:
            MEMORY_BASIC_INFORMATION mbiB;
            VirtualQuery(arrayB,&mbiB,len);
            cout<<"静态内存地址属性:"<<endl;
            cout<<"区域基地址="<<mbiB.AllocationBase<<endl;
            cout<<"区域邻近页面状态="<<mbiB.State<<endl;
            cout<<"区域保护属性="<<mbiB.AllocationProtect<<endl;
            cout<<"页面基地址="<<mbiB.BaseAddress<<endl;
            printf("arrayB指针地址=%x\n",arrayB);
            cout<<"从页面基地址开始的大小="<<mbiB.RegionSize<<endl;
            cout<<"邻近页面物理存储器类型="<<mbiB.Type<<endl;
   cout<<"页面保护属性="<<mbiB.Protect<<endl<<endl;

说明:区域基地址指的是给定地址所在的进程空间区域;
邻近页面状态指的是与给定地址所在页面状态相同页面的属性:MEM_FREE(空闲=65536)、MEM_RESERVE(保留=8192)和MEM_COMMIT(提交=4096)。
区域保护属性指的是区域初次被保留时被赋予的保护属性:PAGE_READONLY(2)、PAGE_READWRITE(4)、PAGE_WRITECOPY(8)和PAGE_EXECUTE_WRITECOPY(128)等等。
页面基地址指的是给定地址所在页面的基地址。
从页面基地址开始的区域页面的大小,指的是与给定地址所在页面状态、保护属性相同的页面。
邻近页面物理存储器类型指的是与给定地址所在页面相同的存储器类型,包括:MEM_PRIVATE(页文件=131072)、MEM_MAPPED(文件映射=262144)和MEM_IMAGE(exe映像=16777216)。
页面保护属性指的是页面被指定的保护属性,在区域保护属性指定后更新。

结果如下:
继承事业,薪火相传
返回列表