CN102880555B - 面向实时系统的内存算法 - Google Patents
面向实时系统的内存算法 Download PDFInfo
- Publication number
- CN102880555B CN102880555B CN201210263549.0A CN201210263549A CN102880555B CN 102880555 B CN102880555 B CN 102880555B CN 201210263549 A CN201210263549 A CN 201210263549A CN 102880555 B CN102880555 B CN 102880555B
- Authority
- CN
- China
- Prior art keywords
- rbtree
- block
- memory
- free
- memory block
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Memory System (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及一种面向实时系统的内存算法,采用红黑树数据结构用于快速查找所需的内存块;该算法定义占用红黑树、空闲红黑树数组、向后合并红黑树、向前合并红黑树,当有内存申请时,从空闲红黑树中获取满足需求的空闲内存块,判断空闲内存块是否需要分割,并作相应处理,然后将空闲内存块加入占用红黑树,分配内存,并维护相关红黑树;当有内存块需要释放时,根据释放内存块首尾地址查询向前、向后合并红黑树,判断是否需要向前、向后合并,并作相应处理,然后将释放内存块加入空闲红黑树,释放内存,并更新相关红黑树。该算法有利于提高内存分配时间效率。
Description
技术领域
本发明涉及一种面向实时系统的内存算法。
背景技术
在实时操作系统中,关于动态内存分配算法与回收算法,研究热点主要集中在如何提高算法的可预测性、提高内存利用率及减少内存碎片方面。传统的按需分配算法使用链表搜索使内存达到了较高的利用率,但是由于其时间效率,时间上存在着不可预测性。伙伴算法是一种“分而治之”的分配算法。伙伴概念的提出使系统的内存分配时间效率达到了,完全符合可预测性的要求,但是由于伙伴的存在导致了内存利用率并不高。
一般而言,分配算法的基本策略可分为:
1、按序分配(SequentialFit)。也称顺序查找法,包括最先匹配,最佳匹配,最差匹配等。
2、分段空闲链表(SegregatedFreeLists)。包括简单分段存储和分段匹配。
3、伙伴系统(BuddySystem)。包括最常见的二分伙伴系统(BianryBuddies),还有weighted,Fibonaccibuddies和Doublebuddies。
4、索引匹配(IndexedFit)。它使用结构索引来执行一个想要的匹配策略。
5、位图匹配(BitmapFit)。一个特殊的索引匹配。
发明内容
本发明的目的在于提供一种面向实时系统的内存算法,该算法有利于提高内存分配时间效率。
本发明采用的技术方案是:一种面向实时系统的内存算法,采用红黑树数据结构用于快速查找所需的内存块;该算法定义以下四类红黑树:
占用红黑树:用于存放被占用的内存块信息,同时将该内存块的内存ID作为比较规则,当程序释放内存时迅速根据内存ID定位到该内存块,释放内存;
空闲红黑树数组:定义到共18棵红黑树,分别对应内存大小标记为1,2,3,4,6,…,,,…,512单位的内存块,每组红黑树以地址为比较规则,存放大小大于等于该组标记但小于下一组标记的内存块信息;
向后合并红黑树:用于在内存回收过程中快速查找到能与释放内存块向后合并的内存块;当有内存释放时,将与释放内存块相邻的下一内存块的首地址作为比较规则,迅速查找出可合并块,并定位到空闲红黑树数组的相应位置进行相关内存合并操作;
向前合并红黑树:用于在内存回收过程中快速查找到能与释放内存块向前合并的内存块;当有内存释放时,将与释放内存块相邻的上一内存块的尾地址作为比较规则,迅速查找出可合并块,并定位到空闲红黑树数组的相应位置进行相关内存合并操作;
当有一个大小为d的内存申请时,按如下方法进行内存分配:
步骤1.1:通过查询的大小域,定位到第一个满足需求d的组,即;从k链表开始,为后面的每一个链表的统计值加1,表明从k链表开始的所有后续链表里的内存块都有能力提供需求为d的内存;由于及后面各组红黑树内的任意一个内存块均大于等于d,可选取该列表中的第一块内存;如果的链表为空,则该内存区间不存在空闲的内存块,继续向后面的红黑树寻找直至找到存在空闲块的组,获取该组的第一块;如果后续组别中均不存在空闲块,返回第一个满足需求d的组的前一个组,该组里的内存块大小在区间内,可能存在满足需求的块;
步骤1.2:获取满足需求的空闲内存块,如果的大小刚好满足需求d,即,该块将被完全占用;如果的大小超出需求d,则判断是否需要分割,如果被分割,将产生大小为的剩余块,判断剩余块大小是否小于限定值,是则将直接完全分配而不做分割,否则将分割,插入相应的空闲组中;
步骤1.3:维护相关红黑树:将满足需求的空闲内存块从、、中删除,并加入;如果有剩余块产生,根据剩余块的大小,加入相应的组内,同时以的首尾地址为比较规则,分别加入和;
当有一个ID为id、大小为d的内存块需要释放时,按如下方法进行内存释放:
步骤2.1:在中查询ID为id的内存块,根据该块的首地址和末尾地址查询和,判断是否存在可与合并的向前合并块、向后合并块或其中之一,如果存在,将合并为新的大内存块,然后插入相关红黑树,如果不存在,则直接将插入相关红黑树;
步骤2.2:更新红黑树:将从中删除;如果存在和或其中之一,将、或其中之一从相应、、中删除,并将合并后的新的大内存块加入相应的、、,如果不存在,则直接将加入相应的、、。
本发明的有益效果是把伙伴算法和最先匹配算法的优点很好的结合在了一起,在搜索策略上使用了红黑树,使得算法在时间效率上实现了较大的改进。特别是在内存释放、合并过程中,通过各自的索引规则,降低了时间复杂度。该算法摒弃了传统的使用链表的习惯,大大的提高了内存块回收速率。同时,算法使用了分组分配,实现了将不同大小的空闲内存块分别放在不同的堆里。这种存放策略实现了当不同大小的内存申请时,没必要再对列表或其他数据结构进行遍历搜索,而只需要定位到相应的组堆里就能快速得到满足需求的内存块,使内存分配效率接近常数时间。
附图说明
图1是本发明实施例的工作原理图。
具体实施方式
本发明面向实时系统的内存算法,如图1所示,在对目标内存块搜索时,不再局限于传统的链表遍历式查找法,而是采用红黑树数据结构用于快速查找所需的内存块,实现内存块在释放、回收过程中具有较高的时间效率。该算法定义以下四类红黑树:
占用红黑树:用于存放被占用的内存块信息,包括大小,物理地址,内存ID等,同时将该内存块的内存ID作为比较规则,当程序释放内存时迅速根据内存ID定位到该内存块,释放内存。
空闲红黑树数组:定义到共18棵红黑树,分别对应内存大小标记为1,2,3,4,6,…,,,…,512单位的内存块,每组红黑树以地址为比较规则,存放大小大于等于该组标记但小于下一组标记的内存块信息。如第5组红黑树的大小标记为8,第6组红黑树的大小标记为12,,,当有大小为10的内存块释放时,将该块存放于第5组里。
向后合并红黑树:该红黑树不同于上述两类红黑树用于表述实际的内存分配、回收的过程,而是用于在内存回收过程中快速查找到能与释放内存块向后合并的内存块;当有内存释放时,将与释放内存块相邻的下一内存块的首地址作为比较规则,迅速查找出可合并块,并定位到空闲红黑树数组的相应位置进行相关内存合并操作。
向前合并红黑树:用于在内存回收过程中快速查找到能与释放内存块向前合并的内存块;当有内存释放时,将与释放内存块相邻的上一内存块的尾地址作为比较规则,迅速查找出可合并块,并定位到空闲红黑树数组的相应位置进行相关内存合并操作。该红黑树工作机理和向后合并红黑树的工作机理类似。但是该红黑树找的是能与释放内存块向前合并的块,即末尾地址和释放内存块相邻,因此该树以上一内存块的尾地址作为比较规则。
该算法引入概率思想——统计域,实现自适应的内存碎片判断机制。统计域的作用机理是:当内存块分割时,根据多余块的大小判读是否有必要分割。该方法根据程序频繁地申请内存、分割内存块,统计各内存组的使用率,认为利用率较低的内存区域为可能产生外部内存碎片的区域,尽量减少该区域块空闲内存块的产生以避免不必要的外部内存碎片的产生。最先匹配算法有一个致命的缺点就是容易产生外部内存碎片,而产生碎片的原因往往是因为由于是最先匹配寻找到第一个满足条件的内存块就直接分配,导致内存的分割往往是整个内存块的前段,而后段的使用频率很低,这样就导致了前段部分积累较多碎片。而使用了统计域,把内存块大小低于某个值得均视为可能产生内存碎片,减少这类空闲内存块的产生。当然,利用率较低并不代表不利用。当有该区域大小的内存需求时,系统可利用该区域已有的内存块,这样不影响其他内存块;如果该区域不存在合适的块,系统就可以从较大的内存块中获取,避免了一段内存块被不断分割成较小内存块而产生的大量碎片积累。同时,加入最大内存碎片,抑制可能产生大块“内存碎片”,以免造成过多浪费。
当有一个大小为d的内存申请时,按如下方法进行内存分配:
步骤1.1:通过查询的大小域,将k定位到第一个满足需求d的组,即;从k链表开始,为后面的每一个链表的统计值加1,表明从k链表开始的所有后续链表里的内存块都有能力提供需求为d的内存,即存在可能被使用的概率;由于及后面各组红黑树内的任意一个内存块均大于等于d,都能满足系统的需求,一般选取该列表中的第一块内存;如果的链表为空,则该内存区间不存在空闲的内存块,无法提供需求,继续向后面的红黑树寻找直至找到存在空闲块的组,获取该组的第一块;如果后续组别中均不存在空闲块,返回第一个满足需求d的组的前一个组,该组里的内存块大小在区间内,可能存在满足需求的块。由于第一个满足需求d的组的预定大小M[n]为大于d,所以第一个组里的所有块是完全满足的,而前一组的里所包含的块的大小是在区间[M[n-1],M[n]]之间的,而d恰好也是满足包含在区间里,因此可能存在相关块满足条件。
步骤1.2:获取满足需求的空闲内存块,如果内存块的大小刚好满足需求d,即,表示该块将被完全占用;如果的大小超出需求d,则必须按照引入的概率统计策略判断是否需要分割,如果被分割,将产生大小为的剩余块,定位该剩余块到相应的组,如果该组的统计数据较小且符合可能形成碎片的大小,则说明大小在该组别设定的内存大小以下的很少被利用,为了减少可能产生的内存碎片,将直接完全分配而不做分割;如果该组被利用的可能性较大或余下的块仍很大,为了提高内存利用率,将分割,插入相应的空闲组中。
步骤1.3:维护相关红黑树:将满足需求的空闲内存块从、、中删除,并加入;如果有剩余块产生,根据剩余块的大小,加入相应的组内,同时以的首尾地址为比较规则,分别加入和。
当有一个ID为id、大小为d的内存块需要释放时,按如下方法进行内存释放:
步骤2.1:在中查询ID为id的内存块,根据该块的首地址和末尾地址查询和,判断是否存在可与合并的向前合并块、向后合并块或其中之一,如果存在,将合并为新的大内存块,然后插入相关红黑树,如果不存在,则直接将插入相关红黑树。
步骤2.2:更新红黑树:将从中删除;如果存在和或其中之一,将、或其中之一从相应、、中删除,并将合并后的新的大内存块加入相应的、、,如果不存在,则直接将加入相应的、、。
本算法把伙伴算法和最先匹配算法的优点很好的结合在了一起。同时,在搜索策略上使用了红黑树,使得算法在时间效率上实现了较大的改进。特别是在内存释放、合并过程中,通过各自的索引规则,使时间复杂度降低到。算法摒弃了传统的使用链表的习惯,大大的提高了内存块回收速率。
同时,算法使用了分组分配,实现了将不同大小的空闲内存块分别放在不同的堆里。这种存放策略实现了当不同大小的内存申请时,没必要再对列表或其他数据结构进行遍历搜索,而只需要定位到相应的组堆里就能快速得到满足需求的内存块,实现内存分配效率达到了接近常数时间。
统计域的利用,使算法实现自适应的内存碎片判断机制,把内存块大小低于某个值得均视为可能产生内存碎片,减少这类空闲内存块的产生。当有该区域大小的内存需求时,系统可利用该区域已有的内存块,这样不影响其他内存块;如果该区域不存在合适的块,系统就可以从较大的内存块中获取,避免了一段内存块被不断分割成较小内存块而产生的大量碎片积累。
本发明为实时系统这种特殊的操作系统提供了一个较为合理的,在时间效率和内存利用率上实现折中的内存管理方案。该算法可以通过替代原有的内存管理方案中的内存管理算法,通过实际系统内对内存的申请、释放,实现算法在系统中的利用。
以上是本发明的较佳实施例,凡依本发明技术方案所作的改变,所产生的功能作用未超出本发明技术方案的范围时,均属于本发明的保护范围。
Claims (1)
1.一种面向实时系统的内存算法,其特征在于:采用红黑树数据结构用于快速查找所需的内存块;该算法定义以下四类红黑树:
占用红黑树Busy_RBTree:用于存放被占用的内存块信息,同时将该内存块的内存ID作为用于查找定位内存块的比较规则,当程序释放内存时迅速根据内存ID定位到该内存块,释放内存;
空闲红黑树数组Free_RBTree[]:定义Free_RBTree[0]到Free_RBTree[17]共18棵红黑树,分别对应内存大小标记为1,2,3,4,6,…,2i,3×2i-1,…,512单位的内存块,每组红黑树以地址为用于查找定位内存块的比较规则,将内存块信息存放于这样一组标记:所述内存块大小大于等于该组标记但小于该组标记的下一组标记;
向后合并红黑树After_Merge_RBTree:用于在内存回收过程中快速查找到能与释放内存块向后合并的内存块;当有内存释放时,将与释放内存块相邻的下一内存块的首地址作为用于查找定位内存块的比较规则,迅速查找出可合并块,并定位到空闲红黑树数组Free_RBTree[]的相应位置进行相关内存合并操作;
向前合并红黑树Pre_Merge_RBTree:用于在内存回收过程中快速查找到能与释放内存块向前合并的内存块;当有内存释放时,将与释放内存块相邻的上一内存块的尾地址作为用于查找定位内存块的比较规则,迅速查找出可合并块,并定位到空闲红黑树数组Free_RBTree[]的相应位置进行相关内存合并操作;
当有一个大小为d的内存申请时,按如下方法进行内存分配:
步骤1.1:通过查询Free_RBTree[]的大小域Size,定位到第一个满足需求d的组Free_RBTree[k],即Free_RBTree[k].Size≥d;从k链表开始,为后面的每一个链表的统计值加1,表明从k链表开始的所有后续链表里的内存块都有能力提供需求为d的内存;由于Free_RBTree[k]及后面各组红黑树内的任意一个内存块均大于等于d,可选取该链表中的第一块内存;如果Free_RBTree[k]的链表为空,则该内存区间不存在空闲的内存块,继续向后面的红黑树寻找直至找到存在空闲块的组,获取该组的第一块;如果后续组别中均不存在空闲块,返回第一个满足需求d的组Free_RBTree[k]的前一个组,该组里的内存块大小在[Free_RBTree[k-1].Size,Free_RBTree[k].Size]区间内,可能存在满足需求的块;
步骤1.2:获取满足需求的空闲内存块free_block,如果free_block的大小刚好满足需求d,即free_block.Size=d,该块将被完全占用;如果free_block的大小超出需求d,则判断free_block是否需要分割,如果free_block被分割,将产生大小为free_block.Size-d的剩余块surplus_block,判断剩余块surplus_block大小是否小于限定值,是则将free_block直接完全分配而不做分割,否则将free_block分割,surplus_block插入相应的空闲组中;
步骤1.3:维护相关红黑树:将满足需求的空闲内存块free_block从Free_RBTree[]、After_Merge_RBTree、Pre_Merge_RBTree中删除,并加入Busy_RBTree;如果有剩余块surplus_block产生,根据剩余块surplus_block的大小,加入相应的Free_RBTree[]组内,同时以surplus_block的首尾地址为用于查找定位内存块的比较规则,分别加入Pre_Merge_RBTree和After_Merge_RBTree;
当有一个ID为id、大小为d的内存块Release_block需要释放时,按如下方法进行内存释放:
步骤2.1:在Busy_RBTree中查询ID为id的内存块Release_block,根据该块的首地址和末尾地址查询Pre_Merge_RBTree和After_Merge_RBTree,判断是否存在可与Release_block合并的向前合并块pre_block、向后合并块after_block或其中之一,如果存在,将Release_block合并为新的大内存块,然后插入相关红黑树,如果不存在,则直接将Release_block插入相关红黑树;
步骤2.2:更新红黑树:将Release_block从Busy_RBTree中删除;如果存在pre_block和after_block或其中之一,将pre_block、after_block或其中之一从相应Free_RBTree[]、After_Merge_RBTree、Pre_Merge_RBTree中删除,并将合并后的新的大内存块加入相应的Free_RBTree[]、After_Merge_RBTree、Pre_Merge_RBTree,如果不存在,则直接将Release_block加入相应的Free_RBTree[]、After_Merge_RBTree、Pre_Merge_RBTree。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210263549.0A CN102880555B (zh) | 2012-07-28 | 2012-07-28 | 面向实时系统的内存算法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210263549.0A CN102880555B (zh) | 2012-07-28 | 2012-07-28 | 面向实时系统的内存算法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102880555A CN102880555A (zh) | 2013-01-16 |
CN102880555B true CN102880555B (zh) | 2016-02-24 |
Family
ID=47481889
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210263549.0A Expired - Fee Related CN102880555B (zh) | 2012-07-28 | 2012-07-28 | 面向实时系统的内存算法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102880555B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104008061B (zh) * | 2013-02-22 | 2018-01-23 | 华为技术有限公司 | 内存回收方法及装置 |
CN103970678B (zh) * | 2014-04-21 | 2017-01-25 | 华为技术有限公司 | 目录设计方法及装置 |
CN104035822A (zh) * | 2014-05-28 | 2014-09-10 | 中国科学院计算技术研究所 | 一种低开销的高效内存去冗余方法及系统 |
CN104036141B (zh) * | 2014-06-16 | 2017-02-15 | 上海大学 | 一种基于OpenCL的红黑树加速方法 |
CN105843750A (zh) * | 2016-03-22 | 2016-08-10 | 深圳森格瑞通信有限公司 | 一种提升线性数据结构查询效率的方法 |
CN110209595A (zh) * | 2018-02-28 | 2019-09-06 | 贵州白山云科技股份有限公司 | 一种用于管理内存页的方法及装置 |
CN110209489B (zh) * | 2018-02-28 | 2020-07-31 | 贵州白山云科技股份有限公司 | 一种适用于内存页结构的内存管理方法及装置 |
CN110309137A (zh) * | 2018-02-28 | 2019-10-08 | 贵州白山云科技股份有限公司 | 一种数据管理方法及装置 |
CN109375985B (zh) * | 2018-09-06 | 2021-04-06 | 新华三技术有限公司成都分公司 | 内存动态管理方法及装置 |
CN111241004A (zh) * | 2019-12-30 | 2020-06-05 | 苏州凯毅斯智能驱动技术有限公司 | 电动摩托车用嵌入式软件内存分配算法 |
CN113504994B (zh) * | 2021-07-26 | 2022-05-10 | 上海遁一信息科技有限公司 | 一种内存池性能弹性伸缩的实现方法及系统 |
CN114327917A (zh) * | 2022-03-11 | 2022-04-12 | 武汉深之度科技有限公司 | 内存管理方法、计算设备及可读存储介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7069272B2 (en) * | 2002-10-09 | 2006-06-27 | Blackrock Financial Management, Inc. | System and method for implementing dynamic set operations on data stored in a sorted array |
CN102369520A (zh) * | 2011-09-02 | 2012-03-07 | 华为技术有限公司 | 虚拟内存区域的查询、遍历方法及装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6912622B2 (en) * | 2002-04-15 | 2005-06-28 | Microsoft Corporation | Multi-level cache architecture and cache management method for peer-to-peer name resolution protocol |
-
2012
- 2012-07-28 CN CN201210263549.0A patent/CN102880555B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7069272B2 (en) * | 2002-10-09 | 2006-06-27 | Blackrock Financial Management, Inc. | System and method for implementing dynamic set operations on data stored in a sorted array |
CN102369520A (zh) * | 2011-09-02 | 2012-03-07 | 华为技术有限公司 | 虚拟内存区域的查询、遍历方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102880555A (zh) | 2013-01-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102880555B (zh) | 面向实时系统的内存算法 | |
CN109377232B (zh) | 基于dag的区块链的交易定序方法及设备 | |
CN109753531A (zh) | 一种大数据统计方法、系统、计算机设备及存储介质 | |
CN102033732B (zh) | 基于fpga的高速低延迟浮点累加器及其实现方法 | |
CN104731799B (zh) | 内存数据库管理装置 | |
CN106445413A (zh) | 集群系统中数据处理方法及装置 | |
CN100445999C (zh) | 一种数据存储及搜索方法 | |
US10216626B2 (en) | Parallel garbage collection implemented in hardware | |
CN102254024A (zh) | 海量数据处理系统及方法 | |
CN103425435B (zh) | 磁盘存储方法及磁盘存储系统 | |
CN104238962A (zh) | 向缓存中写入数据的方法及装置 | |
CN106156070A (zh) | 一种查询方法、文件合并方法与相关装置 | |
CN104077385A (zh) | 一种文件的分类及检索方法 | |
CN110941619A (zh) | 针对多种使用场景的图数据存储模型和结构的定义方法 | |
CN105589908A (zh) | 用于事务集合的关联规则计算方法 | |
CN103559017A (zh) | 基于gpu异构计算平台的字符串匹配方法及系统 | |
CN105701128B (zh) | 一种查询语句的优化方法和装置 | |
CN103049561B (zh) | 一种数据压缩方法、存储引擎及存储系统 | |
CN104156395A (zh) | 数据存储系统 | |
CN109544344B (zh) | 基于dag的区块链的交易处理方法及设备 | |
KR20160081231A (ko) | 이미지 기반 검색을 위한 맵리듀스 기반의 이미지 특징 추출 방법 및 시스템 | |
CN107169097A (zh) | 一种Spark Broadcasthashjoin操作的改进方法 | |
CN104125147A (zh) | 实现下一跳的配置数据分离的方法 | |
CN104462280A (zh) | 用于嵌入式系统的数据信息存储及快速查询方法 | |
CN105117169B (zh) | 一种优化的磁盘空间管理的方法及装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20160224 Termination date: 20180728 |