211320周俊霞内存管理实验报告.docx

上传人:b****8 文档编号:10494462 上传时间:2023-02-14 格式:DOCX 页数:23 大小:114.19KB
下载 相关 举报
211320周俊霞内存管理实验报告.docx_第1页
第1页 / 共23页
211320周俊霞内存管理实验报告.docx_第2页
第2页 / 共23页
211320周俊霞内存管理实验报告.docx_第3页
第3页 / 共23页
211320周俊霞内存管理实验报告.docx_第4页
第4页 / 共23页
211320周俊霞内存管理实验报告.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

211320周俊霞内存管理实验报告.docx

《211320周俊霞内存管理实验报告.docx》由会员分享,可在线阅读,更多相关《211320周俊霞内存管理实验报告.docx(23页珍藏版)》请在冰豆网上搜索。

211320周俊霞内存管理实验报告.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1