一种Nucleus系统的动态内存池监测方法及装置与流程

文档序号:17130459发布日期:2019-03-16 01:08阅读:219来源:国知局
一种Nucleus系统的动态内存池监测方法及装置与流程

本发明涉及一种nucleus系统的动态内存池监测方法及装置,属于动态内存池分析技术领域。



背景技术:

nucleus操作系统是为实时嵌入式应用而设计的一个抢先式多任务操作系统,其95%的代码是用ansic写成的,因此非常便于移植并能够支持大多数类型的处理器。同时nucleus系统有诸多优点,如:提供源代码、性价比高、易学易用、功能模块丰富等,这些都使得nucleus系统在诸多领域得到广泛应用,如:网络、路由、数据通信、汽车、医疗仪器、安全保密、工业控制、卫星通讯等。

动态内存分配在nucleus系统中广泛应用,这些动态内存分配一般都是基于nucleus操作系统的动态内存管理模块来实现,有些动态内存分配是直接在nucleus操作系统的全局内存池中进行的,还有一些则是应用模块在nucleus内存管理创建的专用内存池中分配。然而内存的分配、释放以及存储的数据对于nucleus系统使用者均是不可见的,内存的使用情况及健康状况均不可知。由于动态内存分配根据需要来分配内存块的规模,因此随着内存块的不断分配和释放,将会导致部分内存块之间出现无法分配的细碎内存空间,即内存碎片,这些内存碎片随着时间累积将会逐渐导致系统运行效率低下;假如存在内存泄漏,那么随着时间变化,终将会出现内存耗尽的情况,从而导致系统死机重启。如果可以及早发现系统运行过程中内存的使用情况及其健康状况,就可以及早采取措施来优化内存使用,从而规避系统运行期间的潜在风险。所以对nucleus系统动态内存池运行状态的监测,可以直观地了解系统的运行状态及健康状况,这对nucleus系统的稳定运行意义重大。

nucleus系统中动态内存池结构如图1所示,nucleus系统通过动态内存池控制块链表dmd_created_pools_list来维护和管理动态内存池。系统每生成一个动态内存池,便会同步创建一个与该内存池相关的动态内存池控制块,内存池控制块存储了动态内存池的名称、地址、规模、可用空间、最小分配空间、内存块链表地址、挂起等待任务等信息。动态内存池控制块创建以后将其添加到内存池控制块链表中,这样,系统便可以通过动态内存池控制块链表找到该内存池并对其进行管理。

对于每一个指定的动态内存池,系统通过内存块头结构链表dm_memory_list来对其进行维护和管理。系统每分配一个动态内存块,便会同步创建一个与该内存块相关的内存块头结构,内存块头结构存储了该内存块的空闲状态、所属的内存池指针以及与该内存块相连的上一块和下一块内存块的头结构指针。内存块头结构创建以后,便将其添加到相应内存池的内存块头结构链表中。

因此内存池控制块存储了内存池的宏观信息,内存块头结构链表则更详尽的描述了指定内存池的具体分配情况,所以要具体监测nucleus系统的动态内存池,需要准确有效的获取动态内存池链表、内存池控制块和内存块头结构链表的运行信息。而现有技术中缺少对nucleus系统的动态内存池的实时监测,导致nucleus系统无法及时了解动态内存池的使用情况。



技术实现要素:

本发明的目的是提供一种nucleus系统的动态内存池监测方法,以实现对nucleus系统的动态内存池的实时监测;同时本发明还提供了一种nucleus系统的动态内存池监测装置。

本发明为解决上述技术问题而提供一种nucleus系统的动态内存池监测方法,该监测方法包括以下步骤:

1)通过符号解析获取nucleus系统动态内存池链表起始地址、链表节点的类型信息、以及内存池控制块结构体的成员类型;

2)遍历动态内存池链表,获取各个内存池控制块的内存地址;

3)根据内存池控制块各个成员相对起始地址的偏移和成员类型直接读取内存,以获取各个动态内存池的名称、地址、总空间、剩余空间和挂起任务数,实现各内存池信息的监测。

本发明以内存池变量的符号解析为基础,通过符号解析来确定nucleus系统动态内存池链表地址及链表节点的结构信息,以及内存池控制块结构体的成员信息,通过上述信息直接读取内存就可获取各个动态内存池信息。本发明能够快速、便捷的实现对nucleus系统运行过程中其动态内存池信息的监测,使nucleus用户能够准确了解系统当前内存的使用情况。

进一步地,为了方便nucleus用户能够准确了解内存池中各个内存块的分配及使用情况,该方法还包括内存池分配信息的监测,过程为:遍历动态内存池链表获取指定内存池的内存块头结构链表的起始地址,根据得到的内存块头结构链表的起始地址对该内存块头结构链表进行遍历,获取所述指定内存池中各个内存块的大小,并统计相同大小内存块的数量。

进一步地,为了方便nucleus用户能够准确了解内存池中内存碎片的分布情况,该方法还包括对内存池碎片信息的监测,过程为:遍历动态内存池链表获取指定内存池的内存块头结构链表的起始地址,根据得到的内存块头结构链表的起始地址对该内存块头结构链表进行遍历,确定各个内存块使用及空闲情况,以及内存碎片的分布情况。

进一步地,为了方便nucleus用户能够准确了解内存池越限情况,该方法还包括对内存池越限的监测,过程为:遍历动态内存池链表获取指定内存池的内存块头结构链表的起始地址,根据得到的内存块头结构链表的起始地址对该内存块头结构链表进行遍历,检查所有内存块头部数据结构中的数据成员正确性和链表指针指向的正确性,若均正确,则说明该内存池不越限。

进一步地,为了实现对内存块头部数据结构中的数据成员正确性和链表指针指向的正确性的判断,本发明还给出了具体的判断方式,判断内存块头结构数据成员正确性是判断内存块空闲状态标识正确性,若空闲状态标识值为布尔值,则认为控制块空闲状态标识正确;判断链表指针指向正确性是直接读取当前内存控制块指向上一个内存块指针和所属内存池指针,若两个指针指向对应内存块和内存池,则认为链表指针指向正确。

进一步地,为了方便nucleus用户能够准确了解内存池内存泄漏情况,该方法还包括对内存池泄漏的监测,过程为:遍历动态内存池链表找到内存池的内存池控制块,按照设定时间间隔读取该内存池可用空间大小,确定可用空间占总空间百分比随时间变化情况,当内存池可用空间随时间变化呈逐渐减小趋势时,判定该内存池存在内存泄漏的情况。

进一步地,为了使nucleus用户能够直观的看出内存碎片的分布情况,对内存池碎片信息的监测还包括将内存碎片的分布情况通过饼图和分布图的方式展示出来。

进一步地,为了使nucleus用户能够直观的看出内存池是否存在泄漏,对内存池泄漏的监测还包括将可用空间占总空间百分比随时间变化情况通过动态图的形式显示出来。

本发明还提供了一种nucleus系统的动态内存池监测装置,该监测装置包括处理器和存储器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现本发明的nucleus系统的动态内存池监测方法。

附图说明

图1是现有nucleus系统动态内存池结构示意图;

图2是本发明nucleus系统的动态内存池监测方法的流程图;

图3是本发明内存池信息汇总监测功能实现流程图;

图4是本发明中内存池信息汇总监测实例图;

图5是本发明中内存池分配情况监测功能实现流程图;

图6是本发明usysymem内存池分配情况监测实例图;

图7是本发明中内存池碎片监测功能实现流程图;

图8是本发明dm_gws内存池碎片分布监测实例图;

图9是本发明dm_gws内存池碎片比率监测实例图;

图10是本发明中内存越限监测功能实现流程图;

图11是本发明gw_dm内存越限监测实例图;

图12是本发明内存泄漏监测功能实现流程图;

图13是espdrv内存泄漏监测实例图;

图14是本发明nucleus系统的动态内存池监测装置的结构图。

具体实施方式

下面结合附图对本发明的具体实施方式作进一步地说明。

本发明nucleus系统的动态内存池监测方法的实施例

本实施例的动态内存池监测方法以内存池变量的符号解析为基础,通过符号解析来确定nucleus系统动态内存池链表的地址及其链表节点的结构信息、内存池控制块及内存块头结构等结构体的结构信息;然后通过直接读取内存来获取动态内存池链表及内存池控制块结构体成员的实际值获取动态内存池的当前使用情况;进一步读取内存块头结构的信息,从而更详细的了解指定内存池中各个内存块的分配及使用情况。该方法的实现流程如图2所示,其中各个功能模块包括内存池信息的监测、内存池分配信息的监测、内存池碎片信息的监测、内存越限的监测和内存泄漏的监测,除了内存池信息的监测外,其余的监测可根据需要进行选择,下面结合具体实例对各个过程进行详细说明。

准确有效的获取动态内存池链表、内存池控制块和内存块头结构链表的运行信息是实现对内存池监测的前提,这些信息的获取可以直接通过读内存来实现,本发明采用符号解析的方式获取动态内存池链表的起始地址及其链表节点各个成员的数据类型,以及内存池控制块及其块头结构类型及其成员数据类型。

符号解析是指把符号的定义和引用联系起来,符号解析的一个重要功能就是根据符号名称解析其具体的信息,如变量的数据类型和地址,函数的起始地址和结束地址,结构体的成员名称和类型等信息,符号包括全局变量,静态变量,函数,类型,label等。nucleus系统动态内存池变量符号信息存储在目标文件的特定位置,即elf文件的符号表,该发明方法首先加载包含所需符号的elf文件,然后根据符号名称在elf文件的符号表中查找符号的数据类型和内存地址,对于简单变量直接获取其数据类型和内存地址即可,对于结构体等复杂变量则需要进一步解析结构体成员的数据类型和结构体成员相对于结构体起始地址的内存地址偏移。然后获取nucleus系统动态内存池链表起始地址、链表节点的类型结构信息和内存池控制块结构体的成员类型,然后遍历动态内存池链表,获取各个内存池控制块的内存地址,根据内存池控制块各个成员相对其起始地址的偏移和成员类型直接读取内存,从而获取各个动态内存池信息的实际值。

对本实例而言,如图3所示,首先加载nucleus系统目标文件,然后通过符号解析获取动态内存池链表dmd_created_pools_list地址及结构信息,以及内存池控制块dm_pcb_struct结构体的结构信息,存储dm_pcb_struct的成员相对于结构体首地址的偏移量值;根据动态内存池链表dmd_created_pools_list的地址,便可以知道首个动态内存池的开始地址,该地址也是该动态内存池控制块地址,根据内存池控制块结构体dm_pcb_struct成员相对于内存池控制块地址的偏移直接读取其内存值,便可获取该内存池的相关信息,然后将读取的内存池的名称、地址、总空间、剩余空间及挂起任务数填入表格,这样便完成了第一个内存池的信息统计。然后全局内存池链表dmd_created_pools_list移动到下一节点,读取第二个动态内存池的信息并填入表格,该过程重复进行,直到读取完所有动态内存池信息并填表完成,其结果如图4所示。

内存池信息监测完成后,可根据用户实际需求对内存池分配信息、内存池碎片信息、内存越限和内存泄漏进行监测。

1.内存池分配信息的监测。

内存池分配信息监测过程为:遍历动态内存池链表获取指定内存池的内存块头结构链表的起始地址,通过符号解析获取内存块头结构结构体成员类型,然后遍历内存块头结构链表,直接读取内存,获取指定内存池的内存块分配情况,实现对内存池分配信息的监测。

对本实例而言,如图5所示,当选择了一个特定内存池之后,首先遍历动态内存池链表查找该内存池,然后通过内存池控制块结构体dm_pcb_struct中内存池起始地址,找到该内存池,然后遍历该内存池的内存块头结构链表,查询各个内存块的大小,并统计相同大小内存块的数量,并将这些信息填入相应表格,结果如图6所示。

2.内存池碎片信息的监测。

内存池碎片信息监测过程为:遍历指定内存池的内存块头结构链表,分析各个内存块使用及空闲情况,记录内存碎片的大小及其在内存池中的位置,从而获取内存碎片的大小及分布。

对于指定的内存池,本实例采用的监测过程如图7所示,首先按照步骤1中的方式找到该内存池,然后遍历该内存池的内存块头结构链表,查询内存块占用情况,剩余可用空间信息,以及无法分配内存的分布情况,即内存碎片的分布情况。为了方便用户查看,可将碎片的分布情况以饼图和内存碎片分布图的形式呈现出来,饼图可以直观地看到内存池中内存碎片的占比,内存碎片分布图可以直观地看到内存碎片在内存池中的分布情况,其结果如图8、图9所示。

3.内存越限监测。

内存越限监测过程为:遍历指定内存池的内存块头结构链表,检查各个内存块头结构成员的正确性,以及内存块头结构指针指向的正确性,从而判断是否存在内存越界内存泄漏监测。判断内存块头结构数据成员正确性是判断内存块空闲状态标识正确性,若空闲状态标识值为布尔值,则认为控制块空闲状态标识正确;判断链表指针指向正确性是直接读取当前内存控制块指向上一个内存块指针和所属内存池指针,若两个指针指向对应内存块和内存池,则认为链表指针指向正确。当内存块空闲标识和内存块头结构指针指向均正确时,则认为该内存块不越限,否则认为该内存池存在内存越限的情况。

对于指定的内存池,本实例采用的监测过程如图10所示,首先按照步骤1中的方式找到该内存池,然后遍历内存池的内存块头结构链表,检查所有内存块头部数据结构中的数据成员的正确性,以及链表指针指向的正确性,对于检测异常的头部,将该内存块头结构信息和上一个正常内存块头结构信息填入表格,其结果如图11所示。

4.内存泄漏监测。

内存泄漏监测过程为:实时监测内存池可用空间大小,根据可用内存空间大小的变化趋势来判断是否存在内存泄漏。

对本实例而言,内存泄漏的监测过程如图12所示,对于指定内存池,通过遍历动态内存池链表找到该内存池控制块,通过定时器按照指定时间间隔读取该内存池可用空间大小,当内存池可用空间随时间变化呈逐渐减少的趋势时,便可以断定该内存池存在内存泄漏的情况。为了方便用户更加直观的观测出是否出现内存泄漏,可绘制可用空间占总空间的百分比随时间变化的曲线,其结果如图13所示。

通过上述过程,本发明能够迅速、便捷地获得nucleus系统运行过程中其动态内存池分配及使用情况,通过内存池分配和使用情况,可监测到内存碎片分布、内存越限及内存泄漏情况,从而使nucleus用户更直观准确的了解系统当前内存的使用情况及其健康状况。

本发明nucleus系统的动态内存池监测装置的实施例

上述方法可以作为一种计算机程序,在nucleus系统的动态内存池监测装置上运行,本发明的nucleus系统的动态内存池监测装置为计算机等具备数据处理能力的设备,该确定装置包括:存储器、处理器及网络模块。存储器、处理器以及网络模块相互之间直接或间接地电性连接,以实现数据的传输或交互。例如,这些元件相互之间可通过一条或多条通讯总线或信号线实现电性连接。存储器包括至少一个可以软件或固件(firmware)的形式存储于存储器中的软件功能模块,处理器通过运行存储在存储器内的软件程序以及模块,从而执行各种功能应用以及数据处理,即实现本发明方法实施例中的nucleus系统的动态内存池监测方法。

其中,存储器可以是,但不限于,随机存取存储器(randomaccessmemory,ram),只读存储器(readonlymemory,rom),可编程只读存储器(programmableread-onlymemory,prom),可擦除只读存储器(erasableprogrammableread-onlymemory,eprom),电可擦除只读存储器(electricerasableprogrammableread-onlymemory,eeprom)等。其中,存储器用于存储程序,处理器在接收到执行指令后,执行上述程序。

处理器可能是一种集成电路芯片,具有信号的处理能力。上述的处理器可以是通用处理器,包括中央处理器(centralprocessingunit,cpu)、网络处理器(networkprocessor,np)等。还可以是数字信号处理器(dsp))、专用集成电路(asic)、现场可编程门阵列(fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。可以实现或者执行本发明实施例中公开的各方法、步骤及逻辑框图。通用处理器可以是微处理器或者该处理器也可以是任何常规处理器等。

网络模块(也叫通信模块)用于通过网络建立电子设备与外部通信终端之间的通信连接,实现网络信号及数据的收发操作。上述网络信号可包括无线信号或者有线信号。

对本实例而言,如图14所示,处理器所执行的程序包括符号解析模块、内存池信息监测模块、内存分配监测模块、碎片分布监测模块、内存越限监测模块和内存泄漏监测模块,通过符号解析模块获取nucleus系统动态内存池链表起始地址、链表节点的类型结构信息、内存池控制块结构体和内存块头结构体的结构信息;通过内存池信息监测模块、内存分配监测模块、碎片分布监测模块、内存越限监测模块和内存泄漏监测模块实现对动态内存池的情况进行监测,使nucleus用户准确的了解系统当前内存的使用情况及其健康状况。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1