操作系统课程设计内存管理(共8页).doc

上传人:飞****2 文档编号:6620258 上传时间:2022-02-07 格式:DOC 页数:8 大小:36.50KB
返回 下载 相关 举报
操作系统课程设计内存管理(共8页).doc_第1页
第1页 / 共8页
操作系统课程设计内存管理(共8页).doc_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《操作系统课程设计内存管理(共8页).doc》由会员分享,可在线阅读,更多相关《操作系统课程设计内存管理(共8页).doc(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上 内存管理模拟实验目标: 本实验的目的是从不同侧面了解 Windows 2000XP 对用户进程的虚拟内存空间的管理、分配方法。同时需要了解跟踪程序的编写方法(与被跟踪程序保持同步,使用 Windows提供的信号量)。对Windows分配虚拟内存、改变内存状态,以及对物理内存(physical memory)和页面文件(pagefile)状态查询的 API 函数的功能、参数限制、使用规则要进一步了解。默认情况下,32 位 Windows 2000XP 上每个用户进程可以占有 2GB 的私有地址空间,操作系统占有剩下的 2GB。Windows 2000XP 在 X86

2、体系结构上利用二级页表结构来实现虚拟地址向物理地址的变换。一个 32 位虚拟地址被解释为三个独立的分量页目录索引、页表索引和字节索引它们用于找出描述页面映射结构的索引。页面大小及页表项的宽度决定了页目录和页表索引的宽度。实验要求:使用 Windows 2000XP 的 API 函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号量实现同步。模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容:时间:操作等待时间。块数:分配内存的粒度。操作:包括保留(reserve)一个区域、提交(comm

3、it)一个区域、释放(release)一个区域、回收(decommit)一个区域和加锁(lock)与解锁(unlock)一个区域,可以将这些操作编号存放于文件。保留是指保留进程的虚拟地址空间,而不分配物理存储空间。提交在内存中分配物理存储空间。回收是指释放物理内存空间,但在虚拟地址空间仍然保留,它与提交相对应,即可以回收已经提交的内存块。释放是指将物理存储和虚拟地址空间全部释放,它与保留(reserve)相对应,即可以释放已经保留的内存块。大小:块的大小。访 问 权 限 : 共 五 种 , 分 别 为 PAGE_READONLY,PAGE_READWRITE ,PAGE_EXECUTE,PAG

4、E_EXECUTE_READ 和 PAGE EXETUTE_READWRITE。可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。三、主要内容1 设计思路Windows 进程的虚拟地址空间中也有三种状态的页面:空闲页面、保留页面和提交页面。空闲(Free)页面:空闲页面是指那些可以保留或提交的可用页面。保留(Reserved)页面:保留页面是逻辑页面已分配但没有分配物理存储的页面。设置这种状态的效果是可以保留一部分虚拟地址,这样,如果不预先释放这些地址,就不能被其他应用程序(如 Malloc,LocalAlloc 等)的操作所使用

5、。试图读或写空闲页面或保留页面将导致页面出错异常。保留页面可被释放或提交。提交(Committed)页面:提交页面是物理存储(在内存中或磁盘上)已被分配的页面。可对它加以保护,不许访问或允许只读访问,或允许读写访问。提交也可以被回收以释放存储空间,从而变成保留页面。在本实验中,首先创建工程makefile生成随机输入文件,其中包含对内存要求作的各种操作;然后创建工程MemoryAllocation,实现输入文件所要求的各项内存管理操作。2 主要数据结构实现内存在管理的主要API函数有:GetSystemInfo函数功能:返回当前系统信息,存放入 lpSystemInfo 中。GlobalMem

6、oryStatus函数功能:获得计算机系统中当前使用的物理内存和虚拟内存的信息。使用 GlobalMemoryStatus 函数可以判断应用程序能够分配多少与其它应用程序不冲突的内存空间。但GlobalMemoryStatus 函数返回的信息是不稳定的,我们不能保证两次调用该函数都能返回到相同的信息。VirtualQuery函数功能:提供有关调用进程虚拟窨中的页面信息.VirtualAlloc函数功能:在调用进程的虚拟地址中保留或提交页面。除非设置了 MEM_RESET 标志,否则被这个函数分配的内存单元被自动初始化为 0。VirtualAllocEX函数功能:使用该函数可以保留、提交或者保留

7、和提交进程虚拟空间的页面的基址,否则返回 NULL。VirtualFree函数功能:可以释放或注销调用进程虚拟空间中的页面。成功则返回一个非零值,否则返回零值。VirtualFreeEx函数功能:该函数可以释放或注销指定进程虚拟空间中的页面。VirtualFreeEx 函数和 VirtualFree 函数区别是:VirtualFree 函数释放调用进程的地址空间,而 VirtualFreeEx 函数可以释放任意指定的进程的地址空间。如果函数调用成功则返回非零值,否则返回零值。VirtualLock功能:该函数可以将进程虚拟空间中的内存加锁。以确保后面的对该区域的存取操作不会失败。成功则返回一个

8、非零值,否则返回一个零值。VirtualUnlock功能:该函数可以将进程虚拟空间指定范围内的页面解锁,从以系统在必要时可以将这些页面换出到页面文件中。函数调用成功则返回一个非零值,否则返回零值。3 主要代码段首先,定义两个结构体struct operation和struct trace,分别记录对内存的操作信息和跟踪每一次分配活动,并为之分别定义信号量allo和rac,以实现对内存操作的互斥。具体实现用函数WaitForSingleObject (trac,INFINITE)和ReleaseSemaphore (allo,1,NULL)来实现。函数DWORD Tracker (LPDWORD

9、 lpdwparm) 用以跟踪allocator线程的内存行为,并输出必要信息。函数void Allocator () 用以模拟内存分配活动的线程。4 主要代码结构 1)makefile.cpp/文件生成程序# include # include # include # include struct operation int time; /起始时间int block; /内存页数int oper; /操作int protection; /权限;int main ()FILE* file;file=fopen (opfile,wb); /opfile为二进制文件用以确定内存操作operatio

10、n 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; /随机生成等待时间op.block=rand()%5+1; /随机生成块大小op.oper=j;op.protection=i;fwrite (&op,sizeof(operation),1,file); /将生成的

11、结构写入文件return 0;2) memory_op.cpp/从文件读入每次的操作,并将结果输出到out.txt文件中# include # include # include # include # include struct operationint time; /起始时间int block; /内存页数int oper; /操作int protection; /权限;struct trace /跟踪每一次分配活动的数据结构LPVOID start; /起始地址long size; /分配的大小;HANDLE allo,trac; /信号量句柄DWORD Tracker (LPDWOR

12、D lpdwparm) /跟踪allocator线程的内存行为,并输出必要信息ofstream outfile; /输出文件outfile.open (out.txt);for (int i=0;i=30;i+)WaitForSingleObject (trac,INFINITE); /等待allocator一次内存分配活动结束/打印内存状况和系统状况outfileiendl;/以下一段显示系统信息,每次执行操作后系统信息不变 SYSTEM_INFO info; /系统消息 GetSystemInfo (&info); outfiledwActiveProcessorMasktinfo.dwA

13、ctiveProcessorMaskendl;outfiledwAllocationGranularitytinfo.dwAllocationGranularityendl; outfiledwNumberOfProcessorstinfo.dwNumberOfProcessorsendl;outfiledwOemIdtinfo.dwOemIdendl; outfiledwPageSizetinfo.dwPageSizeendl;outfiledwProcessorTypetinfo.dwProcessorTypeendl;outfilelpMaximumApplicationAddresst

14、info.lpMaximumApplicationAddressendl;outfilelpMinimumapplicationAddresstinfo.lpMinimumApplicationAddressendl;outfilewProcessorArchitecturetinfo.wProcessorArchitectureendl;outfilewProcessorLeveltinfo.wProcessorLevelendl;outfilewProcessorRevisiontinfo.wProcessorRevisionendl;outfilewReservedtinfo.wRese

15、rvedendl;outfile*endl;/内存状况MEMORYSTATUS status; /内存状态GlobalMemoryStatus (&status);outfiledwAvailPageFiletstatus.dwAvailPageFileendl;outfiledwAvailPhyststatus.dwAvailPhysendl;outfiledwAvailVirtualtstatus.dwAvailVirtualendl;outfiledwLengthtstatus.dwLengthendl;outfiledwMemoryLoadtstatus.dwMemoryLoadend

16、l;outfiledwTotalPageFiletstatus.dwTotalPageFileendl;outfiledwTotalPhytstatus.dwTotalPhysendl;outfiledwTotalVirtualtstatus.dwTotalVirtualendl;outfile*endl;/以下一段显示内存基本信息,每次操作后内存基本信息不变MEMORY_BASIC_INFORMATION mem; /内存基本信息VirtualQuery (info.lpMinimumApplicationAddress,&mem,sizeof(MEMORY_BASIC_INFORMATIO

17、N) );outfileAllocationBasetmem.AllocationBaseendl;outfileAllocationProtecttmem.AllocationProtectendl;outfileBaseAddresstmem.BaseAddressendl;outfileProtecttmem.Protectendl;outfileRegionSizetmem.RegionSizeendl;outfileStatetmem.Stateendl;outfileTypetmem.Typeendl;outfile*endl;/释放信号量通知allocator可以执行下一次内存分

18、配活动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 (&op,sizeof(

19、operation),1,file);Sleep (op.time); /执行时间,如果想在指定的时间可以取消注释GetSystemInfo (&info);switch (op.protection) /根据文件内容确定权限case 0:index=0;temp=PAGE_READONLY;break;case 1:temp=PAGE_READWRITE;break;case 2:temp=PAGE_EXECUTE;break;case 3:temp=PAGE_EXECUTE_READ;break;case 4:temp=PAGE_EXECUTE_READWRITE;break;defaul

20、t:temp=PAGE_READONLY;switch (op.oper)case 0: /保留一个区域coutreserve now endl;traceArrayindex.start=VirtualAlloc (NULL,op.block*info.dwPageSize,MEM_RESERVE,PAGE_NOACCESS);traceArrayindex+.size=op.block*info.dwPageSize;coutstarting address:traceArrayindex-1.starttsize:traceArrayindex-1.sizeendl;break;case

21、 1: /提交一个区域coutcommit now endl;traceArrayindex.start=VirtualAlloc (traceArrayindex.start,traceArrayindex.size,MEM_COMMIT,temp);index+;coutstarting address:traceArrayindex-1.starttsize:traceArrayindex-1.sizeendl;break;case 2: /锁住一个区域coutlock nowendl;coutstarting address:traceArrayindex.startsize:trac

22、eArrayindex.sizeendl;if (!VirtualLock (traceArrayindex.start,traceArrayindex+.size) )coutGetLastError ()endl; /函数返回错误号break;case 3: /解锁一个区域coutunlock nowendl;coutstarting address:traceArrayindex.starttsize:traceArrayindex.sizeendl;if (!VirtualUnlock (traceArrayindex.start,traceArrayindex+.size) )cou

23、tGetLastError ()endl;break;case 4: /回收一个区域coutdecommit nowendl;coutstarting address:traceArrayindex.starttsize:traceArrayindex.sizeendl;if (! VirtualFree (traceArrayindex.start,traceArrayindex+.size,MEM_DECOMMIT) )coutGetLastError ()endl;break;case 5: /释放一个区域coutrelease nowendl;coutstarting address:

24、traceArrayindex.starttsize:traceArrayindex.sizeendl;if (!VirtualFree (traceArrayindex+.start,0,MEM_RELEASE) )coutGetLastError ()endl;break;default:couterrorendl;ReleaseSemaphore (trac,1,NULL); /释放信号量通知tracker可以打印信息int main ()DWORD dwThread;HANDLE handle2; /生成两个线程handle0=CreateThread (NULL,0,(LPTHREA

25、D_START_ROUTINE) Tracker,NULL,0,&dwThread);handle1=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);return 0;其他课题需要完成的子过程不限,可由学生自己掌握,具体要求可参考教材、实验指导书及其他相关书籍。专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 教育教学

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁