211320周俊霞内存管理实验报告.docx
- 文档编号:10494462
- 上传时间:2023-02-14
- 格式:DOCX
- 页数:23
- 大小:114.19KB
211320周俊霞内存管理实验报告.docx
《211320周俊霞内存管理实验报告.docx》由会员分享,可在线阅读,更多相关《211320周俊霞内存管理实验报告.docx(23页珍藏版)》请在冰豆网上搜索。
211320周俊霞内存管理实验报告
操作系统实验-内存管理实验报告
周俊霞2011211320
2011211307班
实习2:
内存管理实验
一.目的:
在本次实验中,需要从不同的侧面了解Windows2000/XP的虚拟内存机制。
在Windows
2000/XP操作系统中,可以通过一些API操纵虚拟内存。
主要需要了解以下几方面:
▪Windows2000/XP虚拟存储系统的组织
▪如何控制虚拟内存空间
▪如何编写内存追踪和显示工具
▪详细了解与内存相关的API函数的使用
二、Windows2000/XP虚拟内存机制简介:
内存管理是Windows2000/XP执行体的一部分,位于Ntoskrnl.exe文件中,是整个操作系统的重要组成部分。
默认情况下,32位Windows2000/XP上每个用户进程可以占有2GB的私有地址空间,操作系统占有剩下的2GB。
Windows2000/XP在x86体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。
一个32位虚拟地址被解释为三个独立的分量——页目录索引、页表索引和字节索引——它们用于找出描述页面映射结构的索引。
页面大小及页表项的宽度决定了页目录和页表索引的宽度。
比如,在x86系统中,因为一页包含4096字节,于是字节索引被确定为12位宽(212=4096)。
应用程序有三种使用内存方法:
▪以页为单位的虚拟内存分配方法,适合于大型对象或结构数组;
▪内存映射文件方法,适合于大型数据流文件以及多个进程之间的数据共享;
▪内存堆方法,适合于大量的小型内存申请。
本次实验主要是针对第一种使用方式。
应用程序通过API函数VirtualAlloc和
VirtualAllocEx等实现以页为单位的虚拟内存分配方法。
首先保留地址空间,然后向此地址空间提交物理页面,也可以同时实现保留和提交。
保留地址空间是为线程将来使用保留一块虚拟地址。
在已保留的区域中,提交页面必须指出将物理存储器提交到何处以及提交多少。
提交页面在访问时会转变为物理内存中的有效页面。
三、相关的API函数:
可以通过GetSystemInfo,GlobalMemoryStatus和VirtualQuery来查询进程虚空间的状
态。
主要的信息来源如下:
VOIDGetSystemInfo(LPSYSTEM_INFOlpSystemInfo);
结构SYSTEMINFO定义如下:
typedefstruct_SYSTEM_INFO{
DWORDdwOemld;
DWORDdwPageSize;
LPVOIDlpMinimumApplicationAddress;
LPVOIDlpMaximumApplicationAddress;
DWORDdwActiveProcessorMask;
DWORDdwNumberOfProcessors;
DWORDdwProcessorType;
DWORDdwAllocationGranularity;//分配粒度
DWORDdwReserved;
}SYSTEM_INFO,*LPSYSTEM_INFO;
函数VOIDGlobalMemoryStatus(LPMEMORYSTATUSlpBuffer);
数据结构MEMORYSTATUS定义如下:
typedefstruct_MEMORYSTATUS{
DWORDdwLength;
DWORDdwMemoryLoad;
DWORDdwTotalPhys;
DWORDdwAvailPhys;
DWORDdwTotalPageFile;
DWORDdwAvailPageFile;
DWORDdwTotalVirtual;
DWORDdwAvailVirtual;
}MEMORYSTATUS,*LPMEMORYSTATUS;
函数DWORDVirtualQuery(LPCVOLDlpAddress,
PMEMORY_BASIC_INFORMATIONlpBuffer,DWORDdwLength);
主要数据结构MEMORY_BASIC_INFORMATION定义如下:
typedefstruct_MEMORY_BASIC_INFORMATION{
PVOIDBaseAddress;
PVOIDAllocationBase;
DWORDAllocationProtect;
DWORDRegionSize;
DWORDState;
DWORDProtect;
DWORDType;
}MEMORY_BASIC_INFORMATION;
typedefMEMORY_BASIC_INFORMATION*PMEMORY_BASIC_INFORMATION;
还有一些函数,例如VirtualAlloc,VirtualAllocEx,VirtualFree和VirtualFreeEx等,用
于虚拟内存的管理,详情请见Microsoft的Win32APIReferenceManual。
4、实验内容:
使用这些API函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为。
模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包含如下内容:
▪时间:
开始执行的时间;
▪块数:
分配内存的粒度;
▪操作:
包括保留一个区域、提交一个区域、释放一个区域、回收一个区域以及锁与解锁一个区域;可以将这些操作编号,存放于文件中。
▪大小:
指块的大小;
▪访问权限:
共五种:
PAGE_READONLY、
PAGE_READWRITE、
PAGE_EXCUTE、
PAGE_EXECUTE_READ
PAGE_EXECUTE_READWRITE。
可以将这些权限编号,存放于文件中。
跟踪线程将页面大小、已使用的地址范围、
物理内存总量以及虚拟内存总量等信息显示出来。
五、实验步骤:
首先执行makefile.exe,生成opfile文件,里面保存了模拟的内存操作。
然后执行memory-op.exe,产生两个线程,一个从opfile文件里读取内存操作,模拟内存活动,另一个跟踪第一个的内存行为,将结果输出,并保存在out.txt文件中。
两个线程通过信号量实现同步。
6、实验结果分析:
0
dwActiveProcessorMask15//活动处理器掩码
dwAllocationGranularity65536//分配粒度
dwNumberOfProcessors4//处理器号
dwOemId0
dwPageSize4096//页大小
dwProcessorType586//处理器类型
lpMaximumApplicationAddress0x7FFEFFFF//最大分配地址
lpMinimumApplicationAddress0x00010000//最小分配地址
wProcessorArchitecture0//处理器结构
wProcessorLevel6处理器级别
wProcessorRevision10759//处理器修订号
wReserved0//保留
************************************************************************************
dwAvailPageFile2377965568//可用页文件
dwAvailPhys900399104//可用物理大小
dwAvailVirtual2137534464//可用虚拟大小
dwLength32//长度
dwMemoryLoad56//主存下载
dwTotalPageFile4164648960//总共页文件
dwTotalPhys2082324480//总共物理大小
dwTotalVirtual2147352576//总共虚拟大小
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
AllocationBase0x00010000//分配基址
AllocationProtect4//分配保护
BaseAddress0x00010000//基地址
Protect4//类型
RegionSize65536//区域大小
State4096//状态
Type262144//类型
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1//同上
dwActiveProcessorMask15
dwAllocationGranularity65536
dwNumberOfProcessors4
dwOemId0
dwPageSize4096
dwProcessorType586
lpMaximumApplicationAddress0x7FFEFFFF
lpMinimumApplicationAddress0x00010000
wProcessorArchitecture0
wProcessorLevel6
wProcessorRevision10759
wReserved0
************************************************************************************
dwAvailPageFile2377961472
dwAvailPhys900362240
dwAvailVirtual2137522176
dwLength32
dwMemoryLoad56
dwTotalPageFile4164648960
dwTotalPhys2082324480
dwTotalVirtual2147352576
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
AllocationBase0x00010000
AllocationProtect4
BaseAddress0x00010000
Protect4
RegionSize65536
State4096
Type262144
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
一直到30;
保留(reserve)、
提交(commit)、
加锁(lock)、
解锁(unlock)
回收(decommit)、
释放(release)、
保留:
在虚拟地址空间分配,不分配物理空间
提交:
在物理地址空间分配
加锁:
常驻内存,即防止操作系统把对应的内存空间换出到外存
解锁:
允许操作系统把对应的内存空间换出到外存
回收:
释放物理空间,但保留虚拟空间
释放:
释放物理空间和虚拟空间
1、主要数据结构:
structoperation
{
inttime;//起始时间
intblock;//内存页数
intoper;//操作
intprotection;//权限
};
structtrace//跟踪每一次分配活动的数据结构
{
LPVOIDstart;//起始地址
longsize;//分配的大小
};
2、主程序:
intmain()
{
DWORDdwThread;
HANDLEhandle[2];
//生成两个线程
handle[0]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Tracker,NULL,0,&dwThread);
handle[1]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Allocator,NULL,0,&dwThread);
//生成两个信号量
allo=CreateSemaphore(NULL,0,1,"allo");
trac=CreateSemaphore(NULL,1,1,"trac");
//等待线程执行的执行结束后,再退出
WaitForMultipleObjects(2,handle,TRUE,INFINITE);
system("pause");
return0;
}
附录:
源程序:
//makefile.cpp
/////////////////////////////////////////////////////////////////////////////////////////////
//文件生成程序
#include
#include
#include
#include
structoperation
{
inttime;//起始时间
intblock;//内存页数
intoper;//操作
intprotection;//权限
};
intmain()
{
FILE*file;
file=fopen("opfile","wb");//“opfile”为二进制用以确定内存操作
operationop;
for(intj=0;j<6;j++)//0-保留;1-提交;2-锁;3-解锁;4-回收;5-释放
for(inti=0;i<5;i++)
//0-PAGE_READONLY;
//1-PAGE_READWRITE;
//2-PAGE_EXECUTE;
//3-PAGE_EXECUTE_READ;
//4-PAGE_EXECUTE_READWRITE;
{
op.time=rand()%1000;//随机生成等待时间
op.block=rand()%5+1;//随机生成块大小
op.oper=j;
op.protection=i;
fwrite(&op,sizeof(operation),1,file);//将生成的结构写入文件
}
system("pause");
return0;
}
//memory-op.cpp
//内存管理实习
//将程序从文件读入每次的操作,并将结果输入到out.txt文件中
////////////////////////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
structoperation
{
inttime;//起始时间
intblock;//内存页数
intoper;//操作
intprotection;//权限
};
structtrace//跟踪每一次分配活动的数据结构
{
LPVOIDstart;//起始地址
longsize;//分配的大小
};
HANDLEallo,trac;//信号量的句柄
DWORDTracker(LPDWORDlpdwparm)//跟踪allocator线程的内存行为,并输出必要信息
{
ofstreamoutfile;//输出文件
outfile.open("out.txt");
for(inti=0;i<=30;i++)
{
WaitForSingleObject(trac,INFINITE);//等待allocator一次内存分配活动结束
//打印内存状况和系统状况
outfile<
//以下一段显示系统信息,每次执行操作后系统信息不变
//如果要查看系统信息,可以取消注释
SYSTEM_INFOinfo;//系统信息
GetSystemInfo(&info);
outfile<<"dwActiveProcessorMask"<<'\t'< outfile<<"dwAllocationGranularity"<<'\t'< outfile<<"dwNumberOfProcessors"<<'\t'< outfile<<"dwOemId"<<'\t'< outfile<<"dwPageSize"<<'\t'< outfile<<"dwProcessorType"<<'\t'< outfile<<"lpMaximumApplicationAddress"<<'\t'< outfile<<"lpMinimumApplicationAddress"<<'\t'< outfile<<"wProcessorArchitecture"<<'\t'< outfile<<"wProcessorLevel"<<'\t'< outfile<<"wProcessorRevision"<<'\t'< outfile<<"wReserved"<<'\t'< outfile<<"************************************************************************************"< //内存状况 MEMORYSTATUSstatus;//内存状态 GlobalMemoryStatus(&status); outfile<<"dwAvailPageFile"<<'\t'< outfile<<"dwAvailPhys"<<'\t'< outfile<<"dwAvailVirtual"<<'\t'< outfile<<"dwLength"<<'\t'< outfile<<"dwMemoryLoad"<<'\t'< outfile<<"dwTotalPageFile"<<'\t'< outfile<<"dwTotalPhys"<<'\t'< outfile<<"dwTotalVirtual"<<'\t'< outfile<<"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&"< //以下一段显示内存基本信息,每次操作后内存基本信息不变 //如要查看内存基本信息,可以取消注释 MEMORY_BASIC_INFORMATIONmem;//内存基本信息 VirtualQuery(info.lpMinimumApplicationAddress,&mem, sizeof(MEMORY_BASIC_INFORMATION)); outfile<<"AllocationBase"<<'\t'< outfile<<"AllocationProtect"<<'\t'< outfile<<"BaseAddress"<<'\t'< outfile<<"Protect"<<'\t'< outfile<<"RegionSize"<<'\t'< outfile<<"State"<<'\t'< outfile<<"Type"<<'\t'< outfile<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"< //释放信号量通知allocator可以执行下一次内存分配活动 ReleaseSemaphore(allo,1,NULL); } return0; } voidAllocator()//模拟内存分配活动的线程 { tracetraceArray[5]; intindex=0; FILE*file; file=fopen("opfile","rb");//读入文件 operationop; SYSTEM_INFOinfo; DWORDtemp; GetSystemInfo(&info); for(inti=0;i<30;i++) { WaitForSingleObject(allo,INFINITE);//等待tracker打印结束的信号量 cout< '; fread
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 211320 周俊霞 内存 管理 实验 报告