您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 47操作系统实验――基于WRK的进程工作集实验
1操作系统实验——基于WRK的进程工作集实验实验目的1掌握虚拟机和调试工具等的使用。2阅读Windows源码中工作集管理相关部分。3修改Windows内核中页面置换算法,深入理解工作集和页面置换算法如何在一个完整的操作系统中实现。实验内容1了解Windows系统中的工作集一个进程当前正在使用的页面的集合成为它的工作集(workingset)。Windows系统通常将工作集分为进程工作集与系统工作集,分别用于跟踪各个进程与系统的物理内存使用情况。Windows内核对工作集页面的操作分工作集管理器(系统级)的页面修剪算法和进程自己的页面替换算法两种,前者主要是定时扫描系统的内存利用情况,同时对某些进程进行页面修剪,比如选定优先级低的进程,应用最近最久未使用算法(LRU)选定要删除的页面进行删除;而后者主要是在进程内部,当进程申请页面超过一定峰值再申请页面时,工作集大小不再增加,而是以一定的策略替换已有页面。2工作集相关数据结构EPROCESS是描述进程的结构,与工作集相关的数据结构主要有MMSUPPORT、MMWSL、MMWSLEMMWSLENTRY、MMPTE、PMMWSLE_HASH,其主要关系如下图:23工作集代码分析3.1页面替换算法分析首先调用MiAddWorkingSetPage()向工作集中添加页面失败时,调用中MiDoReplacement()函数对工作集进行替换,同时修改MiReplacing为True,说明当前系统页面已经紧张,以便在启动工作集管理器时,根据MiReplacing的值执行修剪操作。其中MiDoReplacement()主要调用了MiReplaceWorkingSetEntry()进行页面替换。(1)修剪时刻。根据如下三个条件:①当前可用页面数Available少于当前需要的页面数;②本工作集中已经有被替换页面的记录,MiReplacing==TRUE;③有超过可用页面数1/4的页面被循环用作后备页面;以上条件满足一个则立即进行修剪操作,其中设置Criteria标准的相应变量。(2)老化时刻。当修剪条件全不成立时,当前可用页面Available小于限值20000,则进行老化操作。(3)不操作。在1,2均不成立条件下,说明当前系统中还有大量内存可用,OutFlags=0,作为返回值,不进行任何操作。3此时确定的工作集处理标准,保存在WorkingSetRequestFlags(OutFlags=0)和TrimCriteria中,如果WorkingSetRequestFlags非零,即需要进行修剪或者老化操作,具体调用MiProcessWorkingSets(WorkingSetRequestFlags,&TrimCriteria)做具体处理。如果WorkingSetRequestFlags为零,则不做操作。接下来查看修改页面链表的计数器MmModifiedPageListHead.Total是否超过限制MmModifiedPageMaximum,若超过则激活修改页面写回器工作。3.2释放页面过程分析MiTrimWorkingSet()根据传入的修剪标准,确定需要进行移除的工作集页面的索引号和释放的页面数,并将其封装在WsleFlushList结构中,作为参数传给MiFreeWsleList,具体页面释放操作由MiFreeWsleList来完成。Windows操作系统是一个多任务系统,虽然已经确定了要释放的页面的索引号,但是在确定索引号到调用本函数真正释放页面,期间所确定的页面可能又被其他进程共享,这种情况仅需要调用MiDecrementShareCount()函数使共享计数器减一,再或是此页面是一原型页表项,所以要进行第一次循环,将所有这些情况的FlushIndex()置零,然后在接下来的循环中调用MiRemoveWsle()移除页面。3.3置换算法源码分析代码分析:base\ntos\mm\wslist.c:591:MiReplaceWorkingSetEntry()函数原型:VOIDMiReplaceWorkingSetEntry(INPMMSUPPORTWsInfo,INWSLE_ALLOCATION_TYPEFlags)参数说明:WsInfo–指向工作集信息的指针Flags–为0表示不需要页面替换为1标识需要进行页面替换功能概述:此函数查找一个符合条件的工作集页面用来替换。变量说明:变量名实际作用WorkingSetIndex当前扫描的工作集页面索引FirstDynamic工作集页面中第一个可用页面的下标LastEntry工作集页面中最后一个可用页面的下标WorkingSetList工作集链表指针Wsle工作集页面指针NumberOfCandidates已扫描工作集页面数目PointerPte当前页面的PTE结构指针TheNextSlot工作集页面中下一个要修剪页面的下标OldestWorkingSetIndex目前已扫描过最近最不经常使用的工作集页面下标OldestAge目前已扫描过页面的最老年龄4算法步骤:(1)初始化变量:首先定义WorkingSetIndex=WorkingSetList-NextSlot,指向页面置换算法搜索的第一个页面。如果”NextSlot”不在[FirstDynamic,LastEntry]的范围内,那么WorkingSetIndex指向FirstDynamic。然后初始化OldestWorkingSetIndex=0xFFFFFFF,OldestAge=-1。(2)如果当前页的下标是0xFFFFFFF,则OldestWorkingSetIndex=WorkingSetIndex,OldestAge=-1。(3)如果当前页的年龄大于OldestAage,则当前页更适合被置换。或者置换标志Flags=WsleAllocationReplace,那么当前页是最佳置换页。(4)如果Flags=WsleAllocationReplace,意味着当前内存紧张,需要立即置换当前页。否则检查两种情况:1,当前页的年龄是否大于2;2,已经搜索的页面数是否大于17。如果两种情况满足一种,则置换当前页,否则WorkingSetIndex加1,搜索下一个页面。(5)MiFreeWsle(WorkingSetIndex,WsInfo,PointerPte)是页面置换,如果置换成功则返回,否则WorkingSetIndex加1,继续搜索下一个页面,跳转到(6)。(6)NumberOfCandidates增加1,如果所有的页面都被搜索过,则置换失败,返回或者跳转(2)。实验步骤1搭建实验环境WRKv1.2VirtualPC2007-Windows2003Sp1WinDbg参考资料:上机实验指导2源码阅读及算法验证工作集代码分布文件名称模块功能ps.h工作集的部分结构声明mi.h存储器管理相关的数据结构和接口wslist.c包含操作系统工作集结构的系列函数wstree.c实现工作集管理中的一些辅助函数wsmanage.c包含操作活动状态进程工作集的函数,同时实现工作集管理线程Step1编写测试程序程序内容:申请内存分配。5Step2查看工作集在虚拟机中运行程序。在内核中设置断点,让内核停下来查看进程状态。在WinDbg的命令行输入命令查看工作集信息。(1)查找进程kd!process00显示的是当前所有进程信息,查找我们编写的程序的进程信息:据此地址查看EPROCESS信息Kddteprocess811eda28从显示的EPROCESS信息中查找MMSUPPORT的地址:0x1e8是相对地址。(2)查看MMSUPPORT的信息kddtnt!_MMSUPPORT811eda28+0x1e8(3)查看MMWSL信息kddtnt!_MMWSL0xc0502000FirstFree下次进行工作集页面添加的位置FirstDynamic工作集页面中第一个可用页面的下标LastEntry工作集页面中最后一个可用页面的下标NextSlot进行页面修剪算法是据此搜索最有替换页面(4)查看MMWSLE的信息,即工作集页面项(所有页面虚拟地址)的详细信息kddd0xc0502698l0x406第一列是虚拟地址地址,每一行的四项分别是以前面虚拟地址为起始地址的16字节数据,每一项代表一页的虚拟地址,地址后3位是页面的属性。例如NextSlot指向的页面(从0xc0502698开始的第4页),图中用红色框标识。后三位203(001000000011)是页面属性,前两个bit位标识页面年龄,此页的页面年龄为00。Step3验证页面置换算法在置换算法中设置断点,图中桃红色标识。此时的各个变量的值。其中TheNextSlot(0x2b)标识置换算法起始搜索的页面。置换前:7TheNextSlot指向红色框标识的页面。置换后:即TheNextSlot指向的页面被置换。分析:源码:if((Flags==WsleAllocationReplace)||OldestAge=MI_IMMEDIATE_REPLACEMENT_AGE||NumberOfCandidatesMM_WORKING_SET_LIST_SEARCH)三个条件:1Flags等于WsleAllocationReplace(WsleAllocationReplace表示内存紧张,立即替换)2页面年龄大于2(MI_IMMEDIATE_REPLACEMENT_AGE=2)3搜索的页面数大于17(MM_WORKING_SET_LIST_SEARCH=17),满足一个即进行页面替换。我们可以看到置换前1Flag=WsleAllocationAny2内存中从红色框标识页之后的17个页面年龄均为0所以页面置换算法会在搜索17个页面之后,立即进行置换,置换也为TheNextSlot指向的页。断点后单步执行的过程,也验证了这一分析。8NumberOfCandidates=18(0x2b)17。其他执行过程也可以通过类似步骤分析验证。3修改算法及验证Step1修改页面置换算法修改代码base\ntos\inc\ps.h:typedefstruct_MMSUPPORT{LIST_ENTRYWorkingSetExpansionLinks;LARGE_INTEGERLastTrimTime;MMSUPPORT_FLAGSFlags;ULONGPageFaultCount;WSLE_NUMBERPeakWorkingSetSize;WSLE_NUMBERGrowthSinceLastEstimate;WSLE_NUMBERMinimumWorkingSetSize;WSLE_NUMBERMaximumWorkingSetSize;struct_MMWSL*VmWorkingSetList;WSLE_NUMBERClaim;WSLE_NUMBERNextEstimationSlot;WSLE_NUMBERNextAgingSlot;WSLE_NUMBEREstimatedAvailable;WSLE_NUMBERWorkingSetSize;EX_PUSH_LOCKWorkingSetMutex;ULONGnum;//新增加}MMSUPPORT,*PMMSUPPORT;修改代码base\ntos\mm\wslist.c:272:MiDoReplacement():算法思想:碰见有效页面就进行替换,每次搜索的的起始索引依然为NextSlot。VOIDMiReplaceWorkingSetEntry(9INPMMSUPPORTWsInfo,INWSLE_ALLOCATION_TYPEFlags){WSLE_NUMBERWorkingSetIndex;WSLE_NUMBERFirstDynamic;WSLE_NUMBERLastEntry;PMMWSLWorkingSetList;PMMWSLEWsle;PMMPTEPointerPte;WSLE_NUMBER
本文标题:47操作系统实验――基于WRK的进程工作集实验
链接地址:https://www.777doc.com/doc-5198038 .html