⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memorymanagement.cpp

📁 这是一个用API函数编写的操作系统的内存管理的程序的实现
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////////////////////////
//本程序是内存管理操作的实习程序。

//本程序使用Windows 2000/XP的API函数,实现一个包含两个线程的进程,Stimulator线程用于模拟内存分配
//活动,Mornitor线程用于跟踪Stimulator的内存模拟行为,两个进程之间通过信号量stimulator和mornitor
//实现同步,并且Stimulator所执行的操作由函数GenerateOperation()即时生成
//////////////////////////////////////////////////////////////////////////////////////////////
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<winbase.h>
#include<iostream.h>

HANDLE stimulator,mornitor;  //内存分配模拟线程、及其监测线程实现同步操作所用的信号量句柄

struct Operation
{
	int lastTime;        //操作的持续时间
	int blockSize;       //内存页数
	int operation;       //操作类型
	int protection;      //权限权限
};
//////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////
void GenerateOperation(Operation& op)
{//本函数生成要求进行的内存操作,通过引用返回操作类型
 //操作类型顺序由:保留-提交-加锁-解锁-回收-释放,并按此循环
 //操作权限由函数rand()随机生成

	static int oper=0;
	//注:oper代表当次要进行的内存操作的类型
    //用数字操作意义:0-保留;1-提交;2-加锁;3-解锁;4-回收;5-释放
	
	op.lastTime=rand()%1000;     //生成操作的持续时间
	op.blockSize=rand()%7+1;     //生成分配的内存块大小
	op.operation=oper++;         //指定操作的类型  
	
	//用数字代表操作权限:
	//0-PAGE_READONLY
	//1-PAGE_READWRITE
	//2-PAGE_EXECUTE
	//3-PAGE_EXECUTE_READ
	//4-PAGE_EXECUTE_READWRITE
	op.protection=rand()%5;      //指定操作的权限
	
	if(oper==6)//当oper达到6,一个"保留-提交-加锁-解锁-回收-释放"的操作循环结束,进入下一次循环
		oper = 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////
DWORD Mornitor(LPDWORD lpdwparm) 
{//监测线程,跟踪stimulator线程的内存分配行为,输出当前的系统和内存的信息
	while(1)
	{
		WaitForSingleObject(mornitor,INFINITE);  //等待内存分配线程Stimulator的内存分配活动结束
		cout<<"-------------------------------------------------------------------"<<endl;
		cout<<"进入监测线程.........\n"<<endl;
		Sleep(2000);

		//以下程序显示系统信息
	    SYSTEM_INFO SysInfo;    //系统信息
		cout<<"\n通过GetSystemInfo()访问得到的系统信息:\n"<<endl;
		Sleep(2000);

	    GetSystemInfo(&SysInfo);
		cout<<"ActiveProcessorMask:  "<<SysInfo.dwActiveProcessorMask<<endl;
		cout<<"AllocationGranularity:  "<<SysInfo.dwAllocationGranularity<<endl;
		cout<<"NumberOfProcessors:  "<<SysInfo.dwNumberOfProcessors<<endl;
		cout<<"OemId:  "<<SysInfo.dwOemId<<endl;
		cout<<"PageSize:  "<<SysInfo.dwPageSize<<endl;
		cout<<"ProcessorType:  "<<SysInfo.dwProcessorType<<endl;
		cout<<"MaximumApplicationAddress:  "<<SysInfo.lpMaximumApplicationAddress<<endl;
		cout<<"MinimumApplicationAderess:  "<<SysInfo.lpMinimumApplicationAddress<<endl;
		cout<<"ProcessorArchitecture:  "<<SysInfo.wProcessorArchitecture<<endl;
		cout<<"ProcessorLevel:  "<<SysInfo.wProcessorLevel<<endl;
		cout<<"ProcessorRevision:  "<<SysInfo.wProcessorRevision<<endl;
		cout<<"Reserved:  "<<SysInfo.wReserved<<endl;
		
		Sleep(2000);

		//以下程序显示内存状态
		MEMORYSTATUS MemStat;     //内存状态
		cout<<"\n通过GlobalMemoryMemStat()访问得到内存状态:\n"<<endl;
		Sleep(2000);

		GlobalMemoryStatus(&MemStat);
		cout<<"AvailPageFile:  "<<MemStat.dwAvailPageFile<<endl;
		cout<<"AvailPhys:  "<<MemStat.dwAvailPhys<<endl;
		cout<<"AvailVirtural:  "<<MemStat.dwAvailVirtual<<endl;
		cout<<"Length:  "<<MemStat.dwLength<<endl;
		cout<<"MemoryLoad:  "<<MemStat.dwMemoryLoad<<endl;
		cout<<"TotalPageFile:  "<<MemStat.dwTotalPageFile<<endl;
		cout<<"TotalPhy:  "<<MemStat.dwTotalPhys<<endl;
		cout<<"TotalVirtual:  "<<MemStat.dwTotalVirtual<<endl;		
		
		Sleep(2000);

		//以下程序显示内存基本信息
		MEMORY_BASIC_INFORMATION MemInfo;     //内存基本信息
		cout<<"\n通过VirtualQuery()访问得到内存基本信息:\n"<<endl;
		Sleep(2000);

		VirtualQuery(SysInfo.lpMinimumApplicationAddress,&MemInfo,sizeof(MEMORY_BASIC_INFORMATION));
		cout<<"AllocationBase:  "<<MemInfo.AllocationBase<<endl;
		cout<<"AllocationProtect:  "<<MemInfo.AllocationProtect<<endl;
		cout<<"BaseAddress:  "<<MemInfo.BaseAddress<<endl;
		cout<<"Protect:  "<<MemInfo.Protect<<endl;
		cout<<"RegionSize:  "<<MemInfo.RegionSize<<endl;
		cout<<"State:  "<<MemInfo.State<<endl;
		cout<<"Type:  "<<MemInfo.Type<<endl;
		Sleep(2000);

		cout<<"\n退出监测线程........\n"<<endl;
		Sleep(2000);
		cout<<"-------------------------------------------------------------------"<<endl;

		//释放stimulator信号量,告诉Stimulator可以执行下一次模拟的内存分配活动
		ReleaseSemaphore(stimulator,1,NULL);
	}
	return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////
void Stimulator()        
{//模拟内存分配活动的线程,通过GenerateOperation()生成当次要执行的模拟操作
	Operation op;
	SYSTEM_INFO SysInfo;
	DWORD privillage;      //操作权限
	LPVOID start;          //模拟分配操作的内存起始地址
	long size;             //模拟分配操作所分配的内存块大小

	//GetSystemInfo(&SysInfo);    //获得系统信息

	while(1)
	{
		WaitForSingleObject(stimulator,INFINITE);      //等待Mornitor的监测操作结束
		
		cout<<"进入模拟分配内存线程........\n"<<endl;
		Sleep(1000);
		GenerateOperation(op);     //生成当次要执行的模拟操作,通过引用反悔给op    
		Sleep(op.lastTime);        //内存分配操作的执行时间
		GetSystemInfo(&SysInfo);   //获得系统信息
		
		switch(op.protection)      //根据文件内容确定权限
		{
		case 0:
			privillage=PAGE_READONLY;
			break;
		case 1:
			privillage=PAGE_READWRITE;
			break;
		case 2:
			privillage=PAGE_EXECUTE;
			break;
		case 3:
			privillage=PAGE_EXECUTE_READ;
			break;
		case 4:
			privillage=PAGE_EXECUTE_READWRITE;
			break;
		default:
			privillage=PAGE_READONLY;
		}
		switch(op.operation)    //根据所要求的操作类型执行相应操作
		{
		case 0:  
			{
				cout<<"现在作保留一个内存区域的操作........"<<endl;
				Sleep(1000);
				start=VirtualAlloc(NULL,op.blockSize*SysInfo.dwPageSize,MEM_RESERVE,PAGE_NOACCESS);
				size=op.blockSize*SysInfo.dwPageSize;
				cout<<"起始地址:  "<<start<<"\t被保留的内存块的大小:  "<<size<<endl;
				Sleep(1000);
				cout<<"保留内存区域的操作完毕!"<<endl;
				Sleep(1000);
				break;
			}
		case 1:   
			{
				cout<<"现在作提交一个内存区域的操作........"<<endl;
				Sleep(1000);
				start=VirtualAlloc(start,size,MEM_COMMIT,privillage);
				cout<<"起始地址:  "<<start<<"\t被提交的内存块的大小:  "<<size<<endl;
				Sleep(1000);
				cout<<"提交内存区域的操作完毕!"<<endl;
				Sleep(1000);
				break;
			}
		case 2:
			{
				cout<<"现在作对一个内存区域加锁的操作........"<<endl;
				Sleep(1000);
				cout<<"起始地址:  "<<start<<"\t被加锁的内存块的大小:"<<size<<endl;
				if(!VirtualLock(start,size))
					cout<<"系统发生一个错误,该错误的信息码为: "<<GetLastError()<<endl;
				Sleep(1000);
				cout<<"加锁内存区域的操作完毕!"<<endl;
				Sleep(1000);
				break;
			}
		case 3:
			{
				cout<<"现在作对一个内存区域解锁的操作........"<<endl;
				Sleep(1000);
				cout<<"起始地址:  "<<start<<"\t被解锁内存块的大小:  "<<size<<endl;
				if(!VirtualUnlock(start,size))
					cout<<"系统发生一个错误,该错误的信息码为: "<<GetLastError()<<endl;
				Sleep(1000);
				cout<<"解锁内存区域的操作完毕!"<<endl;
				Sleep(1000);
				break;
			}
		case 4:
			{
				cout<<"现在作回收一个内存区域的操作........"<<endl;
				Sleep(1000);
				cout<<"起始地址:  "<<start<<"\t被回收内存块的大小:  "<<size<<endl;
				if(!VirtualFree(start,size,MEM_DECOMMIT))
					cout<<"系统发生一个错误,该错误的信息码为: "<<GetLastError()<<endl;
				Sleep(1000);
				cout<<"回收内存区域的操作完毕!"<<endl;
				Sleep(1000);
				break;
			}
		case 5:
			{
				cout<<"现在作释放一个内存区域的操作........"<<endl;
				Sleep(1000);
				cout<<"起始地址:  "<<start<<"\t被释放内存块的大小:  "<<size<<endl;
				if(!VirtualFree(start,0,MEM_RELEASE))
					cout<<"系统发生一个错误,该错误的信息码为: "<<GetLastError()<<endl;
				Sleep(1000);
				cout<<"释放内存区域的操作完毕!"<<endl;
				Sleep(1000);
				break;
			}
		default:
			cout<<"错误操作!"<<endl;
		}
		cout<<"\n退出模拟分配内存线程.........\n"<<endl;
		Sleep(1000);
		ReleaseSemaphore(mornitor,1,NULL);   //释放信号量,通知Morintor模拟内存分配操作结束,它可以实行监测了
	}
}
//////////////////////////////////////////////////////////////////////////////////////////////
void main()
{
	DWORD dwThread;
	HANDLE handle[2];
	stimulator = CreateSemaphore(NULL,0,1,"stimulator");
	mornitor = CreateSemaphore(NULL,1,1,"mornitor");

	handle[0] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Mornitor,NULL,0,&dwThread);
	handle[1] = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Stimulator,NULL,0,&dwThread);

	WaitForMultipleObjects(2,handle,TRUE,INFINITE);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -