一种提高Linux空闲内存块利用率的方法,其特征在于:Linux伙伴系统中,放宽对伙伴关系的限制,将大小相等,地址连续但不是从一个大块拆分而来的两个空闲块合并成放宽伙伴关系块;同时在伙伴系统结构体free_area_struct中增加一个二维数组(列维为2)与一个整形变量,二维数组用来记录下一阶放宽伙伴关系两个空闲块的序号,整形变量用来记录下一阶放宽伙伴关系块的数目,如果系统无法满足请求者内存分配的需要,系统会查找将放宽伙伴关系的空闲块,分配给请求者,有效提高了内存利用率。
【技术实现步骤摘要】
【专利摘要】,其特征在于:Linux伙伴系统中,放宽对伙伴关系的限制,将大小相等,地址连续但不是从一个大块拆分而来的两个空闲块合并成放宽伙伴关系块;同时在伙伴系统结构体free_area_struct中增加一个二维数组(列维为2)与一个整形变量,二维数组用来记录下一阶放宽伙伴关系两个空闲块的序号,整形变量用来记录下一阶放宽伙伴关系块的数目,如果系统无法满足请求者内存分配的需要,系统会查找将放宽伙伴关系的空闲块,分配给请求者,有效提高了内存利用率。【专利说明】—种提高Linux空闲内存块利用率的方法
本专利技术属于内存管理
,具体涉及Linux内存管理中伙伴算法对放宽伙伴关系空闲内存块的分配与回收管理。
技术介绍
Linux内存中的所有页面按照2的幂进行划分,方幂的指数被称为阶(order)。阶的大小一般是0-MAX_0RDER-l。操作内存时经常将这些内存块分成大小相等的两个块,这两个块具有伙伴关系,当系统请求(O ( n<MAX_0RDER)个页面大小的页块时,伙伴算法首先在2n空闲块中查找,如果找到就会分配,如果没有找到就会一次在2 (η+1)~2 (MAX_0RDER-1)空闲块中查找进行分配并把伙伴块插入到相应的链表中。当释放的页块时,伙伴算法先查找其伙伴块是否在空闲链表中,如果没有就把页块插入到2n大小的链表中,如果有就将这两个伙伴块合并,继续查找上一级是否存在伙伴块,以此进行下去,最后将合并的块插入到对应的空闲链表中。如图1伙伴算法空闲内存组织,Linux内存管理器采用的是链表和位图相结合的方法,具有伙伴关系的两个块在位图中采用一位来表示它们的伙伴关系。当这个位为1,表示一块在使用,当这个位为O表示两块都空闲或都在使用。系统每次分配和回收伙伴块时都要对它们对应位图的取值跟I异或运算。刚开始时候,两个伙伴块都空闲,它们的位图取值为0,后来其中一位被使用,异或一下得1,后来另一块也被使用,异或一下得O,后来前面一块回收了,异或一下得I,后来另一块也回收了异或一下得O。例如,系统请求23个页面大小的内存块,系统会在order为3的free_area中查找链表,如果有空闲块,则从此链表中删除一个空闲块分配,并将对应的位图位异或I ;如果在free_area中没用空闲块,系统会继续查找order为4的free_area的链表首部,并将其对应的位图位异或1,后半部分分配给请求者;如果free_area中也没有空闲块,系统会继续查找order为5的free_area中查找链表,如果有空闲块,系统会从此链表中删除一个空闲块,并将其对应的位图位异或1,这个空闲块分成大小相等的两部分,前半部分插入到free_area的链表首部,并将其对应的位图位异或1,后半部分再分成大小相等的两部分,前半部分插入到free_area链表中,并将其对应的位图位异或1,后半部分分配给请求者;如果free_area链表中任然没有空闲块,则重复前面的过程,以此类推,直到order为MAX_0RDER_1为止,否则,唤醒kswapd守护进程释放部分内存。伙伴算法虽然是经典算法,但也存在不足之处。比如它的合并要求过于严格,伙伴关系必须满足三个条件(I)大小相等(2)地址连续(3)两个伙伴从同一个大块中拆分出。这限制了某些相邻但不是伙伴的空闲内存块的合并。这使得大块内存空间不能得到更好的利用,对紧俏的内存资源来说比较浪费。
技术实现思路
本专利技术旨在解决现伙伴算法中存在的空闲内存资源浪费问题,将内存中大小相等,地址连续但不满足伙伴关系的空闲内存块,同样合并成大的内存块,在内存紧张时,满足内存的请求。本专利技术为解决上述伙伴算法存在的问题所采取的技术方案为:,其特征在于:在保证原伙伴算法的性能前提下,只是增加一个二维数组availablefreeblock口 和一个变量availablecount,就能使原伙伴算法中相邻但非伙伴关系的空闲内存块组合成大的内存块充分利用,打破了伙伴算法只有伙伴块可以合并的禁锢,同时,该优化管理开销小,使得Linux在更广泛环境中(尤其内存紧张时)得到使用。本专利技术提出的上述技术方案克服了传统伙伴算法中对大小相等、地址连续但非伙伴关系的空闲内存块不能充分利用的缺陷。本专利技术的其他特征和效果将在下面结合附图的【具体实施方式】中详细说明。【专利附图】【附图说明】图1伙伴算法空闲内存组织;图2算法修改前内存分配流程图;图3算法修改后内存分配流程图;`图4算法修改前内存释放流程图;图5算法修改内存释放流程图图。【具体实施方式】下面将结合附图描述本专利技术的针对Linux内存管理中伙伴算法不足提出的优化方法。针对上述伙伴算法存在缺陷,我们放宽对伙伴关系的限制,对伙伴算法进行修改,在free_area_struct结构体中增加一个二维数组availablefreeblock和一个无符号整形变量availablecount。数组 availablefreeblock[] [2】用于存放下一级 free_area_struct中相邻的两个非伙伴关系的空闲块的起始页面号;变量availablecount代表这种放宽伙伴关系的两个相邻空闲块的数目。该优化方案同时对伙伴算法内存分配与释放函数作出修改,在正常情况下,使用原来伙伴算法管理分配空闲块,当内存紧张时,使用放宽伙伴关系的空闲块,提高Linux对内存资源的利用率;伙伴关系伙伴块的查找是通过异或操作buddy_idx=page_idx八(l?order+l)完成,放宽伙伴关系的伙伴块查找根据空闲块序号第order+Ι的值来判断,若order+Ι位为0,空闲块序号减去2OTd'就得到相邻块的序号,否则,加上2°rder。改进后的free_area_struct数据结构为:typedef struct free_area_stmct{ struct list_head free—list; unsigned int *map; unsigned int availablefreeblock ; unsigned int availablecount;} free—area—t算法修改后,内存分配方面,先查找伙伴关系的空闲块,使用free_list中的内存块时,有可能会影响到availablefreeblock,因为使用的内存块的一部分有可能会在availablefreeblock有记录,所以需要将相应的记录删除,以保证系统对于内存管理的正确性。如果未找到伙伴关系的空闲内存块,再查找有没有合适大小的非伙伴关系的相邻内存块进行分配。例如系统请求23页面大小的空闲块,现在free_areal3]中free_list查找有没有空闲块,如果没有再查找availablefreeblock中有没有非伙伴关系的相邻内存块,有则转到free_area中将这两个相邻内存块从free_list链表中删除,这两个相邻内存块分配时,势必会影响它们各自的位图,为了保证内存管理位图的正确性,需要分别将它们相应的位图取值异或I。内存分配算法修改前后比较如图2和图3。算法修改后,在内存释放方面,释放的内存块,先查找其伙伴块是否空闲,如果空闲,进行合并。否则,查找放宽伙伴关系的相邻块是否空闲本文档来自技高网...
【技术保护点】
一种提高Linux空闲内存块利用率的方法,其特征在于:Linux伙伴系统中,放宽对伙伴关系的限制,将大小相等,地址连续但不是从一个大块拆分而来的两个空闲块合并成放宽伙伴关系块;同时在伙伴系统结构体free_area_struct中增加一个二维数组(列维为2)与一个整形变量,二维数组用来记录下一阶放宽伙伴关系两个空闲块的序号,整形变量用来记录下一阶放宽伙伴关系块的数目,如果系统无法满足请求者内存分配的需要,系统会查找将放宽伙伴关系的空闲块,分配给请求者,有效提高了内存利用率;放宽伙伴关系的伙伴块管理是采用数组与位图结合方法,位图仍采用原位图,由于放宽伙伴关系内存块在位图中占有两项,所以放宽伙伴关系的内存块分配或释放时,需要对位图操作两次。
【技术特征摘要】
【专利技术属性】
技术研发人员:张树东,孟兆飞,周丽娟,黄向阳,任仲山,
申请(专利权)人:首都师范大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。