1、211320周俊霞内存管理实验报告 操作系统实验-内存管理实验报告 周俊霞 2011211320 2011211307班实习2:内存管理实验一目的:在本次实验中,需要从不同的侧面了解Windows 2000/XP 的虚拟内存机制。在Windows2000/XP 操作系统中,可以通过一些API 操纵虚拟内存。主要需要了解以下几方面: Windows 2000/XP 虚拟存储系统的组织 如何控制虚拟内存空间 如何编写内存追踪和显示工具 详细了解与内存相关的API 函数的使用二、Windows 2000/XP 虚拟内存机制简介:内存管理是Windows2000/XP 执行体的一部分,位于Ntoskr
2、nl.exe 文件中,是整个操作系统的重要组成部分。默认情况下,32 位Windows 2000/XP 上每个用户进程可以占有2GB 的私有地址空间,操作系统占有剩下的2GB。Windows 2000/XP 在x86 体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个32 位虚拟地址被解释为三个独立的分量页目录索引、页表索引和字节索引它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。比如,在x86 系统中,因为一页包含4096 字节,于是字节索引被确定为12 位宽(212 = 4096)。应用程序有三种使用内存方法: 以页为单位的虚拟内存分配方
3、法,适合于大型对象或结构数组; 内存映射文件方法,适合于大型数据流文件以及多个进程之间的数据共享; 内存堆方法,适合于大量的小型内存申请。本次实验主要是针对第一种使用方式。应用程序通过API 函数 VirtualAlloc 和VirtualAllocEx 等实现以页为单位的虚拟内存分配方法。首先保留地址空间,然后向此地址空间提交物理页面,也可以同时实现保留和提交。保留地址空间是为线程将来使用保留一块虚拟地址。在已保留的区域中,提交页面必须指出将物理存储器提交到何处以及提交多少。提交页面在访问时会转变为物理内存中的有效页面。三、相关的API 函数:可以通过GetSystemInfo,Global
4、MemoryStatus 和VirtualQuery 来查询进程虚空间的状态。主要的信息来源如下:VOID GetSystemInfo ( LPSYSTEM_INFO lpSystemInfo );结构SYSTEMINFO 定义如下:typedef struct _SYSTEM_INFO DWORD dwOemld;DWORD dwPageSize;LPVOID lpMinimumApplicationAddress;LPVOID lpMaximumApplicationAddress;DWORD dwActiveProcessorMask;DWORD dwNumberOfProcessors
5、;DWORD dwProcessorType;DWORD dwAllocationGranularity; /分配粒度DWORD dwReserved; SYSTEM_INFO, *LPSYSTEM_INFO;函数VOID GlobalMemoryStatus (LPMEMORYSTATUS lpBuffer);数据结构MEMORYSTATUS 定义如下:typedef struct _ MEMORYSTATUS DWORD dwLength;DWORD dwMemoryLoad;DWORD dwTotalPhys;DWORD dwAvailPhys;DWORD dwTotalPageFile
6、;DWORD dwAvailPageFile;DWORD dwTotalVirtual;DWORD dwAvailVirtual; MEMORYSTATUS, * LPMEMORYSTATUS;函数DWORD VirtualQuery ( LPCVOLD lpAddress,PMEMORY_BASIC_INFORMATION lpBuffer, DWORD dwLength);主要数据结构MEMORY_BASIC_INFORMATION 定义如下:typedef struct _ MEMORY_BASIC_INFORMATION PVOID BaseAddress;PVOID Allocati
7、onBase;DWORD AllocationProtect;DWORD RegionSize;DWORD State;DWORD Protect;DWORD Type; MEMORY_BASIC_INFORMATION;typedef MEMORY_BASIC_INFORMATION * PMEMORY_BASIC_INFORMATION;还有一些函数,例如VirtualAlloc,VirtualAllocEx,VirtualFree 和VirtualFreeEx 等,用于虚拟内存的管理,详情请见Microsoft 的Win32 API Reference Manual。4、实验内容:使用这
8、些API 函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为。模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包含如下内容: 时间:开始执行的时间; 块数:分配内存的粒度; 操作:包括保留一个区域、提交一个区域、释放一个区域、回收一个区域以及锁与解锁一个区域;可以将这些操作编号,存放于文件中。 大小:指块的大小; 访问权限:共五种:PAGE_READONLY、PAGE_READWRITE、PAGE_EXCUTE、PAGE_EXECUTE_READ PAGE_ EXECUTE_READWRITE。可以将这些权限编号,存放于文件
9、中。跟踪线程将页面大小、已使用的地址范围、物理内存总量以及虚拟内存总量等信息显示出来。五、实验步骤:首先执行makefile.exe,生成opfile文件,里面保存了模拟的内存操作。然后执行memory-op.exe,产生两个线程,一个从opfile文件里读取内存操作,模拟内存活动,另一个跟踪第一个的内存行为,将结果输出,并保存在out.txt文件中。两个线程通过信号量实现同步。6、实验结果分析:0dwActiveProcessorMask 15 /活动处理器掩码 dwAllocationGranularity 65536 /分配粒度dwNumberOfProcessors 4 /处理器号dw
10、OemId 0 dwPageSize 4096 /页大小dwProcessorType 586 /处理器类型lpMaximumApplicationAddress 0x7FFEFFFF /最大分配地址lpMinimumApplicationAddress 0x00010000 /最小分配地址wProcessorArchitecture 0 /处理器结构wProcessorLevel 6 处理器级别wProcessorRevision 10759 /处理器修订号wReserved 0 /保留*dwAvailPageFile 2377965568 /可用页文件dwAvailPhys 9003991
11、04 /可用物理大小dwAvailVirtual 2137534464 /可用虚拟大小 dwLength 32 /长度dwMemoryLoad 56 /主存下载dwTotalPageFile 4164648960 /总共页文件dwTotalPhys 2082324480 /总共物理大小dwTotalVirtual 2147352576 /总共虚拟大小&AllocationBase 0x00010000 /分配基址AllocationProtect 4 /分配保护BaseAddress 0x00010000 /基地址Protect 4 /类型RegionSize 65536 /区域大小State
12、 4096 /状态Type 262144 /类型1 /同上dwActiveProcessorMask 15dwAllocationGranularity 65536dwNumberOfProcessors 4dwOemId 0dwPageSize 4096dwProcessorType 586lpMaximumApplicationAddress 0x7FFEFFFFlpMinimumApplicationAddress 0x00010000wProcessorArchitecture 0wProcessorLevel 6wProcessorRevision 10759wReserved 0*
13、dwAvailPageFile 2377961472dwAvailPhys 900362240dwAvailVirtual 2137522176dwLength 32dwMemoryLoad 56dwTotalPageFile 4164648960dwTotalPhys 2082324480dwTotalVirtual 2147352576&AllocationBase 0x00010000AllocationProtect 4BaseAddress 0x00010000Protect 4RegionSize 65536State 4096Type 262144一直到30;保留(reserve
14、)、提交(commit)、加锁(lock)、解锁(unlock)回收(decommit)、释放(release)、 保留:在虚拟地址空间分配,不分配物理空间 提交:在物理地址空间分配 加锁:常驻内存,即防止操作系统把对应的内存空间换出到外存 解锁:允许操作系统把对应的内存空间换出到外存 回收:释放物理空间,但保留虚拟空间 释放:释放物理空间和虚拟空间1、主要数据结构:struct operation int time;/起始时间 int block;/内存页数 int ope
15、r;/操作 int protection;/权限;struct trace /跟踪每一次分配活动的数据结构 LPVOID start;/起始地址 long size; /分配的大小;2、主程序:int main() DWORD dwThread; HANDLE handle2; /生成两个线程 handle0=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Tracker,NULL,0,&dwThread); handle1=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Allocator,NULL,0,&dwT
16、hread); /生成两个信号量 allo=CreateSemaphore(NULL,0,1,allo); trac=CreateSemaphore(NULL,1,1,trac); /等待线程执行的执行结束后,再退出 WaitForMultipleObjects(2,handle,TRUE,INFINITE); system(pause); return 0;附录:源程序:/makefile.cpp/文件生成程序#include #include #include #include struct operation int time;/起始时间 int block;/内存页数 int oper
17、;/操作 int protection;/权限;int main() FILE* file; file=fopen(opfile,wb);/“opfile”为二进制用以确定内存操作 operation op; for(int j=0;j6;j+) /0-保留;1-提交;2-锁;3-解锁;4-回收;5-释放 for(int i=0;i5;i+) /0-PAGE_READONLY; /1-PAGE_READWRITE; /2-PAGE_EXECUTE; /3-PAGE_EXECUTE_READ; /4-PAGE_EXECUTE_READWRITE; op.time=rand()%1000;/随机生
18、成等待时间 op.block=rand()%5+1;/随机生成块大小 op.oper=j; op.protection=i; fwrite(&op,sizeof(operation),1,file);/将生成的结构写入文件 system(pause); return 0;/memory-op.cpp/内存管理实习/将程序从文件读入每次的操作,并将结果输入到out.txt文件中/#include #include #include #include #include struct operation int time;/起始时间 int block;/内存页数 int oper;/操作 int
19、protection;/权限;struct trace /跟踪每一次分配活动的数据结构 LPVOID start;/起始地址 long size; /分配的大小;HANDLE allo,trac; /信号量的句柄DWORD Tracker(LPDWORD lpdwparm) /跟踪allocator线程的内存行为,并输出必要信息 ofstream outfile;/输出文件 outfile.open(out.txt); for(int i=0;i=30;i+) WaitForSingleObject(trac,INFINITE); /等待allocator一次内存分配活动结束 /打印内存状况和
20、系统状况 outfileiendl; /以下一段显示系统信息,每次执行操作后系统信息不变 /如果要查看系统信息,可以取消注释 SYSTEM_INFO info; /系统信息 GetSystemInfo(&info); outfiledwActiveProcessorMasktinfo.dwActiveProcessorMaskendl; outfiledwAllocationGranularitytinfo.dwAllocationGranularityendl; outfiledwNumberOfProcessorstinfo.dwNumberOfProcessorsendl; outfil
21、edwOemIdtinfo.dwOemIdendl; outfiledwPageSizetinfo.dwPageSizeendl; outfiledwProcessorTypetinfo.dwProcessorTypeendl; outfilelpMaximumApplicationAddresstinfo.lpMaximumApplicationAddressendl; outfilelpMinimumApplicationAddresstinfo.lpMinimumApplicationAddressendl; outfilewProcessorArchitecturetinfo.wPro
22、cessorArchitectureendl; outfilewProcessorLeveltinfo.wProcessorLevelendl; outfilewProcessorRevisiontinfo.wProcessorRevisionendl; outfilewReservedtinfo.wReservedendl; outfile*endl; /内存状况 MEMORYSTATUS status; /内存状态 GlobalMemoryStatus(&status); outfiledwAvailPageFiletstatus.dwAvailPageFileendl; outfiled
23、wAvailPhyststatus.dwAvailPhysendl; outfiledwAvailVirtualtstatus.dwAvailVirtualendl; outfiledwLengthtstatus.dwLengthendl; outfiledwMemoryLoadtstatus.dwMemoryLoadendl; outfiledwTotalPageFiletstatus.dwTotalPageFileendl; outfiledwTotalPhyststatus.dwTotalPhysendl; outfiledwTotalVirtualtstatus.dwTotalVirt
24、ualendl; outfile&endl; /以下一段显示内存基本信息,每次操作后内存基本信息不变 /如要查看内存基本信息,可以取消注释 MEMORY_BASIC_INFORMATION mem;/内存基本信息 VirtualQuery( info.lpMinimumApplicationAddress,&mem, sizeof(MEMORY_BASIC_INFORMATION) ); outfileAllocationBasetmem.AllocationBaseendl; outfileAllocationProtecttmem.AllocationProtectendl; outfil
25、eBaseAddresstmem.BaseAddressendl; outfileProtecttmem.Protectendl; outfileRegionSizetmem.RegionSizeendl; outfileStatetmem.Stateendl; outfileTypetmem.Typeendl; outfileendl; /释放信号量通知allocator可以执行下一次内存分配活动 ReleaseSemaphore(allo,1,NULL); return 0;void Allocator() /模拟内存分配活动的线程 trace traceArray5; int index=0; FILE* file; file=fopen(opfile,rb);/读入文件 operation op; SYSTEM_INFO info; DWORD temp; GetSystemInfo(&info); for(int i=0;i30;i+) WaitForSingleObject(allo,INFINITE); /等待tracker打印结束的信号量 couti:; fread
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1