一种动态内存分配方法

xiaoxiao2020-7-22  14

一种动态内存分配方法
【专利摘要】本发明涉及内存分配方法【技术领域】,尤其涉及一种用于电力用户用电信息采集系统的动态内存分配方法,主要通过设置空闲内存链表来实现空闲内存的动态分配,这种动态内存分配方法编译后的执行文件较少、运行效率较高、管理效率较高且具有内存溢出检测。
【专利说明】—种动态内存分配方法
【技术领域】
[0001]本发明涉及内存分配方法【技术领域】,尤其涉及一种用于电力用户用电信息采集系统的动态内存分配方法。
【背景技术】
[0002]当前现有技术用于电力用户用电信息采集系统的内存分配方法主要有以下几种:
一、使用静态内存管理;
二、使用Iibc库中的动态内存管理;
三、使用newlib库中的动态内存管理。
[0003]因为电力用户用电信息采集系统的内存总量较小,而且内存分为多个物理内存块,将上述三种内存管理方法应用于电力用户用电信息采集系统时会产生以下问题:编译后的执行文件过于庞大导致分配内存效率较低,占用大量程序存储区,运行效率较低且不适合内存总量较小的电力用户用电信息采集系统使用;需要将多个物理内存块分开管理,管理效率较低;没有设置内存溢出检测,在内存溢出时不能友好的提示系统死机原因。

【发明内容】

[0004]本发明所要解决的技术问题是:提供一种编译后的执行文件较少、运行效率较高、管理效率较高且具有内存溢出检测的动态内存分配方法。
[0005]本发明所采用的技术方案是:一种动态内存分配方法,它包括以下步骤:
(1)、初始化内存空间,设定内存初地址,将每块物理内存块分成三个部分,依次为第一部分、第二部分以及第三部分,且每个部分均包含一个信息节点头以及一个内存块,且每块物理内存块的第一部分与第三部分的内存块的大小为0K,然后将所有的物理内存块中的第二部分组合起来形成一个空闲内存链表,所述信息节点头包括使用状态信息、对应的内存块的大小信息以及指向上一个物理中相邻的内存块的地址的第一指针,且所述第二部分的内存块中还设有一个第二指针与第三指针,所述第二指针与第三指针分别指向空闲内存链表中相邻的上下两块空闲内存块的地址;
(2)、等待接收请求;
(3)、若接收到应用程序需要分配内存的请求,则逐一查看空闲内存链表中是否存在比需要分配内存大的空闲内存块,若存在则在此空闲内存块中分配出请求所需的内存块,若此空闲内存块分配出请求所需的内存后所剩的空闲内存小于信息节点头所需内存,则将所剩的空闲内存也分配给请求的应用程序,并且修改原先在空闲内存链表中与这个分配出去的内存块相邻的两个空闲内存块的第二指针与第三指针,然后在分配出去的内存块上增加对应的信息节点头,同时统计当前内存信息,存入统计信息,然后返回步骤(2)继续等待请求,若此空闲内存块分配出请求所需的内存后所剩的空闲内存不小于信息节点头所需内存,则修改此空闲内存块的信息节点头,然后在分配出去的内存块上增加对应的信息节点头,同时统计当前内存信息,存入统计信息,然后返回步骤(2)继续等待请求;若不存在则返回步骤(2)继续等待请求,同时记录分配失败,存入统计信息;
若接收到应用程序需要释放内存的请求,首先检测需要释放的内存块的信息节点头是否合法,若检测到信息节点头非法则统计非法原因且同时显示非法原因;若检测到信息节点头合法,则根据释放的内存块的信息节点头中的第一指针将释放的内存块插入到物理内存块中,并且判断是否需要进行合并,然后返回步骤(2)继续等待请求;
若接收到用户查看统计信息的请求时,导出当前的统计信息,然后返回步骤(2)继续等待请求。
[0006]步骤(3)所述的检测需要释放的内存的信息节点头是否合法包括以下步骤:
A、检测需要释放的内存块的信息节点头中的使用状态信息,若使用状态信息为未使用,则判断信息节点头非法;若使用状态信息为使用,则判断信息节点头合法;
B、检测需要释放的内存块的信息节点头,然后检测与释放的内存块相邻的前物理内存块的信息节点头,若前物理内存块的地址加上8个字节再加上前物理内存块的大小等于释放的内存块的地址,则判断释放的内存块的信息节点头合法;若不等,则判断释放的内存块的信息节点头不合法;
C、检测需要释放的内存块的信息节点头,然后检测与释放的内存块相邻的后物理内存块的信息节点头,若释放的内存块的地址加上8个字节再加上释放的内存块的大小等于后物理内存块的地址,则判断释放的内存块的信息节点头合法;若不等,则判断释放的内存的信息节点头不合法。
[0007]所述步骤(3)中判断是否需要进行合并是指:首先检测与释放的内存块相邻的前后两个物理内存块是否空闲,若释放的内存块的前物理内存块空闲,则将释放的内存块与前物理内存块合并,并且删除释放的内存块的信息节点头并且修改前物理内存块的信息节点头;若释放的内存块的后物理内存块空闲,则将释放的内存块与后物理内存块合并,并且删除后物理内存块的信息节点头且修改释放的内存块的信息节点头;若释放的内存块的前后物理内存块均空闲,即将释放的内存块与前后物理内存块合并,并且删除释放的内存块以及后物理内存块的信息节点头且修改前物理内存块的信息节点头;若释放的内存块的前后物理内存块均不空闲,则不做修改,直接插入,并且将释放的内存块根据内存大小插入到空闲内存链表中,并且根据插入的位置设置一个第二指针与第三指针。
[0008]采用以上方法与现有技术相比,本发明具有以下优点:本申请的方法编译后的执行文件较少,分配内存效率较高,适合内存总量较小的系统使用;而且通过空闲内存链表将所有空闲的内存块链接起来,这样管理效率较高,且内存分配效率也较高;并且在释放内存块时需要进行信息节点头的合法性检测,这样当检测出来需要释放的内存块的信息节点头不合法时,就相当于检测到系统有内存溢出,然后同时会显示非法原因,所述的非法原因包括需要释放的内存块是从哪个任务中释放出来的,这样用户在第一时间就能知道是哪个任务导致系统死机,即本发明能友好的提示系统死机的原因。
[0009]通过这三个步骤来检测释放的内存块的信息节点头是否合法,这样检测准确性较高,而且检测效率也较高。
[0010]通过将释放的内存块与相邻的前后物理内存块进行合并,这样能有效减少空闲的碎片内存块,使得在之后的内存分配中能分配出较大的空闲内存块。【具体实施方式】
[0011]以下【具体实施方式】对本发明做进一步描述,但是本发明不仅限于以下【具体实施方式】。
[0012]一种动态内存分配方法,它包括以下步骤:
(1)、初始化内存空间,设定内存初地址,将每块物理内存块分成三个部分,依次为第一部分、第二部分以及第三部分,且每个部分均包含一个信息节点头以及一个内存块,且每块物理内存块的第一部分与第三部分的内存块的大小为0K,然后将所有的物理内存块中的第二部分组合起来形成一个空闲内存链表,所述信息节点头包括使用状态信息、对应的内存块的大小信息以及指向上一个物理中相邻的内存块的地址的第一指针,且所述第二部分的内存块中还设有一个第二指针与第三指针,所述第二指针与第三指针分别指向空闲内存链表中相邻的上下两块空闲内存块的地址;其中一块物理内存块中,第一部分的信息节点头的第一指针指向空,第二部分的信息节点头的第一指针指向第一部分的物理内存块,即指向0K,第三部分的信息节点头的第一指针指向第二部分的物理内存块,第二部分的物理内存块的大小为总的物理内存块的大小减去三个信息节点头的大小;所述其中一个物理内存块的第二部分的第二指针与第三指针分别指向两个物理内存块中的第二部分的空闲内存块,且所述空闲内存块是根据空间大小来进行排序的,然后通过各自的第二指针与第三指针来相互链接,形成一个空闲内存链表;并且第二指针与第三指针只设置在空闲内存块中,若空闲内存链表中的空闲内存块被使用时,即内存块的信息节点头的使用状态信息为使用,则内存块中是不存在第二指针与第三指针的,则这个内存块也不会出现在空闲内存链表中;且所述使用状态信息占用I位,对应的内存块大小信息占用31位,这两者组合起来占用4个字节,还有第一指针占用4个字节;
(2)、等待接收请求;
(3)、若接收到应用程序需要分配内存的请求,则逐一查看空闲内存链表中是否存在比需要分配内存大的空闲内存块,若存在则在此空闲内存块中分配出请求所需的内存块,若此空闲内存块分配出请求所需的内存后所剩的空闲内存小于信息节点头所需内存,则将所剩的空闲内存也分配给请求的应用程序,并且修改原先在空闲内存链表中与这个分配出去的内存块相邻的两个空闲内存块的第二指针与第三指针,然后在分配出去的内存块上增加对应的信息节点头,同时统计当前内存信息,存入统计信息,然后返回步骤(2)继续等待请求,若此空闲内存块分配出请求所需的内存后所剩的空闲内存不小于信息节点头所需内存,则修改此空闲内存块的信息节点头,然后在分配出去的内存块上增加对应的信息节点头,同时统计当前内存信息,存入统计信息,然后返回步骤(2)继续等待请求;若不存在则返回步骤(2)继续等待请求,同时记录分配失败,存入统计信息;
若接收到应用程序需要释放内存的请求,首先检测需要释放的内存块的信息节点头是否合法,若检测到信息节点头非法则统计非法原因且同时显示非法原因;若检测到信息节点头合法,则根据释放的内存块的信息节点头中的第一指针将释放的内存块插入到物理内存块中,并且判断是否需要进行合并,然后返回步骤(2)继续等待请求;此非法原因主要还是这个需要释放的内存块是从哪个任务中释放出来的,这样能让用户清楚到底是哪个任务出错了,造成了内存溢出,因为第一指针是指向与之相邻的上一个物理内存块的,所以可以根据需要释放的内存块的信息节点头中的第一指针找到这个内存块原来是从哪边分配出去的,现在将返回原先的位置;
若接收到用户查看统计信息的请求时,导出当前的统计信息,然后返回步骤(2)继续等待请求。此统计信息主要包括当前总共的内存块个数,空闲内存块个数,空闲内存块大小、分配失败次数等信息。
[0013]步骤(3)所述的检测需要释放的内存的信息节点头是否合法包括以下步骤:
A、检测需要释放的内存块的信息节点头中的使用状态信息,若使用状态信息为未使用,则判断信息节点头非法;若使用状态信息为使用,则判断信息节点头合法;因为需要释放的内存块分配出去时信息节点头的使用状态一定为使用,若正常使用,这个信息节点头是不会修改的,而如果检测到使用状态信息改变了,则表示这个释放的内存块在使用过程中发生了内存溢出,即导致了信息节点头被占用或者修改;
B、检测需要释放的内存块的信息节点头,然后检测与释放的内存块相邻的前物理内存块的信息节点头,若前物理内存块的地址加上8个字节再加上前物理内存块的大小等于释放的内存块的地址,则判断释放的内存块的信息节点头合法;若不等,则判断释放的内存块的信息节点头不合法;所述的8个字节是信息节点头的大小,如果正常情况下,释放的内存块是能刚好插入到与之相邻的前后两个物理内存块之间的,即上述计算式是相等的,若不等,则表示释放的内存块的信息节点头被占用或者修改过了,即表示释放的内存块在使用过程中有内存溢出现象;
C、检测需要释放的内存块的信息节点头,然后检测与释放的内存块相邻的后物理内存块的信息节点头,若释放的内存块的地址加上8个字节再加上释放的内存块的大小等于后物理内存块的地址,则判断释放的内存块的信息节点头合法;若不等,则判断释放的内存的信息节点头不合法。所述的8个字节是信息节点头的大小,如果正常情况下,释放的内存块是能刚好插入到与之相邻的前后两个物理内存块之间的,即上述计算式是相等的,若不等,则表示释放的内存块的信息节点头被占用或者修改过了,即表示释放的内存块在使用过程中有内存溢出现象。
[0014]所述步骤(3)中判断是否需要进行合并是指:首先检测与释放的内存块相邻的前后两个物理内存块是否空闲,若释放的内存块的前物理内存块空闲,则将释放的内存块与前物理内存块合并,并且删除释放的内存块的信息节点头并且修改前物理内存块的信息节点头;若释放的内存块的后物理内存块空闲,则将释放的内存块与后物理内存块合并,并且删除后物理内存块的信息节点头且修改释放的内存块的信息节点头;若释放的内存块的前后物理内存块均空闲,即将释放的内存块与前后物理内存块合并,并且删除释放的内存块以及后物理内存块的信息节点头且修改前物理内存块的信息节点头;若释放的内存块的前后物理内存块均不空闲,则不做修改,直接插入,并且将释放的内存块根据内存大小插入到空闲内存链表中,并且根据插入的位置设置一个第二指针与第三指针。这个内存块之间的合并简单的说就是物理上相邻的两个内存块只要是都是空闲的就合并在一起。若能合并,这样就相当于将原先空闲内存链表中的其中一个空闲内存的内存大小增加了,若不能合并,则需要在空闲内存链表上重新增加一块。
【权利要求】
1.一种动态内存分配方法,其特征在于:它包括以下步骤: (1)、初始化内存空间,设定内存初地址,将每块物理内存块分成三个部分,依次为第一部分、第二部分以及第三部分,且每个部分均包含一个信息节点头以及一个内存块,且每块物理内存块的第一部分与第三部分的内存块的大小为0K,然后将所有的物理内存块中的第二部分组合起来形成一个空闲内存链表,所述信息节点头包括使用状态信息、对应的内存块的大小信息以及指向上一个物理中相邻的内存块的地址的第一指针,且所述第二部分的内存块中还设有一个第二指针与第三指针,所述第二指针与第三指针分别指向空闲内存链表中相邻的上下两块空闲内存块的地址; (2)、等待接收请求; (3)、若接收到应用程序需要分配内存的请求,则逐一查看空闲内存链表中是否存在比需要分配内存大的空闲内存块,若存在则在此空闲内存块中分配出请求所需的内存块,若此空闲内存块分配出请求所需的内存后所剩的空闲内存小于信息节点头所需内存,则将所剩的空闲内存也分配给请求的应用程序,并且修改原先在空闲内存链表中与这个分配出去的内存块相邻的两个空闲内存块的第二指针与第三指针,然后在分配出去的内存块上增加对应的信息节点头,同时统计当前内存信息,存入统计信息,然后返回步骤(2)继续等待请求,若此空闲内存块分配出请求所需的内存后所剩的空闲内存不小于信息节点头所需内存,则修改此空闲内存块的信息节点头,然后在分配出去的内存块上增加对应的信息节点头,同时统计当前内存信息,存入统计信息,然后返回步骤(2)继续等待请求;若不存在则返回步骤(2)继续等待请求,同时记录分配失败,存入统计信息; 若接收到应用程序需要释放内存的请求,首先检测需要释放的内存块的信息节点头是否合法,若检测到信息节点头非法则统计非法原因且同时显示非法原因;若检测到信息节点头合法,则根据释放的内存块的信息节点头中的第一指针将释放的内存块插入到物理内存块中,并且判断是否需要进行合并,然后返回步骤(2)继续等待请求; 若接收到用户查看统计信息的请求时,导出当前的统计信息,然后返回步骤(2)继续等待请求。
2.根据权利要求1所述一种动态内存分配方法,其特征在于:步骤(3)所述的检测需要释放的内存的信息节点头是否合法包括以下步骤: 检测需要释放的内存块的信息节点头中的使用状态信息,若使用状态信息为未使用,则判断信息节点头非法;若使用状态信息为使用,则判断信息节点头合法; 检测需要释放的内存块的信息节点头,然后检测与释放的内存块相邻的前物理内存块的信息节点头,若前物理内存块的地址加上8个字节再加上前物理内存块的大小等于释放的内存块的地址,则判断释放的内存块的信息节点头合法;若不等,则判断释放的内存块的信息节点头不合法; 检测需要释放的内存块 的信息节点头,然后检测与释放的内存块相邻的后物理内存块的信息节点头,若释放的内存块的地址加上8个字节再加上释放的内存块的大小等于后物理内存块的地址,则判断释放的内存块的信息节点头合法;若不等,则判断释放的内存的信息节点头不合法。
3.根据权利要求1所述的一种动态内存分配方法,其特征在于:所述步骤(3)中判断是否需要进行合并是指:首先检测与释放的内存块相邻的前后两个物理内存块是否空闲,若释放的内存块的前物理内存块空闲,则将释放的内存块与前物理内存块合并,并且删除释放的内存块的信息节点头并且修改前物理内存块的信息节点头;若释放的内存块的后物理内存块空闲,则将释放的内存块与后物理内存块合并,并且删除后物理内存块的信息节点头且修改释放的内存块的信息节点头;若释放的内存块的前后物理内存块均空闲,即将释放的内存块与前后物理内存块合并,并且删除释放的内存块以及后物理内存块的信息节点头且修改前物理内存块的信息节点头;若释放的内存块的前后物理内存块均不空闲,则不做修改,直接插入,并且将释放的内存块根据内存大小插入到空闲内存链表中,并且根据插入的位置设 置一个第二指针与第三指针。
【文档编号】G06F12/02GK103984639SQ201410175791
【公开日】2014年8月13日 申请日期:2014年4月29日 优先权日:2014年4月29日
【发明者】郑坚江, 陈杰, 刘宁 申请人:宁波三星电气股份有限公司

最新回复(0)