一种内存链表及内存管理的优化方法技术

技术编号:19177048 阅读:24 留言:0更新日期:2018-10-17 00:18
本发明专利技术涉及计算机技术领域,尤其涉及一种内存链表,包括:一第一子链表;一第二子链表;第一表头;第二表头指针,指向第二子链表的第一个内存页;第一表头的前指针指向第二子链表的最后一个内存页;第二子链表中除第一个的其他内存页的前指针分别指向前一个内存页;第二子链表中的第一个内存页的前指针指向第一子链表中的最后一个内存页;第一表头的后指针指向第一子链表的第一个内存页;第一子链表中除最后一个的其他内存页的后指针分别指向后一个内存页;第一子链表中的最后一个内存页的后指针指向第二子链表中的第一个内存页;以及应用上述内存链表的内存管理的优化方法;能够对内存页进行分类存储和管理,保证内存管理的高效性。

An optimization method for memory list and memory management

The invention relates to the field of computer technology, in particular to a memory list, including: a first sublist; a second sublist; a first header; a second header pointer, pointing to the first memory page of the second sublist; a front pointer of the first header pointing to the last memory page of the second sublist; and a division in the second sublist The front pointer of the first other memory page points to the previous memory page, the front pointer of the first memory page in the second sublist points to the last memory page in the first sublist, the back pointer of the first table head points to the first memory page in the first sublist, and the last memory page in the first sublist except for the last memory page The latter pointer points to the latter memory page, the latter pointer of the last memory page in the first sub-list points to the first memory page in the second sub-list, and the optimization method of memory management using the above memory list can classify and manage the memory pages to ensure the efficiency of memory management.

【技术实现步骤摘要】
一种内存链表及内存管理的优化方法
本专利技术涉及计算机处理
,尤其涉及一种内存链表及内存管理的优化方法。
技术介绍
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,回收所述第二子链表中的最后一个所述内存页。上述的优化方法,其中,通过所述第一表头的所述后指针找本文档来自技高网
...

【技术保护点】
1.一种内存链表,其特征在于,包括:一第一子链表,用于放置依次排列的第一内存迁移类型的内存页;一第二子链表,用于放置依次排列的第二内存迁移类型的内存页;第一表头;第二表头指针,指向所述第二子链表的第一个所述内存页;所述第一表头和每个所述内存页均具有一前指针和一后指针;所述第一表头的所述前指针指向所述第二子链表的最后一个所述内存页;所述第二子链表中除第一个的其他所述内存页的所述前指针分别指向前一个所述内存页;所述第二子链表中的第一个所述内存页的所述前指针指向所述第一子链表中的最后一个所述内存页;所述第一表头的所述后指针指向所述第一子链表的第一个所述内存页;所述第一子链表中除最后一个的其他所述内存页的所述后指针分别指向后一个所述内存页;所述第一子链表中的最后一个所述内存页的所述后指针指向所述第二子链表中的第一个所述内存页。

【技术特征摘要】
1.一种内存链表,其特征在于,包括:一第一子链表,用于放置依次排列的第一内存迁移类型的内存页;一第二子链表,用于放置依次排列的第二内存迁移类型的内存页;第一表头;第二表头指针,指向所述第二子链表的第一个所述内存页;所述第一表头和每个所述内存页均具有一前指针和一后指针;所述第一表头的所述前指针指向所述第二子链表的最后一个所述内存页;所述第二子链表中除第一个的其他所述内存页的所述前指针分别指向前一个所述内存页;所述第二子链表中的第一个所述内存页的所述前指针指向所述第一子链表中的最后一个所述内存页;所述第一表头的所述后指针指向所述第一子链表的第一个所述内存页;所述第一子链表中除最后一个的其他所述内存页的所述后指针分别指向后一个所述内存页;所述第一子链表中的最后一个所述内存页的所述后指针指向所述第二子链表中的第一个所述内存页。2.一种内存管理的优化方法,其特征在于,应用于如权利要求1所述的内存链表;包括:步骤S1,提供一新的所述内存页;步骤S2,判断新的所述内存页为所述第一内存迁移类型还是所述第二内存迁移类型;若为所述第一内存迁移类型,则转向步骤S3;若为所述第二内存迁移类型,则转向步骤S4;步骤S3,对新的所述第一内存迁移类型的所述内存页的所述前指针和所述后指针进...

【专利技术属性】
技术研发人员:曾涛
申请(专利权)人:晶晨半导体上海股份有限公司
类型:发明
国别省市:上海,31

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1