还剩6页未读,继续阅读
文本内容:
一、实验题目实验内存管理
二、实验目的1.从不同侧面了解Windows2000/XP对用户进程的虚拟内存空间的管理、分配方法2.了解跟踪程序的编写方法(与被跟踪程序保持同步,使用Windows提供的信号量)3.对Windows分配虚拟内存、改变虚拟内存状态,以及对物理内存和页面文件状态查询的API函数的功能、参数限制、使用规则进一步了解
三、实验内容
1.使用Windows2000/XP的API函数,编写一个包含两个线程的进程,一个线程用于模拟内存分配活动,一个线程用于跟踪第一个线程的内存行为,而且要求两个线程之间通过信号实现同步
2.模拟内存活动的线程可以从一个文件中读出要进行的内存操作,每个内存操作包括如下内容时间操作等待时间块数分配内存的粒度操作包括保留一个区域、提交一个区域、释放一个区域、回收一个区域和加锁与解锁一个区域,可以将这些操作编号存放在文件中保留是指保留进程的虚拟地址空间,而不分配物理存储空间回收是释放物理内存空间,但再虚拟地址空间仍然保留,它与提交相应,即可以回收以提交的内存块释放是指将物理存储和虚拟存储地址空间全部释放,它与保留相对应,即可以释放已经保留的内存块大小块的大小访问权限共五种,分别是PAGE_READONLYPAGE_READWRITEPAGE_EXECUTEPAGE_EXECUTE_READ和PAGE_EXECUTE_READWRITE可以将这些权限编号存放于文件中跟踪线程将页面大小、已使用的地址范围、物理内存总量,以及虚拟内存总量等信息显示出来
四、实验环境
(1)使用的操作系统及版本Windowsxpprofessional
(2)使用的编译系统及版本Visualc++
6.0
五、实验源代码-----------------生成随即文件file------------------------------#includefstream.h#includestdio.h#includestdlib.h#includetime.hstructoperation{inttime;//起始时间intblock;//内存页数intoper;//操作intprotection;//权限};intmain{FILE*file;file=fopenfilewb;//opfile为二进制,用于确定内存操作operationop;forintj=0;j6;j++//0-保留;1-提交;2-锁;3-解锁;4-回收;5-释放;forinti=0;i5;i++//0-PAGE_READONLY//1-PAGE_WRITE//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;fwriteopsizeofoperation1file;//将生成的结果写入文件}cout文件生成成功!\n;return0;}-----------------------内存操作程序-----------------------------------------#includestdio.h#includestdlib.h#includewindows.h#includeiostream.h#includefstream.hstructoperation{inttime;intblock;intoper;intprotection;};structtrace{LPVOIDstart;longsize;};HANDLEallotrac;DWORDTrackerLPDWORDlpdwparm//跟踪线程的内存行为,并输出必要信息{ofstreamoutfile;outfile.openout.txt;forinti=0;i=30;i++{WaitForSingleObjecttracINFINITE;//等待allocator一次内存分配活动结束//打印内存状况和系统状况outfileiendl;SYSTEM_INFOinfo;//系统信息GetSystemInfoinfo;outfile页面文件大小\tinfo.dwPageSizeendl;outfile进程的最小内存地址\tinfo.lpMinimumApplicationAddressendl;outfile进程的最大内存地址\tinfo.lpMaximumApplicationAddressendl;outfile当前活动的CPU\tinfo.dwActiveProcessorMaskendl;outfileCPU的个数\tinfo.dwNumberOfProcessorsendl;outfile分配粒度\tinfo.dwAllocationGranularityendl;outfile当前处理器结构图\tinfo.dwProcessorTypeendl;outfile_______________________________________________________endl;MEMORYSTATUSstatus;//内存状态GlobalMemoryStatusstatus;outfileMEMORYSTATUS结构的大小\tstatus.dwLengthendl;//sizeofMEMORYSTATUSoutfile系统内存的使用率\tstatus.dwMemoryLoadendl;//percentofmemoryinuseoutfile总的物理内存大小\tstatus.dwTotalPhysendl;//bytesofphysicalmemoryoutfile可用的物理内存大小\tstatus.dwAvailPhysendl;//freephysicalmemorybytesoutfile显示可以存在页面文件中的字节数\tstatus.dwTotalPageFileendl;//bytesofpagingfileoutfile可用的页面文件大小\tstatus.dwAvailPageFileendl;//freebytesofpagingfileoutfile用户模式的全部可用虚拟地址空间\tstatus.dwTotalVirtualendl;//userbytesofaddressspaceoutfile实际自由可用的虚拟地址空间\tstatus.dwAvailVirtualendl;//freeuserbytesoutfile__________________________________________________endl;//释放信号量通知allocator可以执行下一次内存分配活动ReleaseSemaphoreallo1NULL;}return0;}voidAllocator//模拟内存分配活动的线程{tracetraceArray
[5];intindex=0;FILE*file;file=fopenfilerb;//读入文件operationop;SYSTEM_INFOinfo;DWORDtemp;GetSystemInfoinfo;forinti=0;i30;i++{WaitForSingleObjectalloINFINITE;//等待tracker打印结束的信号量coutiendl;freadopsizeofoperation1file;Sleepop.time;//执行时间GetSystemInfoinfo;switchop.protection{case0:{index=0;temp=PAGE_READONLY;break;}case1:temp=PAGE_READWRITE;break;case2:temp=PAGE_EXECUTE;break;case3:temp=PAGE_EXECUTE_READ;break;case4:temp=PAGE_EXECUTE_READWRITE;break;default:temp=PAGE_READONLY;}switchop.oper{case0:{coutreservenowendl;traceArray[index].start=VirtualAllocNULLop.block*info.dwPageSizeMEM_RESERVEPAGE_NOACCESS;traceArray[index++].size=op.block*info.dwPageSize;coutstratingaddress:traceArray[index-1].start\tsize:traceArray[index-1].sizeendl;break;}case1:{coutcommitnowendl;traceArray[index].start=VirtualAlloctraceArray[index].starttraceArray[index].sizeMEM_COMMITtemp;index++;coutstratingaddress:traceArray[index].start\tsize:traceArray[index].sizeendl;break;}case2:{coutlocknowendl;coutstratingaddress:traceArray[index].start\tsize:traceArray[index].sizeendl;if!VirtualLocktraceArray[index].starttraceArray[index++].sizecoutGetLastErrorendl;break;}case3:{coutunlocknowendl;coutstratingaddress:traceArray[index].start\tsize:traceArray[index].sizeendl;if!VirtualUnlocktraceArray[index].starttraceArray[index++].sizecoutGetLastErrorendl;break;}case4:{coutdecommitnowendl;coutstratingaddress:traceArray[index].start\tsize:traceArray[index].sizeendl;if!VirtualFreetraceArray[index].starttraceArray[index++].sizeMEM_DECOMMITcoutGetLastErrorendl;break;}case5:{coutreleasenowendl;coutstratingaddress:traceArray[index].start\tsize:traceArray[index].sizeendl;if!VirtualFreetraceArray[index++].start0MEM_RELEASEcoutGetLastErrorendl;break;}default:couterrorendl;}ReleaseSemaphoretrac1NULL;}}intmain{DWORDdwThread;HANDLEhandle
[2];handle
[0]=CreateThreadNULL0LPTHREAD_START_ROUTINETrackerNULL0dwThread;handle
[1]=CreateThreadNULL0LPTHREAD_START_ROUTINEAllocatorNULL0dwThread;allo=CreateSemaphoreNULL01allo;trac=CreateSemaphoreNULL11trac;WaitForMultipleObjects2handleTRUEINFINITE;return0;}
六、参考资料《windows内核编程》机械工业出版社。