基于WRK的进程工作集实验设计

减小字体 增大字体 作者:王 雷  来源:www.zhonghualunwen.com  发布时间:2009-09-03 10:48:07

  1引言
  
  工作集是内存管理一个相当重要的概念,Windows系统通常将工作集分为进程工作集与系统工作集,分别用于跟踪各个进程与系统的物理内存使用情况。Windows内核中对工作集页面的操作分工作集管理器(系统级)的页面修剪算法和进程自己的页面替换算法两种,前者主要是定时扫描系统的内存利用情况,同时对某些进程进行页面修剪,比如选定优先级低的进程,应用最近最久未使用算法(LRU)选定要删除的页面进行删除;而后者主要是在进程内部,当进程申请页面超过一定峰值再申请页面时,工作集大小不再增加,而是以一定的策略替换已有页面。
  本文以WRK为实验平台,结合内核源代码和WinDbg调试工具,以Windows内存管理的工作集页面替换为分析对象,分析进程工作集的峰值及页面替换算法,设计了相应的实验修改页面替换算法,并给出了实验应达到的效果。
  
  2工作集分析
  
  2.1工作集数据结构
  EPROCESS是描述进程的结构,工作集的相关结构也可以从这里找到,与工作集相关的数据结构主要有MMSUPPORT、MMWSL、MMWSLE MMWSLENTRY、MMPTE、PMMWSLE_HASH,其主要关系如下图1工作集结构图,理解工作集结构间的关系,对内核调试、算法修改、内核系统调用的添加都极及有帮助。
  2.2工作集代码分析
  工作集相关代码分布如表1所示。本小节针对前面分析的工作集的结构,选取几个具有代表性的操作函数进行分析,为后面进行页面算法的修改打下基础。
  2.2.1页面替换算法分析
  首先调用MiAddWorkingSetPage()向工作集中添加页面失败时,调用中MiDoReplacement()函数对工作集进行替换,同时修改MiReplacing为True,说明当前系统页面已经紧张,以便在启动工作集管理器时,根据MiReplacing的值执行修剪操作。其中MiDoReplacement()主要调用了MiReplaceWorkingSetEntry()进行页面替换。 

  (1) 修剪时刻。根据如下三个条件:
  ① 当前可用页面数Available少于当前需要的页面数;
  ② 本工作集中已经有被替换页面的记录,MiReplacing == TRUE;
  ③ 有超过可用页面数1/4的页面被循环用作后备页面;
  以上条件满足一个则立即进行修剪操作,其中设置Criteria标准的相应变量。
  (2) 老化时刻。当修剪条件全不成立时,当前可用页面Available小于限值20000,则进行老化操作。
  (3) 不操作。在1,2均不成立条件下,说明当前系统中还有大量内存可用,OutFlags=0,作为返回值,不进行任何操作。 

  此时确定的工作集处理标准,保存在WorkingSetRequest Flags(OutFlags=0)和TrimCriteria中,如果WorkingSetRequest Flags非零,即需要进行修剪或者老化操作,具体调用Mi ProcessWorkingSets (WorkingSetRequestFlags, &TrimCriteria)做具体处理。如果WorkingSetRequestFlags为零,则不做操作。接下来查看修改页面链表的计数器MmModified PageListHead.Total是否超过限制MmModified PageMaximum,若超过则激活修改页面写回器工作。
  2.2.2释放页面过程分析
  MiTrimWorkingSet()根据传入的修剪标准,确定需要进行移除的工作集页面的索引号和释放的页面数,并将其封装在WsleFlushList结构中,作为参数传给MiFreeWsleList,具体页面释放操作由MiFreeWsleList来完成。
  Windows操作系统是一个多任务系统,虽然已经确定了要释放的页面的索引号,但是在确定索引号到调用本函数真正释放页面,期间所确定的页面可能又被其他进程共享,这种情况仅需要调用MiDecrementShareCount()函数使共享计数器减一,再或是此页面是一原型页表项,所以要进行第一次循环,将所有这些情况的FlushIndex()置零,然后在接下来的循环中调用MiRemoveWsle()移除页面。
  
  3使用WinDbg查看工作集
  
  WinDbg可以用于Kernel模式调试和用户模式调试。我们编写了一个应用程序,申请100页内存。然后在内核设定断点,让内核停下查看进程状态。
  (1) 用dt命令输出Vm的详细信息
  
  kd> dt nt!_MMSUPPORT 81de1de0
   +0x000 WorkingSetExpansionLinks : _LIST_ ENTRY [ 0x808a4bb0 - 0x819ab648 ]
   +0x008 LastTrimTime:_LARGE_INTEGER 0x1c7 b881`3b7cd070
   +0x010 Flags: _MMSUPPORT_FLAGS
   +0x014 PageFaultCount : 0x189
   +0x018 PeakWorkingSetSize : 0x18d
   +0x01c GrowthSinceLastEstimate : 0x189
   +0x020 MinimumWorkingSetSize : 0x32
   +0x024 MaximumWorkingSetSize : 0x159
   +0x028 VmWorkingSetList : 0xc0502000
  ……
  
  Vm结构的类型是_MMSUPPORT,可以看出当前工作集大小是0x18d页,缺页次数0x189页,工作集最大值0x159页,最小值0x32页。
  工作集链表结构是_MMWSL可以看出其地址想对于_MMSUPPORT的偏移是0x028,下面计算_MMWSL的地址:
  
  kd> ?(81de1de0+0x028)
  Evaluate expression: -2116149752 = 81de1e08
  kd> dd 81de1e08 l 1
  
  显示81de1e08存放的内容是c0502000,这才是_MMWSL真正地址。
  (2) 用dt命令输出工作集链表结构_MMWSL的详细信息
  
  kd> dt nt!_MMWSL c0502000
   +0x000 FirstFree: 0x18d
   //下次进行工作集页面添加的位置
   +0x004 FirstDynamic : 4

[1] [2]  下一页

Tags:

作者:王 雷
  • 好的评价 如果您觉得此文章好,就请您
      50%(1)
  • 差的评价 如果您觉得此文章差,就请您
      50%(1)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论