//////////////////////////////////////////////////////////////////////////////////////////////
//本程序是内存管理操作的实习程序。
//本程序使用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<<"回收内存区域的操
没有合适的资源?快使用搜索试试~ 我知道了~
WindowsAPI函数存储管理.rar_内存管理_内存管理函数
共7个文件
opt:1个
txt:1个
plg:1个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 85 浏览量
2022-09-22
16:26:16
上传
评论
收藏 10KB RAR 举报
温馨提示
这是一个用API函数编写的操作系统的内存管理的程序的实现
资源推荐
资源详情
资源评论
收起资源包目录
WindowsAPI函数存储管理.rar (7个子文件)
www.pudn.com.txt 218B
WindowsAPI函数存储管理
MemoryManagement.opt 53KB
MemoryManagement.dsw 557B
MemoryManagement.ncb 41KB
MemoryManagement.plg 664B
MemoryManagement.dsp 3KB
MemoryManagement.cpp 9KB
Debug
共 7 条
- 1
资源评论
四散
- 粉丝: 49
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于opencv的dnn模块实现Yolo-Fastest的目标检测python源码+模型+说明(高分项目).zip
- 使用Python调用微信本地ocr服务.zip
- 【精品推荐】人工智能在医疗中的应用.pptx
- 【精品推荐】电子医疗仪器人机接口-(1).ppt
- 【精品推荐】电子医疗仪器人机接口.ppt
- ubuntu镜像ubuntu镜像01
- 基于paddle搭建神经网络实现5种水果识别分类python源码+数据集(高分毕设).zip
- 【精品推荐】电子商务网店类型介绍.ppt
- 基于paddle搭建神经网络实现水果识别分类python源码+数据集(高分项目).zip
- 三菱plc编程口通信学习笔记.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功