G06F11/07
1.一种嵌入式系统中内存泄漏诊断处理的方法,其特征在于:该方法包括以下 步骤,
S1,将内存划分成大小不同的内存块,每个内存块等分成多个子内存,内存 块i的子内存大小定义为S i,i=1,2,3,…,M,且S 1
S2,根据应用程序申请内存的大小S,申请一个大于等于S的子内存S i,并 将该子内存节点添加到申请链表中;
S3,应用程序用完内存后,释放该子内存,删除申请表链中的该子内存节点;
S4,以固定周期扫描申请链表上的所有子内存节点,当一个子内存占用时间 超过内存生命周期时,通知应用程序进行处理。
2.如权利要求1所述的嵌入式系统中内存泄漏诊断处理的方法,其特征在于: 所述步骤S2中应用程序初步申请内存的步骤包括,
S210,从子内存最小的内存块i=1开始检索,依次从小到大检索内存块;
S211,判断内存块中剩余内存个数P i是否大于零,若是则跳转到步骤S212, 若否则i=i+1,判断i是否大于M,如果i大于M,申请内存失败,如果i不 大于M,则转到步骤S211;
S212,判断应用申请内存的大小S是否小于等于子内存大小S i,若是则申请 内存成功,若否则i=i+1,判断i是否大于M,如果i大于M,申请内存失败, 如果i不大于M,则转到步骤S211。
3.如权利要求2所述的嵌入式系统中内存泄漏诊断处理的方法,其特征在于: 所述步骤S211或步骤S212中的申请内存失败进入深度申请内存步骤,
S220,检索申请链表中的所有子内存节点,将子内存大小S i大于申请内存大 小S且子内存占用优先级小于申请内存优先级的子内存节点检索出来,检索 成功转到步骤S221,检索失败则申请内存失败;
S221,将检索结果中优先级最低且内存最小的子内存定义为备用子内存;
S222,释放备用子内存给当前申请的应用程序使用,申请内存成功。
4.如权利要求3所述的嵌入式系统中内存泄漏诊断处理的方法,其特征在于: 所述步骤S221中,如果检索结果中优先级最低且内存最小的子内存大于一 个,则将占用时间长度最长的子内存定义为备用子内存。
5.如权利要求1所述的嵌入式系统中内存泄漏诊断处理的方法,其特征在于: 所述步骤S4中通知应用程序进行处理包括延长内存生命周期,或者更改内 存占用优先级,或者直接释放内存,或者应用程序内存泄漏自动释放内存。
6.一种嵌入式系统中内存泄漏诊断处理的装置,其特征在于:它包括,
内存分配管理单元,用于将内存划分成大小不同的内存块,每个内存块等分 成多个子内存,内存块i的子内存大小定义为S i,i=1,2,3,…,M,且 S 1
内存申请单元,用于根据应用程序申请内存的大小S,申请一个大于等于S 的子内存S i,并将该子内存节点添加到申请链表中;
内存释放单元,用于应用程序用完内存后,释放该子内存,删除申请表链中 的该子内存节点;
内存诊断单元,用于以固定周期扫描申请链表上的所有子内存节点,当一个 子内存占用时间超过内存生命周期时,通知应用程序进行处理。
7.如权利要求6所述的嵌入式系统中内存泄漏诊断处理的装置,其特征在于: 所述内存申请单元包括初步申请内存单元和深度申请内存单元。
8.如权利要求7所述的嵌入式系统中内存泄漏诊断处理的装置,其特征在于: 所述初步申请内存单元用于从内存块中剩余未使用子内存中申请一个大于 等于S的子内存。
9.如权利要求7所述的嵌入式系统中内存泄漏诊断处理的装置,其特征在于: 所述深度申请内存单元,在初步申请单元中申请失败后,从申请链表中将子 内存大小S i大于申请内存大小S且子内存占用优先级小于申请内存优先级的 子内存节点检索出来后,查优先级最低且内存最小的子内存,将该子内存 释放给当前申请的应用程序使用。
10.如权利要求9所述的嵌入式系统中内存泄漏诊断处理的装置,其特征在 于:所述优先级最低且内存最小的子内存大于一个,则将其中占用时间长度 最长的子内存释放给当前申请的应用程序使用。
11.如权利要求6所述的嵌入式系统中内存泄漏诊断处理的装置,其特征在 于:所述通知应用程序进行处理包括延长内存生命周期,或者更改内存占用 优先级,或者直接释放内存,或者应用程序内存泄漏自动释放内存。
本发明属于计算机技术应用领域,具体涉及一种嵌入式系统中内存泄漏诊 断处理的方法和装置。
嵌入式系统是一种资源比较受限的系统,因此如何高效复用有限的系统资 源,特别是如何利用好有限的内存资源,发挥最大运行效率,成为嵌入式系统 性能的关键问题。
嵌入式系统中,大多数方案采用动态内存管理方式,而所谓的动态内存也 就是及时申请内存,用完及时释放内存,而在这个过程中经常出现程序bug或 者人员疏忽,导致内存无法释放,出现内存泄漏问题,随着系统长时间运行, 内存越用越少,最后无内存可用,程序最终会因为没有足够内存空间而无法正 常运行,导致系统奔溃死机,后果非常严重。因此,如何自动有效地准确检测 内存泄漏并合理释放内存是一个亟待解决的棘手难题。
以往,传统的内存泄漏检测及处理方法,一是在调试或者测试阶段,使用 自动测试软件通过对内存进行插桩,内存使用情况被记录到自动测试软件的数 据库中,事后人为分析判断是否存在内存泄漏,并通过人工检查方式对内存泄 漏位置进行定位;二是判断应用程序所占用的内存时间是否超过预先设定的内 存生命周期,当超过生命周期时,判断为发生内存泄漏,并简单粗暴地强制释 放内存。参考专利文献CN101414272B公开了一种内存泄漏的检测方法和装置, 通过被检测内存的当前被占用时间是否超过预先为被检测内存设置的生命周 期,以及被检测内存是否正在被申请被检测内存的业务进程所使用,判断被测 内存是否发生泄漏。
传统的内存泄漏检测及处理方法过于简单,比较机械,实时性不够,处理 方法不够灵活恰当,在实际应用中效果差强人意。且存在很多缺点:一是采用 插桩方式,只能在调试或者测试阶段进行,无法在系统正式部署运行期间进行 内存泄漏检测,实时性不够;二是采用插桩方式,需要人为分析判断是否有内 存泄漏,并人为检查定位内存泄漏位置,大量内存申请和释放过程,导致排查 工作量大,难度高,效率低;三是通过内存的生命周期简单判断为内存泄漏, 存在误判情况;四是简单粗暴地强制释放内存,可能导致关键功能失效异常, 影响用户正常使用。
针对传统的内存泄漏检测处理方法存在的不足之处,本发明提出了一种嵌 入式系统中内存泄漏诊断处理的方法和装置。通过内存管理模块与应用程序的 动态协调,自动有效地准确诊断内存泄漏情况,灵活合理地分配和释放内存, 避免简单粗暴地强制释放内存,导致正在运行的功能失效异常。本发明实现简 单,检测准确,处理方法动态灵活,具有实时性高,实用性强,准确可靠,动 态灵活,具有良好的应用价值和经济效益。
本发明采用如下技术方案:
一种嵌入式系统中内存泄漏诊断处理的方法,该方法包括以下步骤,
S1,将内存划分成大小不同的内存块,每个内存块等分成多个子内存,内 存块i的子内存大小定义为Si,i=1,2,3,…,M,且S1 S2,根据应用程序申请内存的大小S,申请一个大于等于S的子内存Si,并 将该子内存节点添加到申请链表中; S3,应用程序用完内存后,释放该子内存,删除申请表链中的该子内存节 点; S4,以固定周期扫描申请链表上的所有子内存节点,当一个子内存占用时 间超过内存生命周期时,通知应用程序进行处理。 进一步的,步骤S2中应用程序初步申请内存的步骤包括, S210,从子内存最小的内存块i=1开始检索,依次从小到大检索内存块; S211,判断内存块中剩余内存个数Pi是否大于零,若是则跳转到步骤S212, 若否则i=i+1,判断i是否大于M,如果i大于M,申请内存失败,如果i不大 于M,则转到步骤S211; S212,判断应用申请内存的大小S是否小于等于子内存大小Si,若是则申 请内存成功,若否则i=i+1,判断i是否大于M,如果i大于M,申请内存失败, 如果i不大于M,则转到步骤S211。 更进一步的,步骤S211或步骤S212中的申请内存失败进入深度申请内存 步骤, S220,检索申请链表中的所有子内存节点,将子内存大小Si大于申请内存 大小S且子内存占用优先级小于申请内存优先级的子内存节点检索出来,检索 成功转到步骤S221,检索失败则申请内存失败; S221,将检索结果中优先级最低且内存最小的子内存定义为备用子内存; S222,释放备用子内存给当前申请的应用程序使用,申请内存成功。 更进一步的,步骤S221中,如果检索结果中优先级最低且内存最小的子内 存大于一个,则将占用时间长度最长的子内存定义为备用子内存。 进一步的,步骤S4中通知应用程序进行处理包括延长内存生命周期,或者 更改内存占用优先级,或者直接释放内存,或者应用程序内存泄漏自动释放内 存。 一种嵌入式系统中内存泄漏诊断处理的装置,它包括, 内存分配管理单元,用于将内存划分成大小不同的内存块,每个内存块等 分成多个子内存,内存块i的子内存大小定义为Si,i=1,2,3,…,M,且 S1 内存申请单元,用于根据应用程序申请内存的大小S,申请一个大于等于S 的子内存Si,并将该子内存节点添加到申请链表中; 内存释放单元,用于应用程序用完内存后,释放该子内存,删除申请表链 中的该子内存节点; 内存诊断单元,用于以固定周期扫描申请链表上的所有子内存节点,当一 个子内存占用时间超过内存生命周期时,通知应用程序进行处理。 进一步的,内存申请单元包括初步申请内存单元和深度申请内存单元。 更进一步的,初步申请内存单元用于从内存块中剩余未使用子内存中申请 一个大于等于S的子内存。 更进一步的,深度申请内存单元,在初步申请单元中申请失败后,从申请 链表中将子内存大小Si大于申请内存大小S且子内存占用优先级小于申请内存 优先级的子内存节点检索出来后,查优先级最低且内存最小的子内存,将该 子内存释放给当前申请的应用程序使用。 更进一步的,优先级最低且内存最小的子内存大于一个,则将其中占用时 间长度最长的子内存释放给当前申请的应用程序使用。 更进一步的,通知应用程序进行处理包括延长内存生命周期,或者更改内 存占用优先级,或者直接释放内存,或者应用程序内存泄漏自动释放内存。 本发明具有如下有益效果:一是能够在系统运行过程中自动检测内存泄漏 情况,不影响系统正常运行,实时性高,实用性强;二是能够自动有效地定位 内存泄漏点,大大降低内存泄漏排查难度,准确可靠,维护效率高;三是通过 内存管理模块与应用程序的动态协商,确认内存泄漏情况,检测准确度高;四 是通过内存管理模块与应用程序的动态协商,确认内存释放方式,避免强制释 放内存导致应用功能失效异常;五是在内存不足时,根据内存应用等级,强制 释放一些优先级比较低的内存,确保高优先级应用功能得到正常运行。 图1是内存块的结构图; 图2是初步申请内存的流程图; 图3是深度申请内存的流程图; 图4是车辆综合信息服务系统图。 为进一步说明各实施例,本发明提供有附图。这些附图为本发明揭露内容 的一部分,其主要用以说明实施例,并可配合说明书的相关描述来解释实施例 的运作原理。配合参考这些内容,本领域普通技术人员应能理解其他可能的实 施方式以及本发明的优点。图中的组件并未按比例绘制,而类似的组件符号通 常用来表示类似的组件。 现结合附图和具体实施方式对本发明进一步说明。 参阅图1至图4所示,本发明提出了一种嵌入式系统中内存泄漏诊断处理 的方法,它包括以下步骤: S1,将内存划分成大小不同的内存块,每个内存块等分成多个子内存,内 存块i的子内存大小定义为Si,i=1,2,3,…,M,且S1 将一个内存划分成不同大小的内存块,再将每一个内存块划分成子内存, 各个内存块间子内存大小不同,同一个内存块中子内存大小相同,每一个内存 块中子内存通过一个链表管理串接起来。 每一个子内存包括头和内存,头信息包括前向指针、后向指针、申请内存 的源代码文件名和行号、内存生命周期、内存已占用时间、内存使用标志、内 存块编号、内存占用优先级、回调钩子函数指针。 本发明中所述的优先级是指可以自定义的内存占用优先级,如:可以将内 存占用优先级分为高中低三级:PRI1、PRI2、PRI3,其中PRI1为最低优先级,PRI3 为最高优先级,应用程序在申请内存时,根据不同应用功能的重要性或关键性 等程度的需要,传递不同的内存占用优先级。 链表类型包括管理链表和申请链表,管理链表是将各个内存块中未使用子 内存管理串接起来,申请链表是将应用程序申请在用的子内存管理串接起来。 管理链表信息包括指向指针、内存块中总子内存个数、剩余可用子内存个数、 子内存大小。管理链表的指向指针指向内存块中第一个剩余可用子内存。 再次参阅图1所示,为内存块的结构图。内存块编号定义为i(i=1,2,3,…, M),内存块编号大小按照内存块中子内存大小排列,从1到M。因此内存块Bi 可定义为B1、B2……BM,内存块的管理链表Li可定义为L1、L2……LM,申请链表 定义为L0,各个内存块对应的总子内存个数Ni可定义为N1、N2……NM,各个内存 块对应的剩余可用子内存个数Pi可定义为P1、P2……PM,内存块B1、B2……BM对 应的子内存大小Si可定义为S1、S2……SM,且S1 S2,根据应用程序申请内存的大小S,申请一个大于等于S的子内存Si,并 将该子内存节点添加到申请链表中。 当应用程序申请内存时,除了指明申请内存大小外,还需要指明申请内存 的源代码文件名、行号、内存生命周期、内存占用优先级、回调钩子函数。 参阅图2所示,为初步申请内存的流程图,应用程序初步申请内存的步骤 包括, S210,从子内存最小的内存块i=1开始检索,依次从小到大检索内存块。 即从子内存最小的内存块B1开始检索。 S211,判断内存块中剩余内存个数Pi是否大于零,若是则跳转到步骤S212, 若否则i=i+1,判断i是否大于M,如果i大于M,则转到步骤S214,如果i不 大于M,则转到步骤S211; S212,根据应用程序申请内存的大小S,判断S是否小于等于子内存大小 Si,若是则申请内存成功转到步骤S213,若否则i=i+1,判断i是否大于M,如 果i大于M,则转到步骤S214,如果i不大于M,则转到步骤S211。 S213,申请内存成功,将应用程序传递的信息记录到子内存头信息中,并 将该子内存从管理链表Li中删除,挂接到申请链表L0中。 S214,申请内存失败,则根据应用程序传递的信息,进入深度申请内存的 步骤。 参阅图3所示,为深度申请内存的流程图,深度申请内存的步骤包括, S220,检索申请链表中的所有子内存节点,将子内存大小Si大于申请内存 大小S且子内存占用优先级小于申请内存优先级的子内存节点检索出来,检索 成功转到步骤S221,检索失败则申请内存失败。 S221,将检索结果中优先级最低且内存最小的子内存定义为备用子内存。 将检索出满足条件的子内存节点,按照优先级和内存大小排列,得到优先级最 低且内存最小的子内存节点为备用子内存,如果存在多个优先级最低且内存最 小的子内存节点,则再根据子内存已占用时间长度,得到占用时间长度最长的 子内存节点为备用子内存,转到步骤S222。 S222,释放备用子内存给当前申请的应用程序使用,申请内存成功。通过 该子内存头信息中记录的回调钩子函数,通知应用程序该内存将被释放,应用 程序做好善后处理,不再占用该内存,释该放备用子内存。 S223,将释放的子内存给当前申请的应用程序使用,更新子内存头信息, 返回。 S3,应用程序用完内存后,释放该子内存,删除申请表链中的该子内存节 点,并将该子内存挂接回对应管理链表。 S4,以固定周期扫描申请链表上的所有子内存节点,当一个子内存占用时 间超过内存生命周期时,通知应用程序进行处理。 以一定时间间隔T实时扫描申请链表,检查申请链表中每一个子内存节点, 累计每一个子内存节点已占用时间,当内存占用时间超过内存生命周期时,通 过子内存头信息中回调钩子函数通知应用程序执行处理,通过应用程序动态协 商,应用程序根据需要可以更改延长内存生命周期,或者更改内存占用优先级, 或者直接释放内存,或者应用程序判断确实为内存泄漏并自动释放内存,在数 据库中记录保存出现内存泄漏的源代码文件名、行号、时间等信息,精确定位 内存泄漏之处,便于程序维护修改。 本发明还提出了一种嵌入式系统中内存泄漏诊断处理的装置,它包括, 内存分配管理单元,用于将内存划分成大小不同的内存块,每个内存块等 分成多个子内存,内存块i的子内存大小定义为Si,i=1,2,3,…,M,且 S1 内存申请单元,用于根据应用程序申请内存的大小S,申请一个大于等于S 的子内存Si,并将该子内存节点添加到申请链表中; 内存释放单元,用于应用程序用完内存后,释放该子内存,删除申请表链 中的该子内存节点; 内存诊断单元,用于以固定周期扫描申请链表上的所有子内存节点,当一 个子内存占用时间超过内存生命周期时,通知应用程序进行处理。 其中,内存申请单元包括初步申请内存单元和深度申请内存单元。初步申 请内存单元用于从内存块中剩余未使用子内存中申请一个大于等于S的子内存。 深度申请内存单元,在初步申请单元中申请失败后,从申请链表中将子内 存大小Si大于申请内存大小S且子内存占用优先级小于申请内存优先级的子内 存节点检索出来后,查优先级最低且内存最小的子内存,将该子内存释放给 当前申请的应用程序使用。当优先级最低且内存最小的子内存大于一个,则将 其中占用时间长度最长的子内存释放给当前申请的应用程序使用。 需要说明的是,通知应用程序进行处理包括延长内存生命周期,或者更改 内存占用优先级,或者直接释放内存,或者应用程序内存泄漏自动释放内存。 参阅图4所示,为一个包括本发明的车辆综合服务系统图,该系统包括带 硬盘录像、北斗定位、移动通信功能的北斗视频行驶记录仪,车辆和北斗运监 管营运中心服务系统。其中北斗视频行驶记录仪能够采集车辆传感器信号、北 斗定位、移动通信和视频录像存储,北斗视频行驶记录仪与中心服务系统之间 是通过4G网络进行业务数据通信。系统按如下的实际应用场景阐述本发明的应 用。 北斗视频行驶记录仪是一个安装在车辆上的主机设备,包含了微处理器、 存储器RAM、Flash、加速度传感器、车辆信号采集、硬盘、移动通信模块和卫 星定位模块的子系统。主要起到移动网络无线数据通信、卫星定位功能、车辆 信号采集、震动幅值检测和视频录像存储等功能。微处理器芯片采用华为公司 Hi3520D芯片,信号采集传感器采用光耦电路采集车辆点火启动信号,视频采集 模块采用Techwell公司TW2968芯片,摄像头与视频采集模块之间通过同轴电 缆进行连接,硬盘与MCU之间通过SATA接口连接。 中心服务系统是一个基于服务器的应用软件,用于接收、解析、处理北斗 视频行驶记录仪上传的数据,分析数据,生成颠簸路况信息数据库,同时可以 远程监控、遥控、配置北斗视频行驶记录仪。 车辆传感器系统是安装在车辆各种传感器系统,对外提供了脉冲采集传感 器,车辆信号传感器等接口,其他电控设备可通过传感器线与车辆传感器系统 对接,实现车辆信号数据采集。加速度传感器是用于检测车辆行驶过程中震动 幅值。 北斗视频行驶记录仪集移动通信、BD/GPS双模卫星定位、视频录像存储功 能为一体,通过数字移动通信网络和全球卫星定位技术来实现对车辆的远程视 频监控管理、位置应用管理以及报警求助相关功能。北斗视频行驶记录仪安装 在车辆中控台位置,车辆行驶过程中,微处理器不断采集位置信息数据、车辆 传感器信号、图像信息和视频信息,将采集到的图像信息和视频信息存储到硬 盘中,同时也可以通过4G网络实时上传到中心服务系统,可供车辆运营管理单 位时候检索和查看硬盘中视频文件。由于图像信息和视频信息数据量很大,因 此需要采用动态内存的方式实现内存共享分时复用,但是由于内存申请占用时, 应用程序也无法在申请时确切知道内存所需要占用的精确时间,如数据通过网 络上传,网络信号好坏动态变化将影响内存占用时间,同时在系统运行过程中, 系统间关键数据交互需要及时成功申请动态内存,以保证系统正常运行。采用 本发明提出的一种嵌入式系统中内存泄漏诊断处理的方法,能够自动有效地准 确检测内存泄漏问题并合理释放内存,通过动态协商能够确保高优先级功能成 功申请内存得以正常运行,而不会导致低优先级功能异常,为北斗视频行驶记 录仪的功能提供基础保障。 尽管结合优选实施方案具体展示和介绍了本发明,但所属领域的技术人员 应该明白,在不脱离所附权利要求书所限定的本发明的精神和范围内,在形式 上和细节上可以对本发明做出各种变化,均为本发明的保护范围。
本文发布于:2023-04-13 07:20:52,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/3/85874.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |