宽带载波内存管理方法
技术领域
本发明涉及内存管理技术领域,具体涉及宽带载波内存管理方法。
背景技术
宽带载波模块要管理最大2040个从节点。而且还有各种抄表任务,都需动态审请内存。在嵌入式***中,内存一般都比较小,内存资源十分紧张。嵌入式软件开发者在开发程序时总是要斤斤计较,以尽可能节省的方式使用内存,避免内存的浪费,从而在这方面花费了过多的精力。现有内存管理易产生内存碎片,碎片较多时,会耗尽内存,如果碎片累计到极端的情况下可能导致没有内存可用,最终导致程序瘫痪,***崩溃的灾难后果。
发明内容
本发明是为了解决现有内存易于产生碎片的不足,提供一种不易于产生碎片,内存使用状态的检测区域小,并能快速检测内存使用状态的宽带载波内存管理方法。
为了实现上述目的,本发明采用以下技术方案:
宽带载波内存管理方法,内存管理方法包括内存初始化、内存申请、内存释放和内存状态查看;
步骤(1)内存初始化
先将整块内存分成两部分内存,设这两部分内存分别为内存区A和内存区B,并且内存区A的内存容量小于内存区B的内存容量;
步骤(2)内存申请
步骤(1-2-1)在程序申请使用内存时,先查看内存区A中是否有内存可用,再查看程序要申请的内存容量;
步骤(1-2-2)如果内存区A中没有内存可用,则将内存区A中正在运行的一个程序的一段程序段转移到内存区B中去使用内存,然后跳转到步骤(1-2-5),
步骤(1-2-4)如果内存区A中有内存可用,
步骤(1-2-5)则判断内存区A中可用的内存容量是否大于或等于程序要申请的内存容量;
如果内存区A中可用的内存容量大于或等于程序要申请的内存容量,则程序直接向内存区A申请使用内存;
如果内存区A中可用的内存容量小于程序要申请的内存容量,
则程序先将内存区A中可用的内存申请用完,再将程序要申请的内存所剩下的内存向内存区B申请内存使用;
在程序申请到内存使用后,还需要对该程序所占用的内存地址进行编号,并设定该程序占用该内存地址的最大时间;
步骤(3)内存释放
在程序占用内存地址的最大时间以内释放该程序占用的内存地址;
步骤(4)内存状态查看
根据程序占用内存地址的最大时间查看该程序占用内存的状态,如果程序占用内存地址的时间超过该程序占用内存地址的最大时间,说明此内存地址上的内存没有释放,则需要检测此内存是否忘记释放,如果检测到此内存是忘记释放则进行自动释放,如果检测到此内存并没有忘记释放则等待此内存释放。
本方案的内存管理方法是让每个要在内存中运行的程序都有一段程序段在内存区A内运行,只要检测内存区A内的内存使用状态就能够知道整块内存的使用状态,实现不易于产生碎片,内存使用状态的检测区域小,能快速检测内存使用状态的目的。本方案的内存管理方法简单易用,简洁高效,并且不会产生内存碎片,而且还能快速检测内存使用状态,为嵌入式***开发人员快速检测内存使用状态提供了极大的方便。内存使用状态的检测区域小,只要检测内存区A中是否有程序在使用即能快速知道整个内存的使用状态。
本方案中,若干个程序在使用内存时,让每个程序的一部分程序段或者全部程序段都要使用内存区A中的内存;在任意一个程序要退出内存使用时,让要退出的这个程序位于内存区A中的这部分程序段或者全部程序段都跟着全部退出,所以我们只要检测内存区A中是否有程序在使用即能快速知道整个内存的使用状态。
作为优选,步骤(2-1)设内存区A的容量大小为H,设内存区B的容量大小为U;若设内存区A的容量大小是一个由N个存储块组成的二维数组,设内存区B的容量大小也是一个由M个存储块组成二维数组,若每个存储块的最小存储容量就是该存储块的最小内存单位C,则内存区A的容量大小H=N×C,内存区B的容量大小U=M×C;
设程序要申请的内存容量大小为J,并设程序在申请内存使用时,在内存区A中还有可用的内存容量大小为K,并且0≤K≤H,0≤J≤H+U;
步骤(2-2)程序在申请使用内存时,先查看内存区A中可用内存容量大小K,再查看程序要申请的内存容量大小J;
步骤(2-3)当K=0时,
步骤(2-4)则先将内存区A中正在运行的一个程序的一段程序段转移到内存区B中去使用内存,从而让内存区A中有可用的内存容量,并且此时内存区A中可用的内存容量K>0,然后跳转到步骤(2-6),
步骤(2-5)当K>0时,
步骤(2-6)如果程序要申请的内存容量大小J≤内存区A中可用的内存容量大小K时,则程序直接向内存区A申请使用内存;
如果程序要申请的内存容量大小J>内存区A中可用的容量大小K时,
则程序先向内存区A申请使用内存,并将内存区A中可用的容量大小K全部申请用完,然后程序再向内存区B申请使用内存,并且此时程序要向内存区B申请使用的内存容量大小为J-K。
作为优选,定义一个二维数组作为内存管理区,并用该二维数组的一行表示一个内存容量大小的最小存储单元,则该内存管理区的内存容量大小就等于该二维数组的行数个最小存储单元,二维数组每行的内存容量大小等于该二维数组的列数大小,以二维数组的每一行作为一个最小的申请单元,行数和列数根据程序的需要进行调整;
定义的二维数组包括定义二维数组的行数、定义二维数组的列数和定义静态的二维数组;再定义静态的一维数组,并且一维数组的元素个数与二维数组的行数一一对应;用该一维数组的元素来记录所述二维数组的行数申请情况的行位置编号标记;在内存申请时,是从二维数组中申请一定的行数,然后将相应的行数进行位置编号标记;具体是从已经定义的二维数组中申请一定的内存容量,然后返回申请到的内存容量在二维数组中的行位置,同时将该行位置编号标记在二维数组中相应位置处做好记录,并在一维数组中将相应的行位置记录处进行位置编号标记;在内存释放时,是将一维数组中相应的行位置记录处的行位置编号标记清零即可实现行位置对应的内存释放;在内存状态查看时,因为程序申请内存使用时是按行位置编号标记的,所以每次程序审请内存使用时都清楚它的编号;由于程序占用内存地址的最大时间在编写程序时已经设定,如果程序占用内存的时间超过该程序规定的最大占用时间,则判断该程序长时间没有释放,内存会自己检测该程序占用的内存是否忘记释放,然后进行内存自动释放;通过实时查看和不断的监测行位置编号标记,即可知道程序中是否有申请过内存而长时间没有进行释放的情况;通过统计每次内存申请时从二维数组中申请的行数和最大一次申请行数,就能获得内存的使用情况。
作为优选,分别设置内存初始化的统一对外接口函数、内存申请的统一对外接口函数、内存释放的统一对外接口函数和内存状态查看的统一对外接口函数;程序只需使用这四个统一对外接口函数即可进行内存初始化、内存申请、内存释放和内存状态查看。
作为优选,设任意程序所占用的内存地址编号为Li,其中i=0,1,2,3,┅┅;还设任意程序所占用的内存地址Li的最大时间为T;在步骤(4)中,如果检测到此内存并没有忘记释放则等待内存释放,则在使用该内存地址的程序设定的占用该内存地址的最大时间T的2倍时间时强制释放该内存地址。
作为优选,所述内存区A由若干个扇区组成,如果前一个程序已经将内存区A中可用的内存申请用完,并且前一个程序占据了内存区A中的至少两个扇区,当有后一个程序要向内存区A申请内存使用时,则先将前一个程序位于内存区A内一个扇区中使用的内存内的这段程序转移到内存区B中去使用,然后再让后一个程序申请使用内存区A内前一个程序转移后释放的这个扇区内的内存。
作为优选,所述内存区A由扇区P1、扇区P2和扇区P3组成,设程序包括程序Q1、程序Q2、程序Q3、程序Q4和程序Q5,并且设程序Q1、程序Q2、程序Q3、程序Q4和程序Q5依次向内存区A申请使用内存;如果程序Q1先向内存区A申请使用内存,并且此时的扇区P1、扇区P2和扇区P3都已经被程序Q1申请用完了,若当程序Q2向内存区A申请使用内存时,则需要先将程序Q1位于扇区P2中的程序段转移到内存区B中去使用内存,然后再将扇区P2内的内存给程序Q2使用;如果扇区P2内的内存不够程序Q2使用时,则程序Q2还需将超出部分的程序段向内存区B中去使用内存;如果在程序Q1和程序Q2都还没有释放内存,并且在程序Q2已经用完扇区P2内的内存的情况下,若程序Q3向内存区A申请使用内存时,则先将程序Q1位于扇区P3中的程序段转移到内存区B中去申请使用内存,然后再将扇区P3内的内存给程序Q3使用;如果扇区P3内的内存不够程序Q3用时,则程序Q3还需将超出部分的程序段向内存区B中去申请使用内存;如果程序Q1和程序Q2都还没有释放内存,并且程序Q2没有用完扇区P2内的内存的情况下,若程序Q3向内存区A申请使用内存时,则将扇区P2内剩下的内存给程序Q3用,如果扇区P2内剩下的内存不够程序Q3用时,程序Q3还需将超出部分程序段向内存区B中去申请使用内存;如果在程序Q1、程序Q2和程序Q3都还没有释放内存,并且程序Q1完全占用了扇区P1内的内存,程序Q2完全占用了扇区P2内的内存,程序Q3完全占用了扇区P3内的内存,若程序Q4和程序Q5都依次向内存区A申请使用内存时,则程序Q4和程序Q5排队等待,当内存区A有了可用的内存时再将内存区A内可用的内存依次给程序Q4和程序Q5使用。
本方案在使用时,只需要检测内存区A内是否有程序在使用即可实时知道内存的使用状态。由于不需要对整块内存区域进行检测,只需要对内存区A内是否有程序在运行进行检测,内存使用状态的检测区域小,能快速检测内存的使用状态,大大提高了检测速度,灵敏度高。
本发明能够达到如下效果:
本发明的内存管理方法简单易用,简洁高效,不易产生内存碎片,而且还能快速检测内存的使用状态,为嵌入式***开发人员快速检测内存使用状态提供了极大的方便。当监测到一块内存长时间没有释放,内存***会自己检测此内存是否忘记释放,自动释放,以便内存做更好的优化和调整。在使用时,只需要检测内存区A内是否有程序在使用即可实时知道内存的使用状态。由于不需要对整块内存区域进行检测,只需要对内存区A内是否有程序在运行进行检测,内存使用状态的检测区域小,能快速检测内存的使用状态,大大提高了检测速度,灵敏度高,可靠性好。
附图说明
图1是本发明程序从二维数组中连续申请了3个单元(即二维数组中的3行)、箭头指向申请到的内存的起始地址的一种示意图。
图2是本发明一维数组中写上相应的位置编号标记(即二维数组中的行号)的一种示意图。
图3是本发明一维数组中相应的位置编号标记清零的一种示意图。
图4是本发明整块内存分成内存区A和内存区B,以及内存区A由扇区P1、扇区P2和扇区P3组成的一种连接结构示意图。
具体实施方式
下面通过实施例,并结合附图,对本发明的技术方案作进一步具体的说明。
实施例:宽带载波内存管理方法,参见图1、图2、图3、图4所示,内存管理方法包括内存初始化、内存申请、内存释放和内存状态查看;
步骤(1)内存初始化
先将整块内存分成两部分内存,设这两部分内存分别为内存区A和内存区B,并且内存区A的内存容量小于内存区B的内存容量;
步骤(2)内存申请
步骤(1-2-1)在程序申请使用内存时,先查看内存区A中是否有内存可用,再查看程序要申请的内存容量;
步骤(1-2-2)如果内存区A中没有内存可用,则将内存区A中正在运行的一个程序的一段程序段转移到内存区B中去使用内存,然后跳转到步骤(1-2-5),
步骤(1-2-4)如果内存区A中有内存可用,
步骤(1-2-5)则判断内存区A中可用的内存容量是否大于或等于程序要申请的内存容量;
如果内存区A中可用的内存容量大于或等于程序要申请的内存容量,则程序直接向内存区A申请使用内存;
如果内存区A中可用的内存容量小于程序要申请的内存容量,
则程序先将内存区A中可用的内存申请用完,再将程序要申请的内存所剩下的内存向内存区B申请内存使用;
在程序申请到内存使用后,还需要对该程序所占用的内存地址进行编号,并设定该程序占用该内存地址的最大时间;
步骤(3)内存释放
在程序占用内存地址的最大时间以内释放该程序占用的内存地址;
步骤(4)内存状态查看
根据程序占用内存地址的最大时间查看该程序占用内存的状态,如果程序占用内存地址的时间超过该程序占用内存地址的最大时间,说明此内存地址上的内存没有释放,则需要检测此内存是否忘记释放,如果检测到此内存是忘记释放则进行自动释放,如果检测到此内存并没有忘记释放则等待此内存释放。
步骤(2-1)设内存区A的容量大小为H,设内存区B的容量大小为U;若设内存区A的容量大小是一个由N个存储块组成的二维数组,设内存区B的容量大小也是一个由M个存储块组成二维数组,若每个存储块的最小存储容量就是该存储块的最小内存单位C,则内存区A的容量大小H=N×C,内存区B的容量大小U=M×C;
设程序要申请的内存容量大小为J,并设程序在申请内存使用时,在内存区A中还有可用的内存容量大小为K,并且0≤K≤H,0≤J≤H+U;
步骤(2-2)程序在申请使用内存时,先查看内存区A中可用内存容量大小K,再查看程序要申请的内存容量大小J;
步骤(2-3)当K=0时,
步骤(2-4)则先将内存区A中正在运行的一个程序的一段程序段转移到内存区B中去使用内存,从而让内存区A中有可用的内存容量,并且此时内存区A中可用的内存容量K>0,然后跳转到步骤(2-6),
步骤(2-5)当K>0时,
步骤(2-6)如果程序要申请的内存容量大小J≤内存区A中可用的内存容量大小K时,则程序直接向内存区A申请使用内存;
如果程序要申请的内存容量大小J>内存区A中可用的容量大小K时,
则程序先向内存区A申请使用内存,并将内存区A中可用的容量大小K全部申请用完,然后程序再向内存区B申请使用内存,并且此时程序要向内存区B申请使用的内存容量大小为J-K。
定义一个二维数组作为内存管理区,并用该二维数组的一行表示一个内存容量大小的最小存储单元,则该内存管理区的内存容量大小就等于该二维数组的行数个最小存储单元,二维数组每行的内存容量大小等于该二维数组的列数大小,以二维数组的每一行作为一个最小的申请单元,行数和列数根据程序的需要进行调整;
定义的二维数组包括定义二维数组的行数、定义二维数组的列数和定义静态的二维数组;再定义静态的一维数组,并且一维数组的元素个数与二维数组的行数一一对应;用该一维数组的元素来记录所述二维数组的行数申请情况的行位置编号标记;
在内存申请时,是从二维数组中申请一定的行数,然后将相应的行数进行位置编号标记;具体是从已经定义的二维数组中申请一定的内存容量,然后返回申请到的内存容量在二维数组中的行位置,同时将该行位置编号标记在二维数组中相应位置处做好记录,并在一维数组中将相应的行位置记录处进行位置编号标记;
在内存释放时,是将一维数组中相应的行位置记录处的行位置编号标记清零即可实现行位置对应的内存释放;
在内存状态查看时,因为程序申请内存使用时是按行位置编号标记的,所以每次程序审请内存使用时都清楚它的编号;由于程序占用内存地址的最大时间在编写程序时已经设定,如果程序占用内存的时间超过该程序规定的最大占用时间,则判断该程序长时间没有释放,内存会自己检测该程序占用的内存是否忘记释放,然后进行内存自动释放;
通过实时查看和不断的监测行位置编号标记,即可知道程序中是否有申请过内存而长时间没有进行释放的情况;
通过统计每次内存申请时从二维数组中申请的行数和最大一次申请行数,就能获得内存的使用情况。
分别设置内存初始化的统一对外接口函数、内存申请的统一对外接口函数、内存释放的统一对外接口函数和内存状态查看的统一对外接口函数;程序只需使用这四个统一对外接口函数即可进行内存初始化、内存申请、内存释放和内存状态查看。
设任意程序所占用的内存地址编号为Li,其中i=0,1,2,3,┅┅;还设任意程序所占用的内存地址Li的最大时间为T;在步骤(4)中,如果检测到此内存并没有忘记释放则等待内存释放,则在使用该内存地址的程序设定的占用该内存地址的最大时间T的2倍时间时强制释放该内存地址。
所述内存区A由若干个扇区组成,如果前一个程序已经将内存区A中可用的内存申请用完,并且前一个程序占据了内存区A中的至少两个扇区,当有后一个程序要向内存区A申请内存使用时,则先将前一个程序位于内存区A内一个扇区中使用的内存内的这段程序转移到内存区B中去使用,然后再让后一个程序申请使用内存区A内前一个程序转移后释放的这个扇区内的内存。
所述内存区A由扇区P1、扇区P2和扇区P3组成,设程序包括程序Q1、程序Q2、程序Q3、程序Q4和程序Q5,并且设程序Q1、程序Q2、程序Q3、程序Q4和程序Q5依次向内存区A申请使用内存;
如果程序Q1先向内存区A申请使用内存,并且此时的扇区P1、扇区P2和扇区P3都已经被程序Q1申请用完了,若当程序Q2向内存区A申请使用内存时,则需要先将程序Q1位于扇区P2中的程序段转移到内存区B中去使用内存,然后再将扇区P2内的内存给程序Q2使用;
如果扇区P2内的内存不够程序Q2使用时,则程序Q2还需将超出部分的程序段向内存区B中去使用内存;
如果在程序Q1和程序Q2都还没有释放内存,并且在程序Q2已经用完扇区P2内的内存的情况下,若程序Q3向内存区A申请使用内存时,则先将程序Q1位于扇区P3中的程序段转移到内存区B中去申请使用内存,然后再将扇区P3内的内存给程序Q3使用;
如果扇区P3内的内存不够程序Q3用时,则程序Q3还需将超出部分的程序段向内存区B中去申请使用内存;
如果程序Q1和程序Q2都还没有释放内存,并且程序Q2没有用完扇区P2内的内存的情况下,若程序Q3向内存区A申请使用内存时,则将扇区P2内剩下的内存给程序Q3用,如果扇区P2内剩下的内存不够程序Q3用时,程序Q3还需将超出部分程序段向内存区B中去申请使用内存;
如果在程序Q1、程序Q2和程序Q3都还没有释放内存,并且程序Q1完全占用了扇区P1内的内存,程序Q2完全占用了扇区P2内的内存,程序Q3完全占用了扇区P3内的内存,若程序Q4和程序Q5都依次向内存区A申请使用内存时,则程序Q4和程序Q5排队等待,当内存区A有了可用的内存时再将内存区A内可用的内存依次给程序Q4和程序Q5使用。
本实施例是让每个要在内存中运行的程序都有一段程序段在内存区A内运行,只要检测内存区A内的内存使用状态就能够知道整块内存的使用状态,实现不易于产生碎片,内存使用状态的检测区域小,能快速检测内存使用状态的目的。本实施例的内存管理方法简单易用,简洁高效,不易产生内存碎片,而且还能快速检测内存的使用状态,为嵌入式***开发人员快速检测内存使用状态提供了极大的方便。当监测到一块内存长时间没有释放,内存***会自己检测此内存是否忘记释放,自动释放,以便内存做更好的优化和调整。在使用时,只需要检测内存区A内是否有程序在使用即可实时知道整个内存的使用状态。
在本实施例中,若干个程序在使用内存时,让每个程序的一部分程序段或者全部程序段都要使用内存区A中的内存;在任意一个程序要退出内存使用时,让要退出的这个程序位于内存区A中的这部分程序段或者全部程序段都跟着全部退出,所以我们只要检测内存区A中是否有程序在使用即能快速知道整个内存的使用状态。由于不需要对整块内存区域进行检测,只需要对内存区A内是否有程序在运行进行检测,内存使用状态的检测区域小,能快速检测内存的使用状态,大大提高了检测速度,灵敏度高,可靠性好。
上面结合附图描述了本发明的实施方式,但实现时不受上述实施例限制,本领域普通技术人员可以在所附权利要求的范围内做出各种变化或修改。