1、西工大计算机操作系统课程设计实验报告bh05xh3西北工业大学操作系统实验报告实验日期:2013.12.07 实验名称:分模块阅读Windows工作集管理相关代码一、实验目的分析工作集管理代码,熟悉工作集管理算法。二、实验要求分模块、函数阅读工作集管理代码,给出工作集管理中设置重要参数(如项目1中工作集最小值和最大值,峰值等)的代码,给出工作集管理流程图和算法描述。三、实验过程及结果将工作集管理部分的代码相应分成以下五个模块,主要根据这五部分查看工作集的管 理部分的代码。 MmWorkingSetManager() MiComputeSystemTrimCriteria ()/工作集管理线程M
2、I_AGE_ALL_WORKING_SETS MiProcessWorkingSets() MiTrimWorkingSet()/根据MI_TRIM_ALL_WORKING_SETS确定剪支 MiAgeWorkingSet ()/根据MI_AGE_ALL_WORKING_SETS判断是否老化1)将工作集管理部分的代码相应分成以下五个模块,MmWorkingSetManager()图1MiComputeSystemTrimCriteria()/工作集管理线程MI_AGE_ALL_WORKING_SETS图2MiProcessWorkingSets()图3 函数原型:MiTrimWorkingSe
3、t (WSLE_NUMBER Reduction,PMMSUPPORT WsInfo, ULONG TrimAge)参数说明: IN WSLE_NUMBER Reduction,需要修建的页面数目 IN PMMSUPPORT WsInfo,进程工作集指针 IN ULONG TrimAge,需要修剪的页面的年龄限值功能分析:(1)变量说明:WsleFlushList:存放将要移除的页面索引和数目,TryToFree;StartEntry;LastEntry;这三个整型变量遍历Wsle数组确定修剪的页面。WorkingSetList工作集链表指针Wsle:工作集页面指针PointerPte,当前页
4、面的PTE结构指针NumberLeftToRemove本次过程结束后未被移除的页面数目NumberNotFlushed:调用MiFreeWsleList后未被移除的页面数目(2)、确定在Wsle中搜索的起始位置TryToFree和结束位置StartEntry-1,(3)、TrimMore程序段,本程序段主要根据最近最久未使用算法,对工作集页面数组Wsle从TryToFree开始循环搜索移除页面,并调用MiFreeWsleList释放相应页面。当NumberLeftToRemove=0或已循环搜索一遍终止;(4)、当WsleFlushList.Count非零,还需调用MiFreeWsleList
5、将其释放,然后判断NumberLeftToRemove是否为零,为零说明还需要进一步修剪,则返回TrimMore程序段继续进行修剪。本程序段执行的条件是WsleFlushList.Count非零,显然,有可能WsleFlushList.Count为零,但是NumberLeftToRemove非零,也就是本程序段并不能够完成修剪Reduction个页面的目标,这也就是最后返回值为Reduction NumberLeftToRemove的原因;(5)、因为在Wsle中的有效页面的下标不是从零开始的,而是从FirstDynamic开始,所以可能超出工作集的范围,接下来调用MiRemoveWorkin
6、gSetPages进行工作集的压缩(下标调整),压缩的条件是下列条件之一:第一个页面的下标FirstDynamic与WorkingSetSize的大小相等,其实这里严格应该是FirstDynamic=WorkingSetSizeWorkingSetSize + 15 + (PAGE_SIZE / sizeof(MMWSLE) LastEntryMaximumWorkingSetSize + 15 + (PAGE_SIZE / sizeof(MMWSLE) WorkingSetSize - WorkingSetList-FirstDynamic;NumberToExamine = SampleS
7、ize MiEstimationShift,这是首选页面数,但还要看下面的几种情况是否满足:a、 控制参数WslesScanned如果大于(1024 * 1024 * 1024) / PAGE_SIZE说明是在bigger machine 中可能有大量进程,这里避免过多扫描(估计操作)后面在进行重新计算估计页面数目和MiEstimationShiftb、 如果NumberToExamine8192(峰值),则NumberToExamine=8192,在比较大的系统中资源比较充足,这里减小搜索的数目,重新计算MiEstimationShift;c、 NumberToExamine = MI_MI
8、NIMUM_SAMPLE,确定搜索的数目不能小于最小值64(6)从FirstDynamic如果WsleCurrentEntry无效,则调用MI_NEXT_VALID_ESTIMATION-_SLOT重新计算新的起始估计位置存于CurrentEntry中(7)从CurrentEntry开始估计无效页面数目存于SampledAgeCounts数组中(8)通过MI_CALCULATE_USAGE_ESTIMATE(SampledAgeCounts, CounterShift)根据概论理论估计本工作集中无效页面数目(9)将估计的结果存储于本工作集中:VmSupport-Claim = Claim; V
9、mSupport-EstimatedAvailable = Estimate(10)用估计的结果,修改本函数参数TotalClaim和TotalEstimatedAvailable使之返回调用程序。MiRemoveWsle()函数分析 函数原型: 参数说明:IN WSLE_NUMBER Entry:要释放的工作集页面索引 IN PMMWSL WorkingSetList:进程工作集页面链表指针 功能分析:(1) 将工作集页面(WsleEntry)保存在临时变量WsleContents中(2)判断当前进程工作集是否是系统工作集,进而判断属于系统工作集的那一类,对相应计数器减一(3)设置工作集页面
10、的有效位无效WsleContents.u1.e1.Valid = 0;WsleEntry.u1.e1.Valid(4)在哈希链表中删除此页,这里的情况是:页面在Wsle中存储可能没有在哈希链表中存储(原因不明),所以接下来的查找可能失败,通过查找过程可以发现哈希链表的组织形式是线性的:具体操作如下:通过Hash = MI_WSLE_HASH (WsleContents.u1.Long, WorkingSetList); 得到我们搜索的起始位置,从Hash向后搜索,直至找到虚拟地址与由WsleContents得到的虚拟地址相同的哈希链表项。如果找到尾,那么再从哈希链表头开始寻找,直至找到开始的位
11、置Hash,这样保证整个哈希链表搜索过一遍找到后将TableHash.Key置零。从这里也可以看出hashtable的结构是线性结构,四、实验分析页面老化与修剪从平衡集管理器入手,寻找老化原因,确定修剪、老化标准。当空闲页面紧张,可以通过修剪工作集获得更多的空闲页面。由每秒一次触发的KeBalanceSetManager启动工作集管理线程WorkingSetManager,在工作集管理线程中首先调用MiComputeSystemTrimCriteria函数确定当前需要进行的操作,主要包括工作集修剪、工作集老化以及空操作,这三种情况的触发条件如下修剪时刻:根据如下三个条件当前可用页面数Avail
12、able少于当前需要的页面数本工作集中已经有被替换页面的记录,MiReplacing = TRUE有超过可用页面数1/4的页面被循环用作后备页面以上条件满足一个则立即进行修剪操作,其中设置Criteria标准的相应变量;老化时刻:当修剪条件全不成立时,当前可用页面Available小于限值20000,则进行老化操作;不操作:在1,2均不成立条件下,说明当前系统中还有大量内存可用,OutFlags=0,作为返回值,不进行任何操作。至此已经确定了工作集处理的标准,保存在WorkingSetRequestFlags (OutFlags=0)和TrimCriteria中,如果WorkingSetReq
13、uestFlags非零,即需要进行修剪或者老化操作,具体调用MiProcessWorkingSets (WorkingSetRequestFlags, &TrimCriteria)做具体处理(下段介绍),如果WorkingSetRequestFlags为零,则不做操作,接下来查看修改页面链表的计数器MmModifiedPageListHead.Total是否超过限制MmModifiedPageMaximum,若超过则激活修改页面写回器工作。以上整个过程函数调用链如下: KeBalanceSetManager ()MmWorkingSetManager() MiComputeSystemTrim
14、Criteria ()/工作集管理线程MI_AGE_ALL_WORKING_SETSMiComputeSystemTrimCriteria ()/工作集管理线程MI_AGE_ALL_WORKING_SETSMiProcessWorkingSets() MiTrimWorkingSet()/根据MI_TRIM_ALL_WORKING_SETS确定剪支 MiTrimWorkingSet() MiAgeWorkingSet ()/根据MI_AGE_ALL_WORKING_SETS判断是否老化 MiAgeWorkingSet ()MiProcessWorkingSets()MmWorkingSetManager()KeBalanceSetManager ()页面修剪操作主要由MiProcessWorkingSets调用MiTrimWorkingSet()具体实现。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1