本发明专利技术公开了内存的分配、清理和释放方法,还公开了一种内存管理的装置,包括:内存分配模块,用于从大小最合适的空闲队列中为内存请求分配内存块;碎片回收模块,用于对内存分配时产生的内部碎片进行回收,并将所述内部碎片分别插到不同的空闲队列;内存合并模块,用于当最大的空闲内存块也无法满足所述内存请求时,进行内存块合并操作。本发明专利技术通过对内存请求按需分配,能够减少内部碎片的产生。还对释放的内存块延迟合并,能够避免频繁分裂和合并所造成的内存震荡,从而减少系统频繁进行分裂和合并的开销,提高了系统的性能。
【技术实现步骤摘要】
本专利技术涉及内存管理技术,特别是内存的分配、清理和释放方法及内存 管理的装置。
技术介绍
随着linux系统广泛使用,该系统中动态内存的管理方式已经变得愈发 重要。因为如果动态内存短缺或管理不当,将导致整个系统反应迟緩,甚至 整个系统的崩溃。为了保证linux内存管理机制能够高效运行,在现代操作系统中采用了 许多技术,其中比较常用的就是伙伴算法。该算法最早是由Donald E. Knuth 于1968年提出的,是一个快速的动态内存管理经典算法。在该算法中有多个空闲队列,块长为2k个页面的空闲块都在同 一个队列 中。当要分配一个长为m的内存块时,需从块长为2'的空闲队列中分配一个 内存块(其中i满足2'-'〈m〈2')。如果块长为2'的空闲队列耗尽,则从块长 为2"'的空闲队列中分配一块,,将其分为长度相等的两段,这两段互为伙伴, 一段用于分配,另一段链入块长为2'的伙伴空闲队列中。如果块长为2' + '的 空闲队列也为空,则继续向块长更大的内存块(21+2 , 2'" )提出请求。而当块长为"个页面的内存块被释放时,首先检查其伙伴块是否空闲, 如果空闲则与伙伴块合并为块长为2」+'的空闲块,并链入对应队列中;若忙则 直接链入块长为2J的空闲队列中。当合并得到块长为2J"的空闲内存块时,也 要检查它的伙伴块状态并做相同的处理,直到得到最大的空闲块。在伙伴算 法中,内存的分配和合并都是一个递归的过程。经典的伙伴算法是一个非常强调时效的算法。最坏的情况下,内存分配和回收的时间开销都是G(bg M),其中M是内存的大小。从而内存的分配和 回收可在一定时限内完成。在经典的伙伴算法中主要时间消耗在分配时没有 合适的内存块,需要把大的内存块分裂成较小的内存块的过程,以及在回收 时,把小的空闲块合并成较大空闲块的过程。经典伙伴算法虽然具有较译的时效性,但存在两个问题严重制约着算法 的性能。首先,经典伙伴算法由于块长为2的幂次方,造成了较多的内部碎 片,从而导致即使系统中有足够的内存,但由于其不连续也不能满足某些内存请求;其次,若分配的内存块生存周期很短,经典的伙伴算法要求系统不断进行内存块的分裂和合并过程,使得系统产生过大的负载影响了系统的运 行效率。针对经典伙伴算法中存在的问题,对该算法的研究一直没有停止过。例如,针对内部碎片问题,研究者们先后提出了三种比较重要的改进算法 Knowlton和knuth的binary ^火j半算法,Hirschberg的fibonacci "f火"f半算法, 以及Shen和Peterson的weighted伙伴算法。这三种算法均通过增加内存块 尺寸的种类,希望最大程度的使内存块尺寸更加接近应用需求,以减少内部 碎片的产生。虽然这些算法提供了更多合适的内存块尺寸,似乎达到了减少 内部碎片的目的,但是仔细分析则不难发现,在提供更多的内存块尺寸时, 系统就要增加维护新尺寸内存块的表项,从而增加了空间开销;同时由于内 存块尺寸的粒度变细,增加了分裂回收伙伴的次数,增加了时间开销;而且 试验证明,系统的内部碎片总量总是保持在25%-40%这个恒定的区间,并没 有有效减少。总的来说,这三种算法实现内部碎片的减少是以牺牲算法性能 为代价的。
技术实现思路
有鉴于此,本专利技术的目的在于提供内存的分配、清理和释放方法及内存 管理的装置,用于减小内存碎片和提高系统效率。为实现上述目的,本专利技术提供了一种内存的分配方法,在接收到内存请求时,包括以下步骤从大小最合适的空闲队列为所述内存请求分配内存块,对内存分配时产生的内部碎片进行回收,将所述内部碎片分别插到不同的空闲队列;当最大 的空闲内存块也无法满足所述内存请求时,进行内存块合并操作。本专利技术还提供了一种清理内存的方法,在接收到内存请求时,如果空闲 内存中最大的内存块也无法满足所述内存请求时,进行内存块合并操作。本专利技术还提供了一种释放内存的方法,当内存块被释放时,将释放的内 存块插入到相应的伙伴忙空闲队列,或将伙伴忙空闲队列中的内存块转移到 伙伴闲空闲队列,并不立即对内存块进行合并操作,仅仅当最大的空闲内存 块也无法满足内存请求时,才进行内存块合并操作。本专利技术还提供了一种内存管理的装置,包括内存分配模块,用于从大小最合适的空闲队列中为内存请求分配内存块;内部碎片分别插到不同的空闲队列;内存合并模块,用于当最大的空闲内存块也无法满足所述内存请求时, 进行内存块合并操作。本专利技术通过对内存请求执行按需分配策略,能够提供灵活多变的内存块 尺寸,从而达到了减少内部碎片的目的。同时还对释放的内存块执行延迟合 并的策略,能够避免频繁分裂和合并所造成的内存震荡,从而减少系统频繁 进行分裂和合并的开销,提高了系统的性能。附图说明图1为本专利技术的实施例中进行内存分配的方法流程图2为本专利技术的实施例中待分配内存块的结构示意图3为本专利技术的实施例中空闲队列的结构示意图4为本专利技术的实施例中对内存块进行合并操作的方法流程图;图5为本专利技术的实施例中对内存块进行回收操作的方法流程图; 图6为本专利技术的实施例中一种内存管理装置的结构图。具体实施例方式本专利技术的实施例通过对内存请求执行按需分配策略,以提供灵活多变的 内存块尺寸,从而达到了减少内部碎片的目的。同时还提出了释方文内存块延 迟合并的策略,以避免频繁分裂和合并所造成的内存震荡,从而减少系统频 繁进行分裂和合并的开销,以提高系统的性能。为使本专利技术的目的、技术方案和优点更加清楚,下面结合附图对本专利技术 作进一步的详细描述。当进行内存分配时,其核心思想是对内存请求进行按需分配,并将分配 后的内部^e卒片进行拆分,插入到相应大小的内存块空闲队列。该方法的流程 如图1所示步骤101、根据请求的内存块的大小,找到内存块大小为2的i次方个 页面大小的空闲内存块队列。这里的i值要满足2卜1 〈m〈2', m是请求的内存块 的大小。如图2所示,假如要分配9个页面大小的内存块,则找到块长为24(16) 个页面大小的空闲内存块队列。步骤102、判断大小为2的i次方个页面大小的空闲内存块队列中是否 有空闲内存块,有则执行步骤i06;否则执行步骤103。判断24个页面大小的空闲内存块队列是否有空闲内存块。步骤103、将空闲内存块大小的指数标志i递增,即i^+l。该步骤的目 的是分裂更大的内存块,因为大小最合适的空闲内存块不存在,只能从更大 的内存块中分配请求的内存块。步骤104、判断i是否大于Max,所述Max是待分配的最大空闲内存块 的大小值。该步骤用以判定待分裂的更大空闲内存块是否超过最大空闲内存 块值,若i〉Max,则执行步骤105,否则执行步骤102。步骤105、对所有空闲内存块进行清理,并执行步骤101。步骤106、分配大小为2的i次方的空闲内存块,从该内存块的尾部起 分配所述请求的内存页。在图2中,在24个页面大小的空闲内存块队列中取出一个空闲内存块, 将该内存块后半部分的9个页面分配出去。步骤107、回收完成分配的空闲内存块中剩余的内存碎片,将内部碎片 进行拆分并插入到相应大小的空闲内存块队列。拆分插入的原则是从分配 后的内存块首部起向后找到尽可能大的2的幂次方个页面,挂入相应的空闲 内存块队列,然后依次用同样的方法把剩下的空闲页面都分别挂入本文档来自技高网...
【技术保护点】
一种内存的分配方法,在接收到内存请求时,其特征在于,包括以下步骤:从大小最合适的空闲队列为所述内存请求分配内存块,对内存分配时产生的内部碎片进行回收,将所述内部碎片分别插到不同的空闲队列;当最大的空闲内存块也无法满足所述内存请求时,进行内存块合并操作。
【技术特征摘要】
【专利技术属性】
技术研发人员:余鑫,李江雄,
申请(专利权)人:华中科技大学,
类型:发明
国别省市:83[中国|武汉]
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。