CN104360954A - 一种已申请内存块的统计方法和系统 - Google Patents
一种已申请内存块的统计方法和系统 Download PDFInfo
- Publication number
- CN104360954A CN104360954A CN201410604528.XA CN201410604528A CN104360954A CN 104360954 A CN104360954 A CN 104360954A CN 201410604528 A CN201410604528 A CN 201410604528A CN 104360954 A CN104360954 A CN 104360954A
- Authority
- CN
- China
- Prior art keywords
- memory block
- node
- chained list
- module
- memory
- 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.)
- Granted
Links
Landscapes
- Memory System (AREA)
Abstract
本发明提供一种已申请内存块的统计方法和系统,适用于VxWorks操作系统,通过链表管理模块,建立链表;通过遍历模块对操作系统内的每一个已申请内存块进行遍历,并针对每一个已申请内存块:判断链表上是否存在与已申请内存块的关键字相同的结点:如存在,更新与已申请内存块的关键字相同的结点的信息;如不存在,将已申请内存块添加为一个新结点;判断链表上是否存在有未更新信息的结点:如果有,则删除未更新的结点后通过输出模块输出链表;如果没有,则直接输出链表。并且,链表管理模块、遍历模块和输出模块都是由控制模块来控制管理的。本发明通过察看内存使用和变化情况,有效、快捷地缩小内存泄漏的定位,提供内存实时使用情况。
Description
技术领域
本发明涉及一种内存块的统计方法,特别是涉及一种基于VxWorks操作系统的已申请内存块的统计方法和系统。
背景技术
内存管理是计算机科学中的一个重要研究领域,而内存管理中的一个重要研究课题是解决或处理内存泄漏问题。所谓的内存泄漏,是指程序在申请获得动态内存并使用完毕后,不释放动态内存就将保存动态内存地址的变量用于其它用途,是的这些动态内存不可能再被程序使用,也无法被操作系统回收。
内存泄露是软件开发中最常见也最棘手的程序错误种类之一。对于规模较大的程序,内存泄露将导致程序最终因耗尽系统所有的内存,无法再进行内存分配而崩溃。并且,内存泄露非常不容易查找和定位,使用常规的方法很难快速定位内存泄露出现的具体位置,特别是VxWorks操作系统。
VxWorks是美国Wind River公司设计开发的一种嵌入式实时操作系统,是嵌入式开发环境的关键组成部分。其以良好的可靠性和卓越的实时性被广泛应用于很多实时性要求极高的领域。VxWorks采用用户程序、内核处于同一个内存空间的共享内存管理策略,而且,操作系统对内存空间没有保护,各个进程或任务实际上共享一个内存空间。一个任务在执行前,系统必须为它分配足够的连续内存空间,然后全部载入主存储器的连续空间。VxWorks操作系统一般运行在嵌入式装置里面,往往很难或不能重新启动系统,因此若发生了内存泄露,常常无法通过静态插装等方式查找内存泄露,而需要实时检测内存泄露,并定位故障。因此,软件开发人员在开发程序时,必须保证不侵犯其他程序和内核的内存空间,以免破坏系统的正常工作或导致其他程序异常运行。
目前,针对VxWorks操作系统的内存管理主要是对内存分区、内存动态申请和释放,以及空闲内存块进行管理,但是,对已经申请的内存块(正在被使用的内存块)不做任何管理和“干涉”,因此无法使用内存管理机制对已申请内存块进行分类统计,软件开发和维护人员也就更加难以寻找发生内存泄露的任务。
发明内容
鉴于以上所述现有技术的缺点,本发明的目的在于提供一种已申请内存块的统计方法和系统,用于解决现有技术中VxWorks操作系统中,无法对已申请内存块进行统计管理的问题。
为实现上述目的及其他相关目的,本发明提供一种已申请内存块的统计方法,适用于VxWorks操作系统,包括:步骤一,建立链表;步骤二,遍历所述VxWorks操作系统内的每一个已申请内存块,并针对每一个已申请内存块,判断所述链表上是否存在与已申请内存块的关键字相同的结点:如果存在,则更新与已申请内存块的所述关键字相同的结点的信息;如果不存在,则将已申请内存块添加为一个新结点;步骤三,判断所述链表上是否存在有未更新信息的结点:如果有,则删除所述未更新信息的结点,并跳转至步骤四;如果没有,则直接跳转至步骤四;步骤四,输出所述链表。
可选地,对所述VxWorks操作系统内的已申请内存块的遍历顺序是由所述VxWorks操作系统的已申请内存块的地址决定的。
可选地,所述链表包括多个所述结点,每一个所述结点包括一个或多个已申请内存块。
可选地,创建所述链表使用的内存是从一个结构体数组中申请的。
可选地,所述关键字是已申请内存块的大小。
可选地,所述关键字是使用已申请内存块的任务。
可选地,已申请内存块的后4个字节用于描述所述任务的任务ID;在所述链表中,任务ID、结点和已申请的内存块之间存在映射关系。
一种已申请内存块的统计系统,适用于VxWorks操作系统,包括:链表管理模块、遍历模块、控制模块和输出模块;所述链表管理模块用于创建链表,生成、更新和删除所述链表中的结点;所述遍历模块用于遍历所述VxWorks操作系统内的已申请内存块;所述控制模块用于根据已申请内存块的关键字控制管理所述链表管理模块、所述遍历模块和所述输出模块;其中,所述已申请内存块的关键字为已申请内存块的大小或使用已申请内存块的任务;所述输出模块用于输出所述统计系统的统计结果。
可选地,所述链表管理模块所使用的内存是从一个结构体数组中申请的。
可选地,所述链表包括多个所述结点,所述结点包括一个或多个已申请内存块。
如上所述,本发明的一种已申请内存块的统计方法和系统,适用于VxWorks操作系统,其可以通过察看内存使用和变化情况的手段,有效帮助软件开发人员缩小内存泄漏问题定位的范围,也可以为软件开发人员提供内存使用情况的实时信息。当系统发生内存泄漏,但开发或维护人员不确定是由哪个任务哪个内存块泄漏引起时,使用本发明就可以简单直观地获取到相应的信息。
附图说明
图1显示为本发明实施例公开的一种已申请内存块的统计方法的流程示意图。
图2显示为依据使用已申请内存块的任务使用本发明实施例公开的一种已申请内存块的统计方法进行统计的统计结果。
图3显示为依据已申请内存块的大小使用本发明实施例公开的一种已申请内存块的统计方法进行统计的统计结果。
图4显示为本发明实施例公开的一种已申请内存块的统计系统的结构示意图。
元件标号说明
S11~S14 步骤
200 已申请内存块的统计系统
210 链表管理模块
220 遍历模块
230 控制模块
240 输出模块
具体实施方式
以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。需说明的是,在不冲突的情况下,以下实施例及实施例中的特征可以相互组合。
请参阅图1至图4需要说明的是,以下实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
实施例1
本实施例公开了一种的已申请内存块的统计方法,适用于VxWorks操作系统。本实施例是基于VxWorks6.8操作系统。VxWorks操作系统的内存管理主要是对内存分区、内存动态申请和释放,以及空闲内存块进行的管理。但是VxWorks操作系统的内存管理机制对已申请内存块则不做任何的管理。
在VxWorks操作系统中,内存块的头部都会保存有当前内存块的大小,所以对内存块大小进行统计可以在VxWorks操作系统的原有内存管理机制上加以改进来实现;但是如果对任务类型进行统计就需要对内存块的头部加以修改:VxWorks操作系统的内存块的头部一共有16个字节,已申请内存块的头部的后4个字节是预留的,因此,本实施例就使用这最后4个字节来保存任务ID(Identification,标识),这样就可根据任务ID对各个任务进行内存块的统计。
本实施例的已申请的内存块的统计方法是使用单向链表对已申请内存块信息进行分类统计,如图1所示,包括:
步骤一S11,建立链表;其中,链表是一个单向链表。
单向链表创建时使用的内存不是从堆内存中动态申请的,而是从一个全局的结构体数组中申请的。这样既可以避免在统计过程中由于动态申请和释放内存引起的部分统计结果的偏差,也可以避免堆内存即将耗尽时无法进行统计或统计过程发生错误。
并且,如果对已申请内存块的统计是针对已申请内存块的大小而进行的话,那么链表仅包括多个结点,且每一个结点包括一个或多个已申请的内存块。如果统计是针对使用已申请内存块的任务,那么,要将已申请内存块的头部的后4个字节用来描述使用该已申请内存块的任务的任务ID;并且,链表在建立过程时,结点和任务的任务ID之间是存在映射关系的。其是通过回调函数在系统创建任务时,将建立好映射的结点添加到链表中。这样可以统计一些已经不存在,但仍然暂用一些堆内存的任务,也可以准确地统计出任务名为NULL的任务。
本实施例的已申请内存块的数据结构定义如下:
按照这个数据结构定义的已申请内存块,适用于上述两种统计类型,通用性比较强。其中,preNum、next和num均为链表结点上的成员变量,size为已申请内存块的大小。
步骤二S12,遍历VxWorks操作系统内的每一个已申请内存块,并针对每一个已申请内存块:判断单向链表上是否存在与已申请内存块的关键字相同的结点。
根据VxWorks操作系统的内存分区,对于VxWorks操作系统内的已申请内存块的遍历顺序是根据从各个内存分区中的已申请内存块的地址来决定的。在本实施例中,是按照地址由低到高的顺序进行的。并且,在遍历时,只检测已申请内存块,不需查看VxWorks操作系统中的空闲内存块。
对于遍历过程中的每一个已占用内存块,依据其关键字来对单向链表内的结点进行处理。该关键字分为两类:一类是已申请内存块的大小;一类是使用已申请内存块的任务。在本实施例中,采用的关键字是后一类,其比较的关键字如下所示:pCurTaskMemBlock->taskId==pCurHdr->headGuard,判断使用已申请内存块的任务ID和链表结点上记录的任务ID是否相同。其中,pCurTaskMemBlock表示链表中当前任务所使用的内存块,taskId表示为任务ID,pCurHdr->headGuard为vxWorks操作系统内核所标记的任务ID。基于这两类关键字,对链表内的结点进行检索查找:如果发现存在关键字相同的结点,则更新该结点上的信息;如果没有与关键字相同的信息,则在单向链表上添加一个新结点。
步骤三S13,判断链表上的结点是否存在有未更新信息的结点:在遍历结束后,会对单向链表上的结点进行一个判断,判断单向链表内是否存在未更新的信息,如果存在未更新信息的结点,表示该结点所对应的已申请内存块已经没有被使用了,需要将其释放,所以删除该结点。如果不存在未更新信息的结点,则直接跳转至步骤四。
在本实施例中,针对使用已申请内存块的任务的统计,在已申请内存块遍历结束后,在输出之前会将各个结点的部分信息清零,并且将本次统计结束后结点上统计到的已申请内存块的数量num赋值给preNum,只保留结点中的taskId、preNum和next成员。这样做的目的是可以保留每次统计的num,下一次使用本接口时,就可以用num-preNum得到一个增量值raiseNum。而结点上其他成员清零,是为了避免下一次统计的时候,可能出现的部分任务已经不存在。如果下一次有些任务已经不存在,就不必保留结点。因此,每次遍历之后输出之前,都会生意遍历链表中是否有num==0的结点,即链表中是否有未被更新过的结点。如果有,说明该任务当前没有使用任何堆内存,也就没有必要保留该结点。
步骤四S14,输出最后的链表:
如图2和图3所示,图2给出的是按照使用已申请内存块的任务进行统计后输出的链表;图3显示为按照内存块大小进行统计后输出的链表。
实施例2
本实施例公开了一种已申请内存块的统计系统200,适用于VxWorks操作系统,如图4所示,包括链表管理模块210、遍历模块220、控制模块230和输出模块240。
其中,链表管理模块210是用于建立和管理单向链表。其中,创建单向链表时所使用的内存是从一个全局的结构体数组中申请的。且,单向链表包括一个或多个结点,所述结点内包括一个或多个已申请内存块。链表管理模块210可以在已经创建成功的单向链表中生成新结点,对单向链表中已经存在的结点的信息可以予以更新和删除。此外,如果本实施例的已申请内存块的统计系统200既可以依据已申请内存块的大小进行统计,也可依据使用已申请内存块的任务进行统计。如果依据任务进行统计,其已申请内存块的头部的最后4个字节被用于描述其对应的任务的任务ID,并且,在创建成功的单向链表中,结点、任务ID和已申请内存块是存在映射关系的。
遍历模块220用于遍历VxWorks操作系统内的已申请内存块;且遍历的顺序是依据VxWorks操作系统的各个内存分区中的已申请内存块的地址,一般是按照由低地址向高地址的顺序来进行遍历。
控制模块230用于依据已申请内存块的关键字对链表管理模块210、遍历模块220和输出模块240进行管理控制。如上所述,已申请内存块的关键字既可以是已申请内存块的大小,也可是使用已申请内存块的任务。在遍历模块220对VxWorks操作系统的已申请内存块进行遍历时,对每一个已申请内存块,按照关键字,即已申请内存块的大小或使用已申请内存块的任务的任务ID,比对链表管理模块210上建立的单向链表,判断是否存在与关键字相同的结点,如果存在,则通过链表管理模块210更新该结点;如果不存在,则通过链表管理模块210在单向链表中添加新结点。
输出模块240用于输出最后的统计结果,即输出经过遍历和处理后的单向链表。
综上所述,本发明的一种已申请内存块的统计方法和系统,适用于VxWorks操作系统,是一种通过察看内存使用和变化情况的手段,可以有效地帮助软件开发人员缩小内存泄漏问题定位的范围,也可以为软件开发人员提供内存使用情况的实时信息。当系统发生内存泄漏,但开发或维护人员不确定是由哪个任务哪个内存块泄漏引起时,使用本发明就可以简单直观地获取到相应的信息。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。
上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。
Claims (10)
1.一种已申请内存块的统计方法,适用于VxWorks操作系统,其特征在于,所述已申请内存块的统计方法包括:
步骤一,建立链表;
步骤二,遍历所述VxWorks操作系统内的每一个已申请内存块,并针对每一个已申请内存块,判断所述链表上是否存在与已申请内存块的关键字相同的结点:如果存在,则更新与已申请内存块的所述关键字相同的结点的信息;如果不存在,则将已申请内存块添加为一个新结点;
步骤三,判断所述链表上是否存在有未更新信息的结点:如果有,则删除所述未更新信息的结点,并跳转至步骤四;如果没有,则直接跳转至步骤四;
步骤四,输出所述链表。
2.根据权利要求1所述的已申请内存块的统计方法,其特征在于,对所述VxWorks操作系统内的已申请内存块的遍历顺序是由所述VxWorks操作系统的已申请内存块的地址决定的。
3.根据权利要求1所述的已申请内存块的统计方法,其特征在于,所述链表包括多个所述结点,每一个所述结点包括一个或多个已申请内存块。
4.根据权利要求1所述的已申请内存块的统计方法,其特征在于,创建所述链表使用的内存是从一个结构体数组中申请的。
5.根据权利要求1所述的已申请内存块的统计方法,其特征在于,所述关键字是已申请内存块的大小。
6.根据权利要求1所述的已申请内存块的统计方法,其特征在于,所述关键字是使用已申请内存块的任务。
7.根据权利要求6所述的已申请内存块的统计方法,其特征在于,已申请内存块的后4个字节用于描述所述任务的任务ID;在所述链表中,任务ID、结点和已申请的内存块之间存在映射关系。
8.一种已申请内存块的统计系统,适用于VxWorks操作系统,其特征在于,所述已申请内存块的统计系统包括:链表管理模块、遍历模块、控制模块和输出模块;
所述链表管理模块用于创建链表,生成、更新和删除所述链表中的结点;
所述遍历模块用于遍历所述VxWorks操作系统内的已申请内存块;
所述控制模块用于根据已申请内存块的关键字控制管理所述链表管理模块、所述遍历模块和所述输出模块;其中,所述已申请内存块的关键字为已申请内存块的大小或使用已申请内存块的任务;
所述输出模块用于输出所述统计系统的统计结果。
9.根据权利要求8所述的已申请内存块的统计系统,其特征在于,所述链表管理模块所使用的内存是从一个结构体数组中申请的。
10.根据权利要求8所述的已申请内存块的统计系统,其特征在于,所述链表包括多个所述结点,所述结点包括一个或多个已申请内存块。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410604528.XA CN104360954B (zh) | 2014-10-30 | 2014-10-30 | 一种已申请内存块的统计方法和系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410604528.XA CN104360954B (zh) | 2014-10-30 | 2014-10-30 | 一种已申请内存块的统计方法和系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104360954A true CN104360954A (zh) | 2015-02-18 |
CN104360954B CN104360954B (zh) | 2017-10-24 |
Family
ID=52528218
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410604528.XA Active CN104360954B (zh) | 2014-10-30 | 2014-10-30 | 一种已申请内存块的统计方法和系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104360954B (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104461918A (zh) * | 2014-12-05 | 2015-03-25 | 上海斐讯数据通信技术有限公司 | 对已动态申请的内存块进行统计的方法及系统 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7293142B1 (en) * | 2004-04-19 | 2007-11-06 | Cisco Technology, Inc. | Memory leak detection system and method using contingency analysis |
CN103455424A (zh) * | 2013-09-18 | 2013-12-18 | 哈尔滨工业大学 | 基于VxWorks操作系统的动态内存泄漏检测方法及装置 |
CN103716234A (zh) * | 2013-12-19 | 2014-04-09 | 汉柏科技有限公司 | 一种定位报文内存泄露的方法 |
CN103914376A (zh) * | 2014-03-12 | 2014-07-09 | 汉柏科技有限公司 | 一种内存泄露的快速定位方法 |
-
2014
- 2014-10-30 CN CN201410604528.XA patent/CN104360954B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7293142B1 (en) * | 2004-04-19 | 2007-11-06 | Cisco Technology, Inc. | Memory leak detection system and method using contingency analysis |
CN103455424A (zh) * | 2013-09-18 | 2013-12-18 | 哈尔滨工业大学 | 基于VxWorks操作系统的动态内存泄漏检测方法及装置 |
CN103716234A (zh) * | 2013-12-19 | 2014-04-09 | 汉柏科技有限公司 | 一种定位报文内存泄露的方法 |
CN103914376A (zh) * | 2014-03-12 | 2014-07-09 | 汉柏科技有限公司 | 一种内存泄露的快速定位方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104461918A (zh) * | 2014-12-05 | 2015-03-25 | 上海斐讯数据通信技术有限公司 | 对已动态申请的内存块进行统计的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN104360954B (zh) | 2017-10-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8494996B2 (en) | Creation and revision of network object graph topology for a network performance management system | |
CN102760080A (zh) | 一种内存管理的方法和装置 | |
CN107992537B (zh) | 业务属性传递方法、装置、计算机设备及存储介质 | |
US20130054925A1 (en) | Memory allocation tracking | |
CN109302321A (zh) | 服务器、业务需求处理系统、方法和监控系统 | |
US10102047B2 (en) | In-memory data analytic system that provides an integrated tracking mechanism for explicit memory resources | |
CN103338135A (zh) | 一种集群存储容量的实时监控方法 | |
CN103309796A (zh) | 一种组件对象模型对象的监控方法和装置 | |
JP2018081693A (ja) | スキーマで表される必要条件を用いた自動プロセス制御ハードウェア工学 | |
CN105447051A (zh) | 一种数据库操作的方法和装置 | |
US11893367B2 (en) | Source code conversion from application program interface to policy document | |
US9373093B2 (en) | Gateway service manager for business object applications | |
CN109684393A (zh) | 数据采集方法、计算机可读存储介质及终端设备 | |
CN110659259A (zh) | 数据库迁移方法、服务器以及计算机存储介质 | |
Oliveira et al. | Delivering software with agility and quality in a cloud environment | |
CN110609839A (zh) | 区块链数据处理的方法、装置、设备及可读存储介质 | |
CN105183542A (zh) | 一种内存管理方法及系统 | |
CN106951593B (zh) | 一种生成保护测控装置的配置文件的方法和装置 | |
CN111506552A (zh) | 一种树状结构的动态数据库设计方法及系统 | |
CN107124292B (zh) | 一种信息系统运行方式关联关系动态生成方法 | |
CN104360954A (zh) | 一种已申请内存块的统计方法和系统 | |
CN104317660A (zh) | 一种银行参数管理系统 | |
CN108710504A (zh) | 数据库操作方法及装置 | |
CN104778087B (zh) | 一种信息处理方法以及信息处理装置 | |
CN115134367A (zh) | 云平台和业务处理方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
TR01 | Transfer of patent right |
Effective date of registration: 20201209 Address after: 313028 Industrial Park, balidian Town, Huzhou City, Zhejiang Province Patentee after: HUZHOU FENGYUAN AGRICULTURAL EQUIPMENT MANUFACTURE Co.,Ltd. Address before: 201616 No. 3666 Sixian Road, Songjiang District, Shanghai Patentee before: Phicomm (Shanghai) Co.,Ltd. |
|
TR01 | Transfer of patent right |