ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:114.19KB ,
资源ID:10494462      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10494462.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(211320周俊霞内存管理实验报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

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