一种内存链表及内存管理的优化方法与流程

文档序号:15686096发布日期:2018-10-16 21:04阅读:341来源:国知局

本发明涉及计算机处理技术领域,尤其涉及一种内存链表及内存管理的优化方法。



背景技术:

cma(contiguousmemoryallocator连续内存分配器,简称cma)是linux系统上设备使用大块内存的一个重要方法。在cma技术没有出现之前,设备驱动程序通常都是使用预留的方式申明大块连续物理内存。由于这些预留的物理内存对linux内核的内存管理框架而言是不可见的,因此如果预留的内存过多,会导致系统容易出现内存紧张的情况。而预留内存的设备驱动程序并不总是工作并持有内存的,这也造成了这部分内存的使用率低下,存在资源浪费的情况。

cma技术很好的平衡了设备对大块连续内存的需求以及linux内存管理之间的矛盾。内核通过在启动阶段对设备申明的cma内存做特殊类型标记来识别cma。并且,在设备驱动程序不使用cma内存的时候,将其共享给应用程序的数据,而在设备驱动程序需要内存的时候,通过内存迁移、回收等方法整理出一块连续的内存区域提供给驱动。

lru(leastrecentlyused最近最少使用,简称lru)是linux内存管理中的一种内存页置换算法。linux系统对应用数据按照来源和活跃程度,分为四类:活跃文件缓存,不活跃文件缓存,活跃匿名页,不活跃匿名页。并且为每种类型的内存构建了一个lru链表,如图1所示。图1中以活跃文件缓存为例,画出了lru算法的大致示意图。内核为这种类型的内存页创建了一个双向链表头,这个链表结构有一个后方向和前方向,当有新的活跃文件缓存需要被添加到lru中来的时候,内核会将其插入到链表头的后方向后面,并将待插入内存页结构中的双向链表指针的后方向指向后续内存页,将待插入内存页的前方向指向表头,将后续内存页的前方向指向当前内存页。这样构成一个双循环链表结构,可以通过链表头很容易找到最新插入的内存页,以及最老插入的内存页。内存页越靠后,表明内存页在链表中的时间越久。

当内存不足的时候,内核会通过特定进程在lru链表中,寻找比较老的内存页,如果内存页是文件缓存,则直接将其释放,如果是匿名页,则写入交换分区,以达到释放出足够内存空间的目的。显然,通过lru算法以牺牲最近很少使用,不活跃的数据为代价,达到在内存紧张的时候保留近期频繁使用,活跃的数据,并且清理出足够内存空间的目的。这种方法对于提高系统性能显然大有帮助。

当使用cma技术的时候,标记为cma类型的内存,也会通过上述lru算法将内存页串入到各个类型的lru链表中。举例来说,图2中排在第二和第四个的内存页的是cma类型的内存页。此时cma内存页出现在链表中的位置实际上是随机的。

尽管前文提到,cma技术能平衡驱动程序对大块连续物理内存的需求和系统内存紧张之间的矛盾。但是cma的使用是有前提的。linux内核中,为了避免内存碎片化,将内存从是否可以被迁移的角度分成如下几个类别:migrate_unmovable,migrate_reclaimble,migrate_movable,migtate_cma。这其中,用于存储cma内存页的内存只能共享给migrate_movable类型的内存。

上述问题产生的原因是migrate_unmovable,migrate_reclaimble这两种类型的内存一般是内核自身以及驱动程序申请的内存,为节约空间,内核并没有给这些内存请求创建页表,内核无法在不影响内核以及驱动程序使用的情况下将其搬移。而migrate_movable是应用程序申请的内存,它们具有页表映射,当内核需要将这些内存搬移走的时候,内核会先将对应内存页标记为缺页,然后将其复制到新的内存中,同时创建好新的页表映射。这个过程对应用程序而言是透明的。所以migrate_movable内存可以在系统中自由移动是cma技术的基础。

平时驱动程序不使用这段内存,那么可以将其借用给migrate_movable类型的内存,以缓解内存紧张的问题。当驱动需要使用cma的时候,内核负责将这些内存搬走即可。但是用于存储cma内存页的内存是无论如何也不能借用给migrate_unmovable和migrate_reclaimble这两种类型的内存。

正是由于cma的这个共享限制,结合到lru算法之后会导致如下问题:如果lru链中位于链表尾部的内存页都是或者绝大部分都是cma类型的内存页,并且这时候内核需要为migrate_unmovable或migrate_reclaimble类型的内存申请去lru链上回收内存,那么按照lru算法从链表的尾部开始回收。显而易见的是,回收到的大部分内存也都是cma类型的内存页,它无法给申请者使用。这就导致了驱动或者内核容易出现内存分配失败,或者需要经过多次重试才能回收到适合的内存页,效率显得非常低。

在这种情况下的测试中曾经出现过扫描了链表中20000多个内存页才找出32个合适的内存页的情况。显然这大大降低了lru算法的效率。



技术实现要素:

针对上述问题,本发明提出了一种内存链表,其中,包括:

一第一子链表,用于放置依次排列的第一内存迁移类型的内存页;

一第二子链表,用于放置依次排列的第二内存迁移类型的内存页;

第一表头;

第二表头指针,指向所述第二子链表的第一个所述内存页;

所述第一表头和每个所述内存页均具有一前指针和一后指针;

所述第一表头的所述前指针指向所述第二子链表的最后一个所述内存页;

所述第二子链表中除第一个的其他所述内存页的所述前指针分别指向前一个所述内存页;

所述第二子链表中的第一个所述内存页的所述前指针指向所述第一子链表中的最后一个所述内存页;

所述第一表头的所述后指针指向所述第一子链表的第一个所述内存页;

所述第一子链表中除最后一个的其他所述内存页的所述后指针分别指向后一个所述内存页;

所述第一子链表中的最后一个所述内存页的所述后指针指向所述第二子链表中的第一个所述内存页。

上述的内存链表,其中,运行所述内存链表的处理器为64位。

上述的内存链表,其中,所述第二表头指针占用的内存容量为40字节。

一种内存管理的优化方法,其中,应用于如上任一所述的内存链表;包括:

步骤s1,提供一新的所述内存页;

步骤s2,判断新的所述内存页为所述第一内存迁移类型还是所述第二内存迁移类型;

若为所述第一内存迁移类型,则转向步骤s3;若为所述第二内存迁移类型,则转向步骤s4;

步骤s3,对新的所述第一内存迁移类型的所述内存页的所述前指针和所述后指针进行赋值,使得新的所述内存页的所述前指针指向所述第一表头,以及所述后指针指向原先的第一个所述内存页;

步骤s4,对新的所述第二内存迁移类型的所述内存页的所述前指针和所述后指针进行赋值,使得新的所述内存页的所述前指针指向所述第一子链表中的最后一个所述内存页,以及所述后指针指向所述第二子链表中的原先的第一个所述内存页。

上述的优化方法,其中,回收所述内存页的具体方法为:

步骤a1,判断需要回收的所述内存页的类型为所述第一内存迁移类型还是所述第二内存迁移类型;

若为所述第一内存迁移类型,则转向所述步骤a2;若为所述第二内存迁移类型,则转向所述步骤a3;

步骤a2,回收所述第一子链表中的最后一个所述内存页;

步骤a3,回收所述第二子链表中的最后一个所述内存页。

上述的优化方法,其中,通过所述第一表头的所述后指针找到所述第二子链表中的最后一个所述内存页。

上述的优化方法,其中,通过所述第二表头指针指向的所述内存页的所述前指针找到所述第一子链表中的最后一个所述内存页。

上述的优化方法,其中,回收所述内存页时,优先回收所述第一子链表的尾部的所述内存页,直到所述第一子链表中的所述内存页的数量变成0。

有益效果:本发明提出的一种内存链表及内存管理的优化方法,能够对内存页进行分类存储和管理,保证内存管理的高效性。

附图说明

图1为本发明一实施例中内存链表的结构原理图;

图2为本发明一实施例中内存管理的优化方法的步骤原理图。

具体实施方式

下面结合附图和实施例对本发明进行进一步说明。

实施例一

如图1所示,在一个较佳的实施例中,提出了一种内存链表,其中,可以包括:

一第一子链表1,用于放置依次排列的第一内存迁移类型的内存页p;

一第二子链表2,用于放置依次排列的第二内存迁移类型的内存页p;

第一表头11;

第二表头指针12,指向第二子链表2的第一个内存页p;

第一表头11和每个内存页p均具有一前指针和一后指针;

第一表头11的前指针指向第二子链表2的最后一个内存页p;

第二子链表2中除第一个的其他内存页p的前指针分别指向前一个内存页p;

第二子链表2中的第一个内存页p的前指针指向第一子链表1中的最后一个内存页p;

第一表头11的后指针指向第一子链表1的第一个内存页p;

第一子链表1中除最后一个的其他内存页p的后指针分别指向后一个内存页p;

第一子链表1中的最后一个内存页p的后指针指向第二子链表2中的第一个内存页p。

上述技术方案中,第一内存迁移类型可以是除cma类型以外的任意类型,第二内存迁移类型可以是cma类型,第一子链表1中的内存页p回收以后,可以共享给migrate_unmovable或migrate_reclaimble类型的内存,从而缓解内存压力;将不同类型的内存页p插入至不同的子链表中,从而在采用一般的内存回收技术时,避免回收的内存页p总是为不活跃类型的内存页,从而保证了lru链表的管理效率;第二内存迁移类型可以是多个子类型的集合,不应视为只能是单一的类型;内存页第一表头11可以视为是位于第一子链表1的首部;本发明中各个部分的结构均是处于lru中的链表结构。

在一个较佳的实施例中,运行内存链表的处理器为64位。

上述实施例中,优选地,第二表头指针占用的内存容量为40字节左右。

实施例二

如图2所示,在一个较佳的实施例中,还提出了一种内存管理的优化方法,其中,可以应用于如上任一的内存链表;该优化方法可以包括:

步骤s1,提供一新的内存页p;

步骤s2,判断新的内存页p为第一内存迁移类型还是第二内存迁移类型;

若为第一内存迁移类型,则转向步骤s3;若为第二内存迁移类型,则转向步骤s4;

步骤s3,对新的第一内存迁移类型的内存页p的前指针和后指针进行赋值,使得新的内存页p的前指针指向第一表头11,以及后指针指向原先的第一个内存页p;

步骤s4,对新的第二内存迁移类型的内存页p的前指针和后指针进行赋值,使得新的内存页p的前指针指向第一子链表1中的最后一个内存页p,以及后指针指向第二子链表2中的原先的第一个内存页p。

上述技术方案中,第一内存迁移类型可以是除cma类型以外的任意类型,第二内存迁移类型可以是cma类型,第一子链表1中的内存页p回收以后,可以共享给migrate_unmovable或migrate_reclaimble类型的内存,从而缓解内存压力;将不同类型的内存页p插入至不同的子链表中,从而在采用一般的内存回收技术时,避免回收的内存页p总是为不活跃类型的内存页,从而保证了lru链表的管理效率;第二内存迁移类型可以是多个子类型的集合,不应视为只能是单一的类型;内存页p也可以称为内存页,可以对应一定的内存空间。

在一个较佳的实施例中,回收内存页的具体方法可以为:

步骤a1,判断需要回收的内存页p的类型为第一内存迁移类型还是第二内存迁移类型;

若为第一内存迁移类型,则转向步骤a2;若为第二内存迁移类型,则转向步骤a3;

步骤a2,回收第一子链表1中的最后一个内存页p;

步骤a3,回收第二子链表2中的最后一个内存页p。

上述实施例中,优选地,可以通过第一表头11的后指针找到第二子链表2中的最后一个内存页p。

上述实施例中,优选地,可以通过第二表头指针12指向的内存页p的前指针找到第一子链表1中的最后一个内存页p。

在一个较佳的实施例中,回收内存页p时,可以优先回收第一子链表1的尾部的内存页p,直到第一子链表1中的内存页p的数量变成0。

综上所述,本发明提出的一种内存链表,包括:一第一子链表,用于放置依次排列的第一内存迁移类型的内存页;一第二子链表,用于放置依次排列的第二内存迁移类型的内存页;第一表头;第二表头指针,指向第二子链表的第一个内存页;第一表头和每个内存页均具有一前指针和一后指针;第一表头的前指针指向第二子链表的最后一个内存页;第二子链表中除第一个的其他内存页的前指针分别指向前一个内存页;第二子链表中的第一个内存页的前指针指向第一子链表中的最后一个内存页;第一表头的后指针指向第一子链表的第一个内存页;第一子链表中除最后一个的其他内存页的后指针分别指向后一个内存页;第一子链表中的最后一个内存页的后指针指向第二子链表中的第一个内存页;以及应用上述内存链表的内存管理的优化方法;能够对内存页进行分类存储和管理,保证内存管理的高效性。

通过说明和附图,给出了具体实施方式的特定结构的典型实施例,基于本发明精神,还可作其他的转换。尽管上述发明提出了现有的较佳实施例,然而,这些内容并不作为局限。

对于本领域的技术人员而言,阅读上述说明后,各种变化和修正无疑将显而易见。因此,所附的权利要求书应看作是涵盖本发明的真实意图和范围的全部变化和修正。在权利要求书范围内任何和所有等价的范围与内容,都应认为仍属本发明的意图和范围内。

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