一种嵌入式系统内存管理方法,可解决嵌入式系统应用中申请大量小片内存导致内存碎片化和申请效率降低下的问题。包括如下步骤:集中申请、集中释放;通过配置生成一个内存缓冲池,防止管理结构直接从动态内存中去申请小块内存;对批量内存池采用队列化的管理;对程序异常导致的内存坏块做了容错处理,对被破坏的内存块进行隔离。通过本发明专利技术可以有效克服传统的内存方法无法避免的内存碎片和内存申请效率问题,具有很好的容错性能,使得程序的运行更加健壮稳定。
【技术实现步骤摘要】
一种嵌入式系统内存管理方法
本专利技术涉及嵌入式操作系统的内存管理
,具体涉及一种嵌入式系统内存管理方法。
技术介绍
对于嵌入式系统中常见的实地址模式(实际的地址和物理地址是一一对应的关系)下的内存管理目前有很多方法,常见内存分配方法及优缺点如下:(1)首次适应方法。VxWorks操作系统采用这种分配方法。使用该方法进行内存分配时,从空闲分区链首开始查找,直至找到一个能满足其大小需求的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分配给请求者,余下的空闲分区仍留在空闲分区链中。该方法倾向于使用内存中低地址部分的空闲分区,在高地址部分的空闲分区非常少被利用,从而保留了高地址部分的大空闲区。显然为以后到达的大作业分配大的内存空间创造了条件。缺点在于低址部分不断被划分,留下许多难以利用、非常小的空闲区,而每次查找又都从低址部分开始,这无疑会增加查找的开销。同时还会造成内存碎片化的问题。(2)循环首次适应方法。该方法是由首次适应方法演变而成的。在为进程分配内存空间时,不再每次从链首开始查找,而是从上次找到的空闲分区开始查找,直至找到一个能满足需求的空闲分区,并从中划出一块来分给作业。该方法能使空闲中的内存分区分布得更加均匀,但将会缺乏大的空闲分区。(3)最佳适应方法。该方法总是把既能满足需求,又是最小的空闲分区分配给作业。为了加速查找,该方法需求将所有的空闲区按其大小排序后,以递增顺序形成一个空白链。这样每次找到的第一个满足需求的空闲区,必然是最优的。孤立地看,该方法似乎是最优的,但事实上并不一定。因为每次分配后剩余的空间一定是最小的,在存储器中将留下许多难以利用的小空闲区。同时每次分配后必须重新排序,这也带来了一定的开销。(4)最差适应方法。最差适应方法中,该方法按大小递减的顺序形成空闲区链,分配时直接从空闲区链的第一个空闲分区中分配(不能满足需要则不分配)。非常显然,如果第一个空闲分区不能满足,那么再没有空闲分区能满足需要。这种分配方法初看起来不太合理,但他也有非常强的直观吸引力:在大空闲区中放入程式后,剩下的空闲区常常也非常大,于是还能装下一个较大的新程式。最坏适应方法和最佳适应方法的排序正好相反,他的队列指针总是指向最大的空闲区,在进行分配时,总是从最大的空闲区开始查寻。该方法克服了最佳适应方法留下的许多小的碎片的不足,但保留大的空闲区的可能性减小了,而且空闲区回收也和最佳适应方法相同复杂。嵌入式路由器设备中协议栈(如DHCP、RSVP、LDP等),在大量、多种路由产生和震荡的时候瞬间需要申请、释放大量的大小相等的小片内存,申请的数量随着时间的变化很不稳定,这种情况下申请内存的特点是不定期的申请和释放小片内存,由于一个系统中除了有这种方式的申请内存外还有其它的进程也要申请内存,这样就会很容易形成内存碎片,一般情况下操作系统都会维护一个空闲内存链表,随着碎片的增加,链的长度也会增加,每申请一块内存就会遍历一次空闲内存链表,链的长度越长申请内存的效率越低下,碎片多到一定程度时会使整个内存碎片化从而导致申请大块的内存失败的情况,而上述几种常见的内存管理方法都不能解决这个问题,需要提出一种新的内存分配策略。
技术实现思路
本专利技术提出的一种嵌入式系统内存管理方法,可解决嵌入式系统应用中申请大量小片内存导致内存碎片化和申请效率降低下的问题。为实现上述目的,本专利技术采用了以下技术方案:一种嵌入式系统内存管理方法,包括提供了一个内存批量申请结构的索引,用来索引多个协议的多种批量内存申请应用。该索引给各种批量内存申请应用分配一个索引号,然后记录批量内存管理结构的入口地址。当某个协议进程需要申请内存时就根据索引号找到对应的批量内存管理结构入口地址来申请内存。批量内存管理结构每次获取一批固定大小的内存提供给协议进程使用,这一批内存都被空闲才一起释放,体现了集中申请集中释放的思想。同时为了防止各个协议进程的内存批量申请结构直接到大块内存中去申请,本专利技术提供了一个批量内存大池,称之为BLOCK,初始化的时候静态的申请一大块地址连续的内存(为N个BLOCK的大小,N根据实际情况确定),专门供批量内存申请使用,当静态的内存使用完了才会从动态内存中去申请一个BLOCK。这样相当于在批量内存申请管理结构和动态内存之间作了一个缓冲。所有的批量内存申请应用都从这个内存池中申请所需的一批内存,我们称这一批内存为POOL,POOL是一块地址连续的内存,POOL切分成一定数量的小片内存,这些小片内存称作UINT,UINT是批量内存申请的最小单元。在内存批量申请结构索引中记录了批量内存管理结构的入口地址,该地址指向一个批量内存管理结构。批量内存管理结构管理着某一种类型的批量内存的申请、释放、统计等。批量内存管理结构采用队列化管理,它从BLOCK中获取一个POOL,挂在管理结构的相应队列中,协议应用进程从管理结构的相应队列中获取想要的小片内存。批量内存管理结构通过三个链式队列来管理POOL,根据POOL的三种状态,即空状态、满状态和半满状态(可用状态),用上述三个队列管理起来。申请UINT总是从挂载可用POOL的队列中去申请;申请UNIT导致整个POOL满了,将整个POOL剔除出来挂载到满队列中,确保申请UINT能在第一时间申请到,而无需遍历队列操作;释放UINT导致整个POOL空了就将整个POOL挂载到空队列中去,然后根据一定的策略释放到BLOCK中去。同样BLOCK如果是从动态内存中扩展进来的,当它不再被使用的时候就会释放到动态内存中去。应用模块初始使用的时候会注册一个内存批量申请结构索引,并初始化对应的内存批量申请结构,初始状态下,对应的内存批量申请结构管理一定数量的BLOCK,BLOCK的初始数量一般视情况而定,以正常使用时内存能够保证为前提,突发情况震荡时,内存批量申请结构再从动态内存中扩展,从而能够提高效率和减少碎片化。应用模块使用中如果出现某些异常情况导致某一块或者某几块小片内存被破坏,此时申请或释放这块内存时,会校验内存片是否出现了错误,如果有错误则将其进行隔离,避免出现申请不到内存的现象。由于采用了循环队列方式管理小片内存,对坏块的隔离非常方便,只要将指向该小片的指针置为NULL,下次申请到这块内存的时候直接跳过,寻找下一个可用内存,因此实现了坏块隔离,被隔离的内存并不会永远处于隔离状态,当整个POOL都处于空闲状态时,会将整个POOL连同隔离块一起释放。具体本专利技术的技术方案包括:一种嵌入式系统内存管理方法,包括如下步骤:步骤1:集中申请、集中释放;每次集中申请一个批量的大小相等的小片内存给协议进程使用,同样,协议进程需要释放内存时也是一个批量集中释放回动态内存,同时通过建立一个索引号与管理结构一一对应的索引表的方式实现多个协议进程能够同时批量申请内存;步骤2:通过配置生成一个内存缓冲池,防止管理结构直接从动态内存中去申请小块内存;而小块的内存是导致内存碎片的根源。因此建立内存缓冲池可以极大的减少碎片的产生。步骤3:对批量内存池采用队列化的管理;能够提高申请释放内存的速度,同时减少从内存缓冲池中频繁申请释放批量内存池的机会,进一步的提高了内存的使用效率。步骤4:对程序异常导致的内存坏块做容错处理,对被破坏的内本文档来自技高网...
【技术保护点】
一种嵌入式系统内存管理方法,其特征在于:包括如下步骤:步骤1:集中申请、集中释放;每次集中申请一个批量的大小相等的小片内存给协议进程使用,同样,协议进程需要释放内存时也是一个批量集中释放回动态内存,同时通过建立一个索引号与管理结构一一对应的索引表的方式实现多个协议进程能够同时批量申请内存;步骤2:通过配置生成一个内存缓冲池,防止管理结构直接从动态内存中去申请小块内存;步骤3:对批量内存池采用队列化的管理;步骤4:对程序异常导致的内存坏块做容错处理,对被破坏的内存块进行隔离,避免错误的内存影响正常的内存申请和释放,被隔离的坏块最终能够被释放会缓冲池,继续利用。
【技术特征摘要】
1.一种嵌入式系统内存管理方法,其特征在于:包括如下步骤:步骤1:集中申请、集中释放;每次集中申请一个批量的大小相等的小片内存给协议进程使用,同样,协议进程需要释放内存时也是一个批量集中释放回动态内存,同时通过建立一个索引号与管理结构一一对应的索引表的方式实现多个协议进程能够同时批量申请内存;步骤2:通过配置生成一个内存缓冲池,防止管理结构直接从动态内存中去申请小块内存;步骤3:对批量内存池采用队列化的管理;步骤4:对程序异常导致的内存坏块做容错处理,对被破坏的内存块进行隔离,避免错误的内存影响正常的内存申请和释放,被隔离的坏块最终能够被释放会缓冲池,继续利用。2.根据权利要求1所述的嵌入式系统内存管理方法,其特征在于:所述步骤1还包括:步骤11:根据各个业务内存使用大小类和数量别初始化批量内存管理索引结构;步骤12:批量内存管理索引结构下初始化定制大小的内存块,内存块的大小可以根据实际使用需求确定,通过初始化参数传入。3.根据权利要求2所述的嵌入式系统内存管理方法,...
【专利技术属性】
技术研发人员:刘东栋,
申请(专利权)人:安徽皖通邮电股份有限公司,
类型:发明
国别省市:安徽,34
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。