一基于大页的冷热页追踪及压缩回收方法与流程

文档序号:11691010阅读:284来源:国知局
一基于大页的冷热页追踪及压缩回收方法与流程

本发明属于计算机操作系统技术领域,具体涉及一种基于大页的冷热页追踪及压缩回收方法。



背景技术:

现代cpu是通过寻址来访问内存的。32位cpu的寻址范围是0~0xffffffff,可支持的物理内存最大是4g。但在实践过程中,经常会有这样的问题,多个应用程序同时需要占用的内存总量大于4g或者程序需要使用4g内存但是可用物理内存小于4g。为了解决内存不够用的问题,现代cpu引入内存管理单元(memorymanagementunit,mmu),mmu的核心思想是利用虚拟地址替代物理地址,即cpu寻址时使用虚拟地址,由mmu负责将虚拟地址映射为物理地址。mmu的引入,解决了对物理内存的限制,对程序来说,就像自己在使用4g内存一样。内存分页(paging)是在使用mmu的基础上,提出的一种内存管理机制。它将虚拟地址和物理地址按固定大小(如传统的4kb)分割成页(page)和页帧(pageframe),并保证页与页帧的大小相同。这种机制,从数据结构上,保证了访问内存的高效,并使操作系统能支持非连续性的内存分配。

目前,linux内核中用于解决内存不够的技术主要是基于小页(4kb)的页面回收和页交换技术。内核通过将很少使用的部分内存页换出到块设备,这样就相当于提供了更多的主存。内核在基于小页的页交换和页面回收的实现中,使用了很多关键性的技术:主动回收与被动回收相结合的交换与回收策略;使用双标志位的冷热页判断机制;引入预读机制的缺页异常处理;基于优先级的具有热插拔属性的交换区管理。

对于用作服务器的机器来说,其内存相对于普通计算机要高得多。这时候采用原始的基于4k的分页机制已经渐渐地无法很好地适用当前的应用场景。例如:对于具有128gb内存的linux服务器来说,4kb分一页那么共分成32m(32,000,000)个页,这是一个非常庞大的数字,渐渐的管理这些页需要消耗的资源会削弱分页机制带来的好处。同时针对用户需要大量使用内存的情况,原有的小页会增加缺页次数与内存的访问次数。因此在linux内核2.6版本以后,linux内核也引入了内存大页的机制。但是,对于大页的冷热页追踪,当前内核并没有实现,而是将大页分解成多个小页进行冷热页追踪。因此实现一个基于大页的冷热页追踪是非常重要的,它对于更好的进行页交换与页面回收具有举足轻重的作用。



技术实现要素:

鉴于上述,本发明提出了一种基于大页的冷热页追踪及压缩回收方法,该方法基于双标志位确定大页活动程度,能够更加准确地将冷热大页进行分类,且能够实现冷页的压缩回收。

本发明提出了一种基于大页的冷热页追踪及压缩回收方法,包括以下步骤:

(1)针对每个内存节点,系统调用函数hp_kswapd,该函数hp_kswapd启动内核守护线程,该守护线程周期性地检查大页内存的使用情况;

(2)每个周期内,函数hp_kswapd调用函数hp_balance_node对大页内存进行扫描,针对大页内存不足的节点执行步骤(3)~步骤(6);

(3)函数hp_balance_node调用函数hp_shrink_lruvec对大页内存不足的节点的lru链表中的大页进行处理,得到处于热页链表上的大页数目m,处于冷页链表上的大页数目n,若m大于n,执行步骤(4),否则,执行步骤(5);

(4)函数hp_shrink_lruvec调用函数hp_shrink_active_list判断热页链表上的大页的活动程度,并将热页链表上的活动程度低的冷页大页移动到冷页链表上;

(5)函数hp_shrink_lruvec调用函数hp_shrink_inactive_list判断冷页链表上的大页的活动程度,得到没有被进程访问的冷页;

(6)函数hp_shrink_inactive_list调用函数hp_shrink_page_list对冷页链表上没有被进程访问的冷页进行压缩。

内存初始化的时候会设置一个水印值watermark,该水印值watermark代表当前内核认为比较满意的空闲内存数量,以一个大页为单位,当内存中空闲大页不足watermark所指示的值时,就会执行上述方法来回收大页。

所述的函数hp_kswapd启动内核守护进程,该守护进程周期性地检查大页内存的使用情况,实现方式是在无限循环中周期性睡眠一定时间,该时间可根据业务进行调节,每个周期内函数hp_kswapd调用hp_balance_node函数。

所述的函数hp_balance_node首先初始化控制扫描参数,该控制扫描参数包括是否允许解除映射、是否允许会写,这些参数会直接影响到接下来是否能够回收大页,只有允许解除映射,系统才会压缩那些被进程映射的页,只有允许回写,系统才会压缩那些被修改过的脏页。参数初始化完毕,实现def_priority(可根据业务调节该值)次循环,每次循环判断每个节点的空闲内存是否充足,如果充足,则直接返回到函数hp_kswapd,否则,函数hp_balance_node调用hp_shrink_lruvec回收内存大页。

所述的函数hp_shrink_lruvec首先计算扫描大页数量,然后,根据热页链表与冷页链表的数量关系来确定是否调用hp_shrink_active_list来回收活动页,最终都会调用hp_shrink_inactive_list来回收非活动页。

所述的函数hp_shrink_active_list回收活动链表上的页,主要是依据大页的活动程度方法来判断是否要将该页从活动链表转移到非活动链表。

所述的函数hp_shrink_inactive_list回收非活动链表上的页,主要是依据大页的活动程度判断是否要将该页压缩回收。具体压缩回收是函数hp_shrink_page_list实现的。

为确定大页的活动程度,本发明设置大页的标志位pg_active和标志位ref,其中,标志位pg_active表示页当前的冷热状态,若标志位pg_active为1,表示页当前处于热状态,若标志位pg_active为0,表示页当前处于冷状态,标志位ref表示页是否被进程访问,若标志位ref为0,表示大页在过去一段时间内没有被进程访问;若标志位ref为1,表示大页在过去一段时间内被进程访问;以上两个标志位的设置,可以实现更巧妙快速准确地判断大页的活动程度。

标志位pg_active的置位与清零:如果当前大页处于热页链表lru_active上,则表明该大页为热页,设置标志位pg_active为1,如果当前大页处于冷页链表lru_inactive上,表明该大页为冷页,设置标志位pg_active为0,标志位pg_active的置位与否,直接对应于大页所在的lru链表。

标志位ref的置位与清零:每次扫描大页时,根据使用该页进程的页表项中访问位是否置位来确定是否要设置标志位ref,若页表项中访问位置位,表明该页被进程访问,设置标志位ref为1,若页表项中访问位清零,表明该页未被进程访问,设置标志位ref为0。

从热页链表到冷页链表的移动:当线程hp_kswapd扫描到当前大页,发现从上次扫描到现在,该大页都没有被进程访问,且该大页的标志位ref为0,则将该大页从热页链表转移到冷页链表上,且设置标志位pg_active为0;否则,将该大页返回到热页链表上。

从冷页链表到热页链表的移动:当线程hp_kswapd扫描到当前大页,发现从上次扫描到现在,该大页被进程访问,且该大页的标志位ref为1,则将该大页从冷页链表转移到热页链表上,且设置该大页的标志位ref为0;否则,将该大页返回到冷页链表上。

开始申请的大页无论放到热页链表还是冷页链表上都不会对其稳定状态造成影响,所以所述转换过程描述的是系统运行一段时间之后,如何确定一个大页的活动程度。

以上所述的大页于热页链表与冷页链表之间的移动方法,包括以下步骤:

(1)对于一个初始于热页链表lru_active上的大页,系统判断该大页的页描述符中的_count标识位是否为零,若是,将该大页移回到热页链表上,若否,执行步骤(2);

(2)令该大页的页描述符中的_count标识位加1,并将该大页移动到局部链表l_hold上;

(3)调用page_referenced函数判断移动到局部链表l_hold上的大页是否被进程访问过,若是,执行步骤(4),若否,执行步骤(5);

(4)将该大页从局部链表l_hold上移到局部热页链表l_active上,并设置该大页的标志位pg_active为1;

(5)将该大页从局部链表l_hold上移动到局部冷页链表l_inactive上,并设置该大页的标志位pg_active为0;

(6)对于局部热页链表l_active上的大页,令大页的页描述符中的_count标识位减1,并判断_count标识位是否为0,若是,执行步骤(7),若否,执行步骤(8);

(6’)对于局部冷页链表l_inactive上的大页,令大页的页描述符中的_count标识位减1,并判断_count标识位是否为0,若是,执行步骤(7),若否,执行步骤(9);

(7)将该大页从局部热页链表l_active或局部冷页链表l_inactive移动到链表pageset中,进行回收;

(8)将该大页从局部热页链表l_active移动到热页链表lru_active上,并设置标志位pg_active为1;

(9)将该大页从局部冷页链表l_inactive移动到冷页链表lru_inactive上,并设置标志位pg_active为0。

对于冷页链表lru_inactive上的大页的处理方法与处于热页链表lru_active上的大页的处理方法相同。

该方法确保了内存大页不会在热页链表和冷页链表之间过快的跳跃,如果出现过快的跳跃,显然不利于对大页的活动程度做出一个可靠的判断。所以本发明在将高度活动大页转换为不活动大页之前,会获得第二次机会即连续两次检测结果都为没有被访问,而高度不活动大页在转换为活动大页之前,也需要二次证明,即连续两次检测结果都被访问。这就是本发明实现的冷热页判断机制。

本发明基于双标志位的大页冷热程度确定机制能够更加准确的将冷热大页进行分类,通过这两个标志位密切的协调确定冷热页,对冷热页的误判所造成的回收抖动具有很好的效果。

本发明基于大页的冷热页追踪及压缩回收方法能够有效的实现冷页的压缩回收,使内存回收机制更加完善,内存回收力度大大加强,使相同的物理内存能够执行更多的程序。

附图说明

图1是应用实施例大页于热页链表与冷页链表之间的移动方法的冷热页追踪系统框架;

图2是实施例大页于热页链表与冷页链表之间的移动方法的流程示意图;

图3是实施例基于大页的冷热页追踪及压缩回收方法的流程示意图。

具体实施方式

为了更为具体地描述本发明,下面结合附图及具体实施方式对本发明的技术方案进行详细说明。

如图1所示的是应用本实施例方法的一种冷热页追踪系统框架,包括:用于存放热页的热页链表lru_active、用于存放冷页的冷页链表lru_inactive、用于存放空闲页的空闲链表free_list以及压缩空间/外存,linux内核线程hp_kswapd对内存大页进行周期性扫描,根据大页的冷热程度,利用lru算法将大页移动到到与其热页程度相匹配的链表上。

为确定大页的活动程度,本发明设置大页的标志位pg_active和标志位ref,其中,标志位pg_active表示页当前的冷热状态,若标志位pg_active为1,表示页当前处于热状态,若标志位pg_active为0,表示页当前处于冷状态,标志位ref表示页是否被进程访问,若标志位ref为0,表示大页在过去一段时间内没有被进程访问;若标志位ref为1,表示大页在过去一段时间内被进程访问;以上两个标志位的设置,可以实现更巧妙快说准确地判断大页的活动程度。

标志位pg_active的置位与清零:如果当前大页处于热页链表lru_active上,则表明该大页为热页,设置标志位pg_active为1,如果当前大页处于冷页链表lru_inactive上,表明该大页为冷页,设置标志位pg_active为0,标志位pg_active的置位与否,直接对应于大页所在的lru链表。

标志位ref的置位与清零:每次扫描大页时,根据使用该页进程的页表项中访问位是否置位来确定是否要设置标志位ref,若页表项中访问位置位,表明该页被进程访问,设置标志位ref为1,若页表项中访问位清零,表明该页未被进程访问,设置标志位ref为0。

从热页链表到冷页链表的移动:当线程hp_kswapd扫描到当前大页,发现从上次扫描到现在,该大页都没有被进程访问,且该大页的标志位ref为0,则将该大页从热页链表转移到冷页链表上,且设置标志位pg_active为0;否则,将该大页返回到热页链表上。

从冷页链表到热页链表的移动:当线程hp_kswapd扫描到当前大页,发现从上次扫描到现在,该大页被进程访问,且该大页的标志位ref为1,则将该大页从冷页链表转移到热页链表上,且设置该大页的标志位ref为0;否则,将该大页返回到冷页链表上。

该方法确保了内存大页不会在热页链表和冷页链表之间过快的跳跃,如果出现过快的跳跃,显然不利于对大页的活动程度做出一个可靠的判断。所以本发明在将高度活动大页转换为不活动大页之前,会获得第二次机会即连续两次检测结果都没有被访问,而高度不活动大页在转换为活动大页之前,也需要二次证明,即连续两次检测结果都被访问。这就是本发明实现的冷热页判断机制。

基于上述的冷热页追踪系统架构,大页于热页链表与冷页链表之间的移动方法,如图2所示,包括以下步骤:

s101,对于一个初始于热页链表lru_active上的大页,系统判断该大页的页描述符中的_count标识位是否为零,若是,将该大页移回到热页链表上,若否,执行s102;

s102,令该大页的页描述符中的_count标识位加1,并将该大页移动到局部链表l_hold上;

s103,调用page_referenced函数判断移动到局部链表l_hold上的大页是否被进程访问过,若是,执行s104,若否,执行s105;

s104,将该大页从局部链表l_hold上移到局部热页链表l_active上,并设置该大页的标志位pg_active为1;

s105,将该大页从局部链表l_hold上移动到局部冷页链表l_inactive上,并设置该大页的标志位pg_active为0;

s106,对于局部热页链表l_active上的大页,令大页的页描述符中的_count标识位减1,并判断_count标识位是否为0,若是,执行s107,若否,执行s108;

s106’,对于局部冷页链表l_inactive上的大页,令大页的页描述符中的_count标识位减1,并判断_count标识位是否为0,若是,执行s107,若否,执行s109;

s107,将该大页从局部热页链表l_active或局部冷页链表l_inactive移动到链表pageset中,进行回收;

为防止将要被回收的大页被其他函数调用,并将其收回,故将这些大页移动到链表pageset中。

s108,将该大页从局部热页链表l_active移动到热页链表lru_active上,并设置标志位pg_active为1;

s109,将该大页从局部冷页链表l_inactive移动到冷页链表lru_inactive上,并设置标志位pg_active为0。

基于上述的大页于热页链表与冷页链表之间的移动方法,对大页进行冷热页追踪及压缩回收,具体包括以下步骤:

s201,针对每个内存节点,系统调用函数hp_kswapd,该函数hp_kswapd启动内核守护线程,该守护线程周期性地检查大页内存的使用情况;

s202,每个周期内,函数hp_kswapd调用函数hp_balance_node对大页内存进行扫描,针对大页内存不足的节点执行步骤(3)~步骤(6);

s203,函数hp_balance_node调用函数hp_shrink_lruvec对大页内存不足的节点的lru链表中的大页进行处理,得到处于热页链表上的大页数目m,处于冷页链表上的大页数目n,若m大于n,执行s204,否则,执行s205;

s204,函数hp_shrink_lruvec调用函数hp_shrink_active_list判断热页链表上的大页的活动程度,并将热页链表上的活动程度低的冷页大页移动到冷页链表上;

s205,函数hp_shrink_lruvec调用函数hp_shrink_inactive_list判断冷页链表上的大页的活动程度,得到没有被进程访问的冷页;

s206,函数hp_shrink_inactive_list调用函数hp_shrink_page_list对冷页链表上没有被进程访问的冷页进行压缩。

以上方法基于双标志位的大页冷热程度确定机制能够更加准确的将冷热大页进行分类,通过这两个标志位密切的协调确定冷热页,对冷热页的误判所造成的回收抖动具有很好的效果,且基于大页的冷热页追踪及压缩回收方法能够有效的实现冷页的压缩回收,使内存回收机制更加完善,内存回收力度大大加强,使相同的物理内存能够执行更多的程序。

以上所述的具体实施方式对本发明的技术方案和有益效果进行了详细说明,应理解的是以上所述仅为本发明的最优选实施例,并不用于限制本发明,凡在本发明的原则范围内所做的任何修改、补充和等同替换等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1