基于WRK的进程工作集实验Word格式文档下载.docx
- 文档编号:22579345
- 上传时间:2023-02-04
- 格式:DOCX
- 页数:14
- 大小:141.25KB
基于WRK的进程工作集实验Word格式文档下载.docx
《基于WRK的进程工作集实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于WRK的进程工作集实验Word格式文档下载.docx(14页珍藏版)》请在冰豆网上搜索。
根据如下三个条件:
①当前可用页面数Available少于当前需要的页面数;
②本工作集中已经有被替换页面的记录,MiReplacing==TRUE;
③有超过可用页面数1/4的页面被循环用作后备页面;
以上条件满足一个则立即进行修剪操作,其中设置Criteria标准的相应变量。
(2)老化时刻。
当修剪条件全不成立时,当前可用页面Available小于限值20000,则进行老化操作。
(3)不操作。
在1,2均不成立条件下,说明当前系统中还有大量内存可用,OutFlags=0,作为返回值,不进行任何操作。
此时确定的工作集处理标准,保存在WorkingSetRequestFlags(OutFlags=0)和TrimCriteria中,如果WorkingSetRequestFlags非零,即需要进行修剪或者老化操作,具体调用MiProcessWorkingSets(WorkingSetRequestFlags,&
TrimCriteria)做具体处理。
如果WorkingSetRequestFlags为零,则不做操作。
接下来查看修改页面链表的计数器MmModified
PageListHead.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
目前已扫描过页面的最老年龄
算法步骤:
(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.2
VirtualPC2007
-Windows2003Sp1
WinDbg
2源码阅读及算法验证
工作集代码分布
文件名称
模块功能
ps.h
工作集的部分结构声明
mi.h
存储器管理相关的数据结构和接口
wslist.c
包含操作系统工作集结构的系列函数
wstree.c
实现工作集管理中的一些辅助函数
wsmanage.c
包含操作活动状态进程工作集的函数,同时实现工作集管理线程
Step1编写测试程序
程序内容:
申请内存分配。
Step2查看工作集
在虚拟机中运行程序。
在内核中设置断点,让内核停下来查看进程状态。
在WinDbg的命令行输入命令查看工作集信息。
(1)查找进程
kd>
!
process00
显示的是当前所有进程信息,查找我们编写的程序的进程信息:
据此地址查看EPROCESS信息
Kd>
dteprocess811eda28
从显示的EPROCESS信息中查找MMSUPPORT的地址:
0x1e8是相对地址。
(2)查看MMSUPPORT的信息
dtnt!
_MMSUPPORT811eda28+0x1e8
(3)查看MMWSL信息
_MMWSL0xc0502000
FirstFree下次进行工作集页面添加的位置
FirstDynamic工作集页面中第一个可用页面的下标
LastEntry工作集页面中最后一个可用页面的下标
NextSlot进行页面修剪算法是据此搜索最有替换页面
(4)查看MMWSLE的信息,即工作集页面项(所有页面虚拟地址)的详细信息
dd0xc0502698l0x40
第一列是虚拟地址地址,每一行的四项分别是以前面虚拟地址为起始地址的16字节数据,每一项代表一页的虚拟地址,地址后3位是页面的属性。
例如NextSlot指向的页面(从0xc0502698开始的第4页),图中用红色框标识。
后三位203(001000000011)是页面属性,前两个bit位标识页面年龄,此页的页面年龄为00。
Step3验证页面置换算法
在置换算法中设置断点,图中桃红色标识。
此时的各个变量的值。
其中TheNextSlot(0x2b)标识置换算法起始搜索的页面。
置换前:
TheNextSlot指向红色框标识的页面。
置换后:
即TheNextSlot指向的页面被置换。
分析:
源码:
if((Flags==WsleAllocationReplace)||
OldestAge>
=MI_IMMEDIATE_REPLACEMENT_AGE||
NumberOfCandidates>
MM_WORKING_SET_LIST_SEARCH)
三个条件:
1Flags等于WsleAllocationReplace(WsleAllocationReplace表示内存紧张,立即替换)
2页面年龄大于2(MI_IMMEDIATE_REPLACEMENT_AGE=2)
3搜索的页面数大于17(MM_WORKING_SET_LIST_SEARCH=17),
满足一个即进行页面替换。
我们可以看到置换前
1Flag=WsleAllocationAny
2内存中从红色框标识页之后的17个页面年龄均为0
所以页面置换算法会在搜索17个页面之后,立即进行置换,置换也为TheNextSlot指向的页。
断点后单步执行的过程,也验证了这一分析。
NumberOfCandidates=18(0x12)>
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。
VOID
MiReplaceWorkingSetEntry(
{
WSLE_NUMBERWorkingSetIndex;
WSLE_NUMBERFirstDynamic;
WSLE_NUMBERLastEntry;
PMMWSLWorkingSetList;
PMMWSLEWsle;
PMMPTEPointerPte;
WSLE_NUMBERTheNextSlot;
WorkingSetList=WsInfo->
VmWorkingSetList;
Wsle=WorkingSetList->
Wsle;
LastEntry=WorkingSetList->
LastEntry;
FirstDynamic=WorkingSetList->
FirstDynamic;
WorkingSetIndex=WorkingSetList->
NextSlot;
if(WorkingSetIndex>
LastEntry||WorkingSetIndex<
FirstDynamic){
WorkingSetIndex=FirstDynamic;
}
TheNextSlot=WorkingSetIndex;
while(TRUE){
while(Wsle[WorkingSetIndex].u1.e1.Valid==0){
WorkingSetIndex+=1;
LastEntry){
if(WorkingSetIndex==TheNextSlot){
if(Flags==WsleAllocationAny){
WsInfo->
GrowthSinceLastEstimate+=1;
return;
PointerPte=MiGetPteAddress(Wsle[WorkingSetIndex].u1.VirtualAddress);
if(MiFreeWsle(WorkingSetIndex,WsInfo,PointerPte)){//直接替换
WorkingSetList->
NextSlot=WorkingSetIndex+1;
break;
}
Step2通过单步执行查看其执行过程。
(NextSlot为0x4f)
可以看出,即使NextSlot指示页年龄为1,之后的页面年龄为3,也替换当前页。
即验证我们修改的“碰见有效页即替换”的策略。
实验体会
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 WRK 进程 工作 实验