操作系统实验基于WRK的进程工作集实验.docx
- 文档编号:11623428
- 上传时间:2023-03-29
- 格式:DOCX
- 页数:24
- 大小:143.98KB
操作系统实验基于WRK的进程工作集实验.docx
《操作系统实验基于WRK的进程工作集实验.docx》由会员分享,可在线阅读,更多相关《操作系统实验基于WRK的进程工作集实验.docx(24页珍藏版)》请在冰豆网上搜索。
操作系统实验基于WRK的进程工作集实验
操作系统实验——基于WRK的进程工作集实验
实验目的
1掌握虚拟机和调试工具等的使用。
2阅读Windows源码中工作集管理相关部分。
3修改Windows内核中页面置换算法,深入理解工作集和页面置换算法如何在一个完整的操作系统中实现。
实验内容
1了解Windows系统中的工作集
一个进程当前正在使用的页面的集合成为它的工作集(workingset)。
Windows系统通常将工作集分为进程工作集与系统工作集,分别用于跟踪各个进程与系统的物理内存使用情况。
Windows内核对工作集页面的操作分工作集管理器(系统级)的页面修剪算法和进程自己的页面替换算法两种,前者主要是定时扫描系统的内存利用情况,同时对某些进程进行页面修剪,比如选定优先级低的进程,应用最近最久未使用算法(LRU)选定要删除的页面进行删除;而后者主要是在进程内部,当进程申请页面超过一定峰值再申请页面时,工作集大小不再增加,而是以一定的策略替换已有页面。
2工作集相关数据结构
EPROCESS是描述进程的结构,与工作集相关的数据结构主要有MMSUPPORT、MMWSL、MMWSLEMMWSLENTRY、MMPTE、PMMWSLE_HASH,其主要关系如下图:
3工作集代码分析
3.1页面替换算法分析
首先调用MiAddWorkingSetPage()向工作集中添加页面失败时,调用中MiDoReplacement()函数对工作集进行替换,同时修改MiReplacing为True,说明当前系统页面已经紧张,以便在启动工作集管理器时,根据MiReplacing的值执行修剪操作。
其中MiDoReplacement()主要调用了MiReplaceWorkingSetEntry()进行页面替换。
(1)修剪时刻。
根据如下三个条件:
①当前可用页面数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的信息
kd>dtnt!
_MMSUPPORT811eda28+0x1e8
(3)查看MMWSL信息
kd>dtnt!
_MMWSL0xc0502000
FirstFree下次进行工作集页面添加的位置
FirstDynamic工作集页面中第一个可用页面的下标
LastEntry工作集页面中最后一个可用页面的下标
NextSlot进行页面修剪算法是据此搜索最有替换页面
(4)查看MMWSLE的信息,即工作集页面项(所有页面虚拟地址)的详细信息
kd>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(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。
VOID
MiReplaceWorkingSetEntry(
INPMMSUPPORTWsInfo,
INWSLE_ALLOCATION_TYPEFlags
)
{
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 WorkingSetIndex=FirstDynamic; } TheNextSlot=WorkingSetIndex; while(TRUE){ while(Wsle[WorkingSetIndex].u1.e1.Valid==0){ WorkingSetIndex+=1; if(WorkingSetIndex>LastEntry){ WorkingSetIndex=FirstDynamic; } 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; } WorkingSetIndex+=1; if(WorkingSetIndex>LastEntry){ WorkingSetIndex=FirstDynamic; } if(WorkingSetIndex==TheNextSlot){ if(Flags==WsleAllocationAny){ WsInfo->GrowthSinceLastEstimate+=1; } break; } } return; } Step2通过单步执行查看其执行过程。 置换前: (NextSlot为0x4f) 置换后: 可以看出,即使NextSlot指示页年龄为1,之后的页面年龄为3,也替换当前页。 即验证我们修改的“碰见有效页即替换”的策略。 3添加系统调用,分析页面置换算法(选做) Step1添加系统调用 1修改文件ntos\ke\i386\systable.asm, 添加: TABLE_ENTRYGetPhysicalAddress,1,3 TABLE_ENTRYGetWslePageFaultCnt,1,3 TABLE_ENTRYGetWslePeakWorkingSetSize,1,3 TABLE_ENTRYGetWsleWorkingSetSize,1,3 TABLE_ENTRYGetWslePageAge,1,3 TABLE_ENTRYGetWsleAge,1,3 TABLE_ENTRYGetWsleInfo,1,3 修改: TABLE_END302 2修改文件public\sdk\inc\Ntexapi.h,在2771行添加: NTSYSCALLAPI LONG NTAPI NtGetPhysicalAddress( __inLONGvirtualAddress, __outPLONGLONGQuadPart, __outPLONGLONGLowPart ); NTSYSCALLAPI LONG NTAPI NtGetWslePageFaultCnt( __inULONGWorkingSetIndex, __outPLONGentryNum, __outPLONGPageFaultount ); NTSYSCALLAPI LONG NTAPI NtGetWslePeakWorkingSetSize( __inULONGreserved1, __outPLONGreserved2, __outPLONGPeakWorkingSetSize ); NTSYSCALLAPI LONG NTAPI NtGetWsleWorkingSetSize( __inULONGWorkingSetIndex, __outPLONGentryNum, __outPLONGWorkingSetSize ); NTSYSCALLAPI LONG NTAPI NtGetWslePageAge( __inULONGWorkingSetIndex, __outPLONGentryNum, __outPLONGWsleAge ); NTSYSCALLAPI LONG NTAPI NtGetWsleAge( __inULONGsize, __outPLONGentryNum, __outPLONGWsleAge ); NTSYSCALLAPI LONG NTAPI NtGetWsleInfo( __inULONGsize, __outPLONGentryNum, __outPLONGWsleInfo ); 3修改文件ntos\mm\wslist.c,在最后添加: LONG NtGetPhysicalAddress( __inLONGvirtualAddress, __outPLONGLONGQuadPart, __outPLONGLONGLowPart ) { PHYSICAL_ADDRESSPhysicalAddress; PhysicalAddress=MmGetPhysicalAddress((PVOID)virtualAddress); if(QuadPart==NULL||LowPart==NULL) { return0; } *QuadPart=PhysicalAddress.QuadPart; *LowPart=PhysicalAddress.LowPart; return0; } LONG NtGetWslePageFaultCnt( __inULONGWorkingSetIndex, __outPLONGentryNum, __outPLONGPageFaultount) { PEPROCESScurrentProcess; if(PageFaultount==NULL) return0; currentProcess=PsGetCurrentProcess(); *PageFaultount=currentProcess->Vm.PageFaultCount; return0; } LONG NtGetWslePeakWorkingSetSize( __inULONGreserved1, __outPLONGreserved2, __outPLONGPeakWorkingSetSize ) { PEPROCESScurrentProcess; if(PeakWorkingSetSize==NULL) return0; currentProcess=PsGetCurrentProcess(); *PeakWorkingSetSize=currentProcess->Vm.PeakWorkingSetSize; return0; } LONG NtGetWsleWorkingSetSize( __inULONGWorkingSetIndex, __outPLONGentryNum, __outPLONGWorkingSetSize ) { PEPROCESScurrentProcess; if(WorkingSetSize==NULL) return0; currentProcess=PsGetCurrentProcess(); *WorkingSetSize=currentProcess->Vm.WorkingSetSize; return0; } LONG NtGetWslePageAge( __inULONGWorkingSetIndex, __outPLONGentryNum, __outPLONGWsleAge ) { PEPROCESScurrentProcess; PMMWSLWorkingSetList; PMMPTEPointerPte; PMMWSLEWsle; if(WsleAge==NULL) return0; currentProcess=PsGetCurrentProcess(); WorkingSetList=currentProcess->Vm.VmWorkingSetList; Wsle=currentProcess->Vm.VmWorkingSetList->Wsle; if(Wsle[WorkingSetIndex].u1.e1.Valid==0) { *WsleAge=-1; } PointerPte=MiGetPteAddress(Wsle[WorkingSet
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 基于 WRK 进程 工作
![提示](https://static.bdocx.com/images/bang_tan.gif)