实验六:系统内存使用统计
一、实验目的
(1).了解Windows内存管理机制,理解页式存储管理技术。
(2).熟悉Windows内存管理基本数据结构。
(3).掌握Windows内存管理基本API的使用。
二、实验准备
1.Windows内存管理基本数据结构
系统结构MEMORYSTATUS中包含当前物理内存和虚拟内存和虚拟内存信息,使用函数GlobaiMemoryStatus()可以将这些信息存储在结构MEMORYSTATUS中。
结构原型:
Typedef struct_MRMORYSTATUS{
DWORD dwLength; //MOMORYSTATUS结构大小,单位为字节
DWORD dwMemoryLoad; //内存利用率
DWORD dwTotalPhys; //物理内存大小
DWORD dwAvailPhys; //空闲物理内存大小
DWORD dwTotalPageFile; //页文件大小
DWORD dwAvailPageFile; //空闲页文件大小
DWORD dwTotalVirtual; //虚拟地址空间大小
DWORD dwAvailVirtual; //空闲虚拟地址空间大小
} MEMORYSTATUS, *LPMEMORYSTAYUS;
2.Windows内存管理基本API的使用
(1).获取系统物理内存和虚拟内存使用信息
原型:
VID GlobalMemoryStatus(
LPMEMORYSTATUS lpBuffer //指向MEMORYSTATUS数据结构的指针
);
(2).保留或提交某一点虚拟地址空间 函数VirtualAlloc()可以在调用进程的虚拟地址空间中保留或提交若干页面。保留意味着这段虚拟地址地址不能被使用,当提交时,这段虚拟地址才真正被分配给进程。
原型:
VPVOID VirtuaiAlloc(
LPVOID lpAddress, //待分配空间的起始位置
DWORD dwSize, //待分配空间的大小
DWORD flAllocationType, //分配类型
DWORD flaProtect //存取保护的类型
);
返回值:
如果函数调用成功,则返回值为已分配虚拟地址空间的起始地址。如果函数调用失败,则返回值为NULL。
(3).释放或注销某一段虚拟地址空间 函数VirtualFree()用于释放或注销某一段虚拟地址空间。
原型:
BOOL VirtualFree(
LPVOID lpAddress, //待分配空间的起始位置
DWORD dwSize, //待分配空间的大小
DWORD dwFreeType //释放操作类型
);
返回值:
如果函数调用成功,则返回值为非零。
如果函数调用失败,则返回值为零。
(4).分配内存空间
原型:
void *malloc(site_t size //要分配内存大小,单位为B(字节)
);
返回值:
该函数返回分配内存空间void类型的指针。如果返回NULL,说明没有有效的内存空间可供分配。
(5).释放内存空间
原型:
Void free(void * memblock //*memblock:要释放的内存地址。
);
三、实验内容
(一)实验内容
使用Windows系统提供的函数和数据结构显示系统存储空间的使用情况,当内存和虚拟存储空间变化时,观察系统显示变化情况。能正确使用系统函数GlobalMemoryStatus()和数据结构MEMORYSTATUS了解系统内存和虚拟存储空间使用情况,会使用VirtualAllocation()函数和VirtualFree()函数分配和释放虚拟存储空间。
(二)主要代码
// 06.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "06.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
void GetMemSta(void);
CWinApp theApp;
using namespace std;
int _tmain(int arcg, TCHAR* argv[],TCHAR* envp[])
{
int nRetCode = 0;
LPVOID BaseAddr;
char * str;
GetMemSta() ;
printf("Now 分配66MB虚拟内存和5MB物理内存后:\n\n");
BaseAddr = VirtualAlloc(NULL,1024*1024*66,MEM_RESERVE,PAGE_READWRITE);
if (BaseAddr == NULL)
printf ("Virtual Allocate Fail\n");
str = (char * )malloc(1024*1024*5);
GetMemSta();
printf("Now 释放66MB虚拟内存和5MB物理内存后:\n\n");
if (VirtualFree(BaseAddr,0,MEM_RELEASE) == 0)
printf("Release Allocation Fail\n");
free (str);
GetMemSta();
return nRetCode;
}
void GetMemSta(void)
{
MEMORYSTATUS MemInfo;
GlobalMemoryStatus (&MemInfo);
printf("当前内存状态为: \n");
printf("\t Total Physical Memory is %d MB\n",MemInfo.dwTotalPhys/(1024*1024));
printf("\t Available Physical Memoryis %d MB\n", MemInfo.dwAvailPhys/(1024*1024));
printf("\t Total Page File is %d MB\n",MemInfo.dwTotalPageFile/(1024*1024));
printf("\t Available Page File is %d MB\n",MemInfo.dwAvailPageFile/(1024*1024));
printf("\t Total Virtual Memory is %d MB\n",MemInfo.dwTotalVirtual/(1024*1024));
printf("\t Available Virtual Memory is %d MB\n",MemInfo.dwAvailVirtual/(1024*1024));
printf("\t Memory Load is %d % %\n\n",MemInfo.dwMemoryLoad);
}
四、实验结果与总结
(1).程序开始运行时,显示可用物理内存为330MB,可用页文件大小为1091MB,可用虚拟内存为2031MB。
(2).当分别使用函数VirtualAlloc()和malloc()分配了66MB虚拟内存和5MB物理内存后,系统显示可用物理内存为325MB,可用页文件大小为1086MB,可用虚拟内存为1960MB。
(3).当分别使用函数VirtualFree()和free()释放了66MB虚拟内存和5MB物理内存后,系统的显示情况又恢复到了(1)的情况。
通过本次实验学会使用Windows系统提供的函数和数据结构显示系统存储空间的使用情况,学会了使用系统函数GlobalMemoryStatus()和数据结构MEMORYSTATUS了解系统内存和虚拟存储空间使用情况,会使用VirtualAllocation()函数和VirtualFree()函数分配和释放虚拟存储空间。
版权声明:本文为qq_44919455原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。