操作系统实验内存管理.doc_第1页
操作系统实验内存管理.doc_第2页
操作系统实验内存管理.doc_第3页
操作系统实验内存管理.doc_第4页
操作系统实验内存管理.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

一、实验题目实验内存管理二、实验目的1从不同侧面了解Windows2000/XP对用户进程的虚拟内存空间的管理、分配方法。2了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)。3对Windows分配虚拟内存、改变虚拟内存状态,以及对物理内存和页面文件状态查询的API函数的功能、参数限制、使用规则进一步了解。三、实验内容1.使用Windows2000/XP的API函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号实现同步。2.模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容:时间:操作等待时间。块数:分配内存的粒度。操作:包括保留一个区域、提交一个区域、释放一个区域、回收一个区域和加锁与解锁一个区域,可以将这些操作编号存放在文件中。 保留是指保留进程的虚拟地址空间,而不分配物理存储空间。 回收是释放物理内存空间,但再虚拟地址空间仍然保留,它与提交相应,即可以回收以提交的内存块。 释放是指将物理存储和虚拟存储地址空间全部释放,它与保留相对应,即可以释放已经保留的内存块。大小:块的大小。访问权限:共五种,分别是PAGE_READONLY,PAGE_READWRITE, PAGE_EXECUTE,PAGE_EXECUTE_READ和PAGE_EXECUTE_READWRITE。可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来。四、实验环境(1) 使用的操作系统及版本。 Windows xp professional (2) 使用的编译系统及版本。 Visual c+ 6.0五、实验源代码-生成随即文件file-# include # include # include # include struct operation int time; /起始时间 int block;/内存页数 int oper; /操作 int protection;/权限 ;int main() FILE *file ; file=fopen(file,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_WRITE /2-PAGE_EXECUTE /3-PAGE_EXECUTE_READ /4-PAGE_EXECUTE_READWRITEop.time=rand()%1000; /随机生成等待时间op.block=rand()%5+1;/随机生成块op.oper=j;tection=i;fwrite(&op,sizeof(operation),1,file);/将生成的结果写入文件 cout文件生成成功!n;return 0;-内存操作程序-#include#include#include#include#includestruct operationint time;int block;int oper;int protection;struct traceLPVOID start;long size;HANDLE allo,trac;DWORD Tracker(LPDWORD lpdwparm)/跟踪线程的内存行为,并输出必要信息ofstream outfile;outfile.open(out.txt);for(int i=0;i=30;i+)WaitForSingleObject(trac,INFINITE);/等待allocator一次内存分配活动结束/打印内存状况和系统状况outfileiendl;SYSTEM_INFO info;/系统信息GetSystemInfo(&info);outfile页面文件大小tinfo.dwPageSizeendl;outfile进程的最小内存地址tinfo.lpMinimumApplicationAddressendl;outfile进程的最大内存地址tinfo.lpMaximumApplicationAddressendl; outfile当前活动的CPUtinfo.dwActiveProcessorMaskendl;outfileCPU的个数tinfo.dwNumberOfProcessorsendl;outfile分配粒度tinfo.dwAllocationGranularityendl;outfile当前处理器结构图tinfo.dwProcessorTypeendl;outfile_endl;MEMORYSTATUS status;/内存状态GlobalMemoryStatus(&status);outfileMEMORYSTATUS结构的大小tstatus.dwLengthendl; / sizeof(MEMORYSTATUS) outfile系统内存的使用率tstatus.dwMemoryLoadendl; / percent of memory in use outfile总的物理内存大小tstatus.dwTotalPhysendl; / bytes of physical memory outfile可用的物理内存大小tstatus.dwAvailPhysendl; / free physical memory bytes outfile显示可以存在页面文件中的字节数tstatus.dwTotalPageFileendl; / bytes of paging fileoutfile可用的页面文件大小tstatus.dwAvailPageFileendl; / free bytes of paging fileoutfile用户模式的全部可用虚拟地址空间tstatus.dwTotalVirtualendl; / user bytes of address spaceoutfile实际自由可用的虚拟地址空间tstatus.dwAvailVirtualendl; / free user bytesoutfile_endl;/释放信号量通知allocator 可以执行下一次内存分配活动ReleaseSemaphore(allo,1,NULL);return 0;void Allocator()/模拟内存分配活动的线程trace traceArray5;int index=0;FILE* file;file=fopen(file,rb);/读入文件operation op;SYSTEM_INFO info;DWORD temp;GetSystemInfo(&info);for(int i=0;i30;i+)WaitForSingleObject(allo,INFINITE);/等待tracker打印结束的信号量coutiendl;fread(&op,sizeof(operation),1,file);Sleep(op.time);/执行时间GetSystemInfo(&info);switch(tection)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;default:temp=PAGE_READONLY;switch(op.oper)case 0: coutreserve nowendl; traceArrayindex.start=VirtualAlloc(NULL,op.block *info.dwPageSize,MEM_RESERVE,PAGE_NOACCESS); traceArrayindex+.size=op.block *info.dwPageSize; coutstrating address:traceArrayindex-1.starttsize:traceArrayindex-1.sizeendl; break; case 1: coutcommit nowendl; traceArrayindex.start=VirtualAlloc(traceArrayindex.start,traceArrayindex.size,MEM_COMMIT,temp); index+; coutstrating address:traceArrayindex.starttsize:traceArrayindex.sizeendl; break; case 2: coutlock nowendl; coutstrating address:traceArrayindex.starttsize:traceArrayindex.sizeendl; if(!VirtualLock(traceArrayindex.start,traceArrayindex+.size) coutGetLastError()endl; break; case 3: coutunlock nowendl; coutstrating address:traceArrayindex.starttsize:traceArrayindex.sizeendl; if(!VirtualUnlock(traceArrayindex.start,traceArrayindex+.size) coutGetLastError()endl; break; case 4: coutdecommit nowendl; coutstrating address:traceArrayindex.starttsize:traceArrayindex.sizeendl; if(!VirtualFree(traceArrayindex.start,traceArrayindex+.size,MEM_DECOMMIT) coutGetLastError()endl; break; case 5: coutrelease nowendl; coutstrating address:traceArrayindex.starttsize:traceArrayindex.sizeendl; if(!VirtualFree(traceArrayindex+.start,0,MEM_RELEASE) coutGetLastError()endl; break; default: couterrorendl; ReleaseSemaphore(trac,1,NULL); int main() DWORD dwThread; HANDLE handle2; handle0=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)Tracker,NULL,0,&dwTh

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论