一种用于嵌入式系统的内存控制方法技术方案

技术编号:8300782 阅读:256 留言:0更新日期:2013-02-07 04:10
本发明专利技术提供一种用于嵌入式系统的内存控制方法,从操作系统中申请一块内存,内存的一部分作为内存池,另一部分作为预留内存区域;内存池采用池式管理,结合线程缓存技术,为每个线程建立一个缓存;预留内存区域采用TLSF算法管理;将该内存池切割成不同大小的内存块,同等大小的内存块连成双向链表,为每个内存块增加一个内存管理单元,内存管理单元和内存块分别放在不同的内存区域;为每一个线程建立一个内存统计链表,用于连接所有此线程申请的内存块,为方便内存泄露排查。另外,在不增加内存控制方法开销的前提下,增加了内存覆盖检查机制。

【技术实现步骤摘要】

本专利技术涉及嵌入式系统
,尤其是涉及嵌入式系统的内存控制方法。
技术介绍
嵌入式系统的内存资源相当有限,故需要对其进行合理的规划和管理。内存是系统中所有线程运行的基础,是嵌入式系统最重要的系统资源。简单、高效的内存组织和管理,是系统稳定、高速运行的保证。嵌入式系统对内存分配要求达到快速性、可靠性和高效性。一种常见的管理方式就是内存池方式。其实现机制是一次性将后续所有应用程序需要使用的内存全部申请下来,切割成各种固定大小的不同数量的内存块,按照一定的数据结构形成内存池,然后按需进行二次分配。设计内存池的目的是为了保证服务器长时间高效的运行,通过对申请空间小而申请频繁的对象进行有效管理,减少内存碎片的产生,合理分配管理用户内存,从而减少系统中出现有效空间足够,而无法分配大块内存的情况。而且内存池实现简单,分配和回收较快。但是内存池也是存在一定缺点的,所有的进程共享同一个内存池,多个进程的多个任务都在分配释放内存块时会竞争同一个锁,锁的开销会大大降低内存管理方式的效率。另外,内存池的控制信息和应用层的内存块连续存放,一旦发生应用程序内存覆盖的误操作,往往会覆盖内存块的控制信息,有可能会导致包括系统崩溃在内的严重后果。此外,C代码中指针的应用会带来内存越界的隐患,经常出现某段内存的内容被修改而导致系统运行异常,可出现异常时只是犯罪现场,无法定位出是谁修改了这段内存。对这些情况,通常的做法,只能是审查代码,凭经验找出可能出错的代码,进行大量的分析试验,才能找到真凶。
技术实现思路
本专利技术提出了一种内存控制方法,其目的在于增加内存覆盖检查机制,提高内存使用效率,减少应用程序内存覆盖的概率。本专利技术的技术方案为,从操作系统中申请一块内存,内存的一部分作为内存池,另一部分作为预留内存区域;内存池采用池式管理,为每个线程配置一个线程缓存;预留内存区域采用TLSF算法管理; 进行内存初始化操作时,执行以下步骤, 步骤I. 1,初始化内存池,包括将内存池切割成不同大小的内存块,为同等大小的内存块维护一个内存管理头结构;为每个内存块分配一个内存管理单元; 步骤I. 2,初始化预留内存区域,包括按照TLSF算法的数据结构组织预留内存区域,并维护两个内存管理头结构,一个用来管理小内存块,另一个用来管理大内存块,小内存块和大内存块根据预设参数划分;·步骤I. 3,初始化各线程缓存的内存管理头结构,为任一线程申请的内存中同等大小的内存块维护一个内存管理头结构; 步骤I. 4,初始化每个线程的一个内存统计链表,所述内存统计链表是用于连接任一线程申请的所有内存块; 内存池、预留内存区域和各线程缓存的内存管理头结构均包括空闲内存块的个数、已使用内存块的个数、空闲链表、已使用链表和互斥锁;内存池和预留内存区域的各内存块的内存管理单元的域包括内存池双向链表、线程缓存链表、内存块状态、线程使用内存统计链表、内存管理参数和指向内存块的指针,内存管理参数包括内存块的大小size,所述内存池双向链表为空闲链表或已使用链表;预留内存区域中,用来管理小内存块的内存管理头结构中已使用链表称为小内存链表,预留内存区域中,用来管理大内存块的内存管理头结构中已使用链表称为大内存链表; 进行内存分配操作时,执行以下步骤, 步骤2. 1,根据应用程序申请的内存大小,向上调整到内存池中切割内存块的大小,记为目标size ;查看线程缓存对应大小内存块的空闲链表中是否是合适的内存块, 如果有,将内存块从线程缓存的空闲链表中删除,挂在线程缓存的已使用链表中,并更新该内存块的内存管理单元的相关信息,包括状态更新为已使用,并标记为从内存池中分配,返回内存块的首地址,将此内存块加入到线程的内存统计链表中,完成分配; 否则,进入步骤2. 2; 步骤2. 2,查看内存池中是否有目标size的空闲内存块, 如果有,将空闲的内存块从内存池的空闲链表中移除,挂在内存池的使用链表中,并更新内存管理单元的相关信息,包括状态更新为已使用,并标记为从内存池中分配,返回内存块首地址,将此内存块加入到线程的内存统计链表中,完成分配; 否则,进入步骤2. 3; 步骤2. 3,查找比目标size大一个size的内存块, 如果有,将空闲内存块从内存池的空闲链表中移除,挂在内存池的使用链表中,并更新内存管理单元的相关信息,尤其是状态更新为已使用,并标记为从内存池中分配,返回内存块首地址,将此内存块加入到线程的内存统计链表中,完成分配; 否则,根据应用程序申请的内存大小从预留内存区域中申请内存块,并分配相应的内存管理单元;设置内存管理单元的相关信息,包括状态为已使用,并标记为从预留内存区域中分配;返回内存块首地址,将此内存块加入到线程的内存统计链表中;根据应用程序申请的内存大小和预设参数,确定申请的内存块是小内存块还是大内存块;如果申请的是小内存块,将申请的内存块挂到小内存链表中,并更新哈希表的信息,将此内存块插入到二级哈希结构中,完成分配;如果申请的是大内存块,将申请的内存块挂到大内存链表中; 进行内存释放操作时,执行以下步骤, 步骤3. 1,由输入地址找到对应的内存管理单元; 步骤3. 2,根据内存管理单元中的内存块状态域来判断, 如果是从内存中的内存池申请的,转入步骤3. 3 ; 如果是从预留内存区域分配的,将内存管理单元从预留内存区域的对应内存管理头结构的已使用链表中删除,将内存块从线程的内存统计链表中删除,如果是小内存块则更新哈希查找结构的信息;并采用TLSF算法的free函数释放内存块和相应内存管理单元,完成释放; 步骤3. 3,将内存管理单元从内存池的使用链表中移除,挂到线程缓存的空闲链表中,并更新状态域为空闲状态,将此内存块从线程的内存统计链表中删除,完成释放; 步骤3. 4,检查线程缓存中空闲内存块数目与使用内存块数目的比值, 如果小于一定阈值,则将内存管理单元从线程缓存的使用链表中移除,挂到线程缓存的空闲链表中,并更新状态域为空闲状态,将此内存块从线程的内存统计链表中删除,完成释放; 否则,将内存管理单元从线程缓存的使用链表中移除,挂到内存池的空闲链表中,并更新状态域为空闲状态,将此内存块从线程的内存统计链表中删除,完成释放。而且,进行内存覆盖检查时,对要定位的内存块执行以下步骤, 步骤4. 1,根据输入地址判断该内存块是在内存池中还是预留内存区域中, 如果是在内存池中,则先定位该内存块位于哪个size内存块的范围,然后取模运行定位内存边界; 如果是在预留内存区域中,则转入步骤4. 2 ; 步骤4. 2,遍历大内存链表查找该内存块, 如果查找到则得到内存边界, 否则,采用二级哈希算法来定位内存边界。而且,内存池中,内存管理单元和内存块分别放在不同的内存区域;预留内存区域中,内存管理单元和内存块分别放在不同的内存区域。本专利技术的创新点在于 1.为每个内存块增加一个内存管理单元,在管理单元中增加了容错信息,记录所有与内存分配、回收以及内存块状态的信息,实现内存使用状态监控、内存泄露探测等功能; 2.将数据段和管理单元的内存分离,以防止内存小范围越界,影响内存管理单元; 3.将内存池与线程缓存技术结合,并启动主动回收本文档来自技高网...

【技术保护点】
一种用于嵌入式系统的内存控制方法,其特征在于:从操作系统中申请一块内存,内存的一部分作为内存池,另一部分作为预留内存区域;内存池采用池式管理,为每个线程配置一个线程缓存;预留内存区域采用TLSF算法管理;进行内存初始化操作时,执行以下步骤,步骤1.1,初始化内存池,包括将内存池切割成不同大小的内存块,为同等大小的内存块维护一个内存管理头结构;为每个内存块分配一个内存管理单元;步骤1.2,初始化预留内存区域,包括按照TLSF算法的数据结构组织预留内存区域,并维护两个内存管理头结构,一个用来管理小内存块,另一个用来管理大内存块,小内存块和大内存块根据预设参数划分;?步骤1.3,初始化各线程缓存的内存管理头结构,为任一线程申请的内存中同等大小的内存块维护一个内存管理头结构;步骤1.4,初始化每个线程的一个内存统计链表,所述内存统计链表是用于连接任一线程申请的所有内存块;?内存池、预留内存区域和各线程缓存的内存管理头结构均包括空闲内存块的个数、已使用内存块的个数、空闲链表、已使用链表和互斥锁;内存池和预留内存区域的各内存块的内存管理单元的域包括内存池双向链表、线程缓存链表、内存块状态、线程使用内存统计链表、内存管理参数和指向内存块的指针,内存管理参数包括内存块的大小size,所述内存池双向链表为空闲链表或已使用链表;预留内存区域中,用来管理小内存块的内存管理头结构中已使用链表称为小内存链表,预留内存区域中,用来管理大内存块的内存管理头结构中已使用链表称为大内存链表;进行内存分配操作时,执行以下步骤,步骤2.1,根据应用程序申请的内存大小,向上调整到内存池中切割内存块的大小,记为目标size;查看线程缓存对应大小内存块的空闲链表中是否是合适的内存块,如果有,将内存块从线程缓存的空闲链表中删除,挂在线程缓存的已使用链表中,并更新该内存块的内存管理单元的相关信息,包括状态更新为已使用,并标记为从内存池中分配,返回内存块的首地址,将此内存块加入到线程的内存统计链表中,完成分配;否则,进入步骤2.2;步骤2.2,查看内存池中是否有目标size的空闲内存块,如果有,将空闲的内存块从内存池的空闲链表中移除,挂在内存池的使用链表中,并更新内存管理单元的相关信息,包括状态更新为已使用,并标记为从内存池中分配,返回内存块首地址,将此内存块加入到线程的内存统计链表中,完成分配;否则,进入步骤2.3;步骤2.3,查找比目标size大一个size的内存块,?如果有,将空闲内存块从内存池的空闲链表中移除,挂在内存池的使用链表中,并更新内存管理单元的相关信息,尤其是状态更新为已使用,并标记为从内存池中分配,返回内存块首地址,将此内存块加入到线程的内存统计链表中,完成分配;否则,根据应用程序申请的内存大小从预留内存区域中申请内存块,并分配相应的内存管理单元;设置内存管理单元的相关信息,包括状态为已使用,并标记为从预留内存区域中分配;返回内存块首地址,将此内存块加入到线程的内存统计链表中;根据应用程序申请的内存大小和预设参数,确定申请的内存块是小内存块还是大内存块;如果申请的是小内存块,将申请的内存块挂到小内存链表中,并更新哈希表的信息,将此内存块插入到二级哈希结构中,完成分配;如果申请的是大内存块,将申请的内存块挂到大内存链表中;进行内存释放操作时,执行以下步骤,步骤3.1,由输入地址找到对应的内存管理单元;步骤3.2,根据内存管理单元中的内存块状态域来判断,如果是从内存中的内存池申请的,转入步骤3.3;如果是从预留内存区域分配的,将内存管理单元从预留内存区域的对应内存管理头结构的已使用链表中删除,将内存块从线程的内存统计链表中删除,如果是小内存块则更新哈希查找结构的信息;并采用TLSF算法的free函数释放内存块和相应内存管理单元,完成释放;步骤3.3,将内存管理单元从内存池的使用链表中移除,挂到线程缓存的空闲链表中,并更新状态域为空闲状态,将此内存块从线程的内存统计链表中删除,完成释放;步骤3.4,检查线程缓存中空闲内存块数目与使用内存块数目的比值,如果小于一定阈值,则将内存管理单元从线程缓存的使用链表中移除,挂到线程缓存的空闲链表中,并更新状态域为空闲状态,将此内存块从线程的内存统计链表中删除,完成释放;否则,将内存管理单元从线程缓存的使用链表中移除,挂到内存池的空闲链表中,并更新状态域为空闲状态,将此内存块从线程的内存统计链表中删除,完成释放。...

【技术特征摘要】

【专利技术属性】
技术研发人员:陶琴王凌斐
申请(专利权)人:武汉邮电科学研究院
类型:发明
国别省市:

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

1