操作系统实验基于WRK的进程工作集实验.docx

上传人:b****5 文档编号:11623428 上传时间:2023-03-29 格式:DOCX 页数:24 大小:143.98KB
下载 相关 举报
操作系统实验基于WRK的进程工作集实验.docx_第1页
第1页 / 共24页
操作系统实验基于WRK的进程工作集实验.docx_第2页
第2页 / 共24页
操作系统实验基于WRK的进程工作集实验.docx_第3页
第3页 / 共24页
操作系统实验基于WRK的进程工作集实验.docx_第4页
第4页 / 共24页
操作系统实验基于WRK的进程工作集实验.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

操作系统实验基于WRK的进程工作集实验.docx

《操作系统实验基于WRK的进程工作集实验.docx》由会员分享,可在线阅读,更多相关《操作系统实验基于WRK的进程工作集实验.docx(24页珍藏版)》请在冰豆网上搜索。

操作系统实验基于WRK的进程工作集实验.docx

操作系统实验基于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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1