操作系统实验:系统内存使用统计

实验六:系统内存使用统计


一、实验目的

(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()函数分配和释放虚拟存储空间。

image


版权声明:本文为qq_44919455原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。