CN111177017B - 一种内存分配方法及装置 - Google Patents

一种内存分配方法及装置 Download PDF

Info

Publication number
CN111177017B
CN111177017B CN201811333061.4A CN201811333061A CN111177017B CN 111177017 B CN111177017 B CN 111177017B CN 201811333061 A CN201811333061 A CN 201811333061A CN 111177017 B CN111177017 B CN 111177017B
Authority
CN
China
Prior art keywords
block
node
linked list
memory
idle
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.)
Active
Application number
CN201811333061.4A
Other languages
English (en)
Other versions
CN111177017A (zh
Inventor
陈金宏
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Actions Technology Co Ltd
Original Assignee
Actions Technology Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Actions Technology Co Ltd filed Critical Actions Technology Co Ltd
Priority to CN201811333061.4A priority Critical patent/CN111177017B/zh
Publication of CN111177017A publication Critical patent/CN111177017A/zh
Application granted granted Critical
Publication of CN111177017B publication Critical patent/CN111177017B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/0292User address space allocation, e.g. contiguous or non contiguous base addressing using tables or multilevel address translation means
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/0223User address space allocation, e.g. contiguous or non contiguous base addressing
    • G06F12/023Free address space management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

本发明公开了一种内存分配方法及装置,该方法中,针对一个内存构建至少一个用于链接被分配的内存块block的block链表;在所述block链表的基础上,构建至少一个用于链接block中空闲节点的空闲节点链表;收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存。本发明可以满足内存分配频率且内存需求大小不一致的需求,内存分配更加灵活,占用极少的管理空间,减少内存浪费,在分配空间时可以快速的找到合适的空间并进行分配。

Description

一种内存分配方法及装置
技术领域
本发明涉及内存分配技术领域,尤其涉及一种内存分配方法及装置。
背景技术
目前设备的内存分配方式一般采用静态分配的方式,即预先为不同的内存占用类型分配固定数目固定大小的内存空间。比如为异步无链接链路ACL(AsynchronousConnectionless Link)分配6个大小固定为1024bytes的内存,然后用一个单向链表将它们串起来。
这种方式分配和释放的速度最快,但是由于分配固定大小的内存空间,内存使用存在较大浪费。特别对于小型嵌入式系统来说,总共也就只有一两百KB的随机存储器RAM可以使用。因此如果使用静态分配的方式将导致有几十KB的RAM被蓝牙控制器永远占用,内存浪费比较严重。
另外还有一种内存分配方式是通过系统统一的内存管理接口进行内存的申请和释放,但系统管理的内存比较大,对内存申请和释放的时间比较不可控,可能需要花费几us~几百us的时间。另外频繁的申请和释放也会造成系统产生大量的内存碎片,所以利用系统统一的内存管理接口行不通。
发明内容
本发明提供一种内存分配方法及装置,在分配空间时可以快速的找到合适的空间并进行分配。
第一方面,本发明提供一种内存分配方法,该方法包括:
针对一个内存构建至少一个用于链接被分配的内存块block的block链表;
在所述block链表的基础上,构建至少一个用于链接block中空闲节点的空闲节点链表;
收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存。
每个所述block链表对应一个头指针,用于指向对应block链表中第一个被分配的block;
所述针对一个内存构建至少一个用于链接被分配的内存块block的block链表包括:
将从所述内存中分配出的每个block连接到对应的block链表,所述block被划分为至少一个节点,每个block具有指向所在block链表中下一个被分配block的块指针,及指向所在block的空闲节点链表中第一个空闲节点的头节点指针;
所述构建至少一个用于链接block中的空闲节点的空闲节点链表包括:
将每个block的空闲节点连接到该block的空闲节点链表,所述空闲节点具有指向所在空闲节点链表中下一个空闲节点的节点指针。
可选地,所述收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存,包括:
根据所述头指针和所述块指针遍历所述block链表查找被分配的block;
在查找到每个被分配的block时,根据所述block头节点指针及所述block的空闲节点链接链表,遍历查找所述block中空闲节点;
确定查找到满足分配请求的第一空闲节点时,从该第一空闲节点中进行分配内存,并更新所述block的空闲节点链表。
可选地,该方法还包括:
收到初次内存分配请求时,从内存中新分配一个第一block并连接到block链表。
可选地,该方法还包括:
确定未查找到满足分配请求的第一空闲节点时,从内存中新分配一个第二block连接到所述block链表的最后;
根据所述第二block的头节点指针及对应第二空闲节点链表,遍历查找所述第二block中空闲节点;
确定查找到满足分配请求的第二空闲节点时,从所述第二空闲节点中进行分配内存,并更新所述第二空闲节点链表。
可选地,从所述第一空闲节点/第二空闲节点中进行分配内存,包括:
确定第一空闲节点/第二空闲节点容量超过满足分配请求所需内存容量时,从第一空闲节点/第二空闲节点中分配满足分配请求所需的内存容量,若分配后剩余部分内存容量大于等于设定阈值,则将所述分配后剩余部分划分为一个新的空闲节点;
否则,将该第一空闲节点/第二空闲节点全部分配。
可选地,还包括:
收到内存释放请求时,根据请求释放的节点的起始地址及节点容量,确定所述请求释放的节点的地址域;
根据所述请求释放的节点的地址域,确定所述请求释放的节点所处的第三block;
将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表。
可选地,将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表之后,还包括:
确定第三block中的节点全部为空闲节点时,从block链表中删除第三block。
可选地,还包括:
根据请求内存分配的数据的特征,对数据进行分类得到多类数据流;
其中,针对每一类数据流建立一个block链表,针对每个block建立一个空闲节点链表。
可选地,所述数据的特征包括以下任一或任多个特征:
存储数据的生命周期;
存储数据的数据流向;
存储数据的先入先出FIFO特性。
可选地,多类数据流包括如下任一或任多类数据流:
第一类数据流,包括以下部分或全部:用于发送空中不同ACL链路的控制命令的数据流、用于发送空中不同ACL链路的用户数据流、用于发送空中不同同步链路的语音数据流;
第二类数据流,包括以下部分或全部:用于接收空中所有ACL链路的控制命令的数据流、用于接收空中所有ACL链路的用户数据流、用于接收HOST端命令数据流、用于发送给HOST端的事件数据流、用于接收空中所有同步链路的语音数据流、用于控制器内部事件处理的队列数据流;
第三类数据流,包括全局指针结构体数据流。
可选地,每个block中空闲节点数量不超过3个。
第二方面,本发明提供一种内存分配装置,包括处理器和存储器,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述处理器执行上述内存分配方法的步骤。
第三方面,本发明提供一种内存分配装置,包括:
block链表构建单元,用于针对一个内存构建至少一个用于链接被分配的内存块block的block链表;
空闲节点链表构建单元,用于在所述block链表的基础上,构建至少一个用于链接block中空闲节点的空闲节点链表;
内存分配单元,用于收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存。
第四方面,本发明提供一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述内存分配方法的步骤。
利用本发明提供的内存分配方法及装置,具体以下有益效果:
通过两级链表进行内存分配,能够自适应进行扩展,满足内存分配频率且内存需求大小不一致的需求,内存分配更加灵活,占用极少的管理空间,减少内存浪费,在分配空间时可以快速的找到合适的空间并进行分配。
附图说明
图1为本发明实施例提供内存分配方法流程图;
图2为本发明实施例中内存划分的block结构示意图;
图3为本发明实施例中block链表连接示意图;
图4为本发明实施例block中free node结构示意图;
图5为本发明实施例block中used node结构示意图;
图6为本发明实施例中分配一个used node后block结构示意图;
图7为本发明实施例中从free node采用两种方式分配内存后的结构示意图;
图8为本发明实施例中内存分配方法详细流程图;
图9为本发明实施例中释放一个used node1后结构变化示意图;
图10为本发明实施例中合并两个free node后结构变化示意图;
图11为本发明实施例中进行内存释放的详细流程图;
图12为本发明实施例中在整个内存分配过程可能出现node分布情况示意图;
图13为本发明实施例提供的内存分配装置结构图。
具体实施方式
为了使本发明的目的、技术方案和优点更加清楚,下面将结合附图对本发明作进一步地详细描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。本文中描述的第一空闲节点、第二空闲节点、第三空闲节点、第四空闲节点、第一block、第二block、第三block是为了进行区分,不一定代表其在空闲节点链表、block链表中的顺序。
实施例1
蓝牙控制器对内存的使用有如下一些要求:在某些场景下,内存申请释放特别频繁,比如蓝牙连接过程、蓝牙通话或者蓝牙播歌过程等;内存使用大小不一,最小可能申请一个字节内存,最大可能申请1021字节内存;对内存分配和释放的速度要求较高,一般要求在24M CPU频率下,要在20us内完成内存的申请或者释放。
为了满足具有上述内存使用特性的蓝牙控制器等设备的内存使用需求,本发明实施例提供一种内存分配方法,如图1所示,该方法包括:
步骤101,针对一个内存构建至少一个用于链接被分配的内存块block的block链表;
需要说明的是,在有内存分配需求时,首先确定被分配的内存块block,被分配的block可以是预先对内存划分好的,也可以是在有内存需求时确定大小并分配的。被分配的block的大小可以为固定大小,也可以为不同的大小。
步骤102,在所述block链表的基础上,构建至少一个用于链接block中空闲节点的空闲节点链表;
需要说明的是,每个block被划分为至少一个节点node,在确定被分配的block的基础上,需要通过空闲节点链表查找到被分配的block中空闲节点,从而从空闲节点中进行内存分配。
步骤103,收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存。
本实施例提供的上述内存分配方法,通过两级链表进行内存分配,收到内存分配请求时,通过第一级链表即block链表可以找到被分配的block,通过第二级链表即空闲节点链表可以找到被分配block中空闲节点,从空闲节点中进行内存分配,因此能够自适应进行扩展,满足内存分配频率高且内存需求大小不一致的需求,内存分配更加灵活,占用极少的管理空间,减少内存浪费,在分配空间时可以快速的找到合适的空间并进行分配。
作为一种可选的实施方式,每个block链表对应一个头指针,用于指向对应block链表中第一个被分配的block。
针对一个内存构建至少一个用于链接被分配的内存块block的block链表包括:
将从所述内存中分配出的每个block连接到对应的block链表,所述block被划分为至少一个节点,每个block具有指向所在block链表中下一个被分配block的块指针,及指向所在block的空闲节点链表中第一个空闲节点的头节点指针;
在实施中,如果block被分配,将指向block链表中最后一个block的块指针指向新分配的block,则实现将新分配的block连接到block链表。因此block链表中block中的块指针构成block链表的指针域。
构建至少一个用于链接block中的空闲节点的空闲节点链表包括:
将每个block的空闲节点连接到该block的空闲节点链表,所述空闲节点具有指向所在空闲节点链表中下一个空闲节点的节点指针;
在实施中,如果block被分配,在构建block链表的同时,为新分配的block构建对应的空闲节点链表,每个block具有一个空闲节点链表。具体为将新分配的block中的节点指针修改为指向所在空闲节点链表中下一个空闲节点的节点指针,则实现将新分配的block中空闲节点连接到空闲节点链表。因此空闲节点链表中空闲节点中的节点指针构成空闲节点链表的指针域。
通过block链表中指针域的块指针,可以查找到每个被分配的block,通过查到的被分配的block的头节点指针,可以查找到被分配的block的空闲节点链表中的第一个空闲节点,通过空闲节点链中的节点指针可以查找到该block的所有空闲节点。
作为可选的实施方式,收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存,包括:
根据所述头指针和所述块指针遍历所述block链表查找被分配的block;
在查找到每个被分配的block时,根据所述block头节点指针及所述block的空闲节点链接链表,遍历查找所述block中空闲节点;
确定查找到满足分配请求的第一空闲节点时,从该第一空闲节点中进行分配内存,并更新所述block的空闲节点链表。
其中,如果分配内存后,block链表的头节点指针可能改变也可能不改变,如果有变化,还同时更新头节点指针。
具体的,在收到内存分配请求时,根据所述头指针找到对应block链表,根据block链表中第一个被分配的block的头节点指针找到该block的空闲节点链表中的第一个空闲节点,若该空闲节点满足分配要求,则进行内存分配,否则,根据该空闲节点的节点指针查找空闲节点链表中的下一个空闲节点,若没有下一个空闲节点,即该空闲节点的节点指针指向空值,则通过该block中的块指针查找下一个被分配的block,同理直至找到满足分配请求的第一空闲节点进行内存分配。
本发明的实施例中:
block:为划分的一小块内存;例如对蓝牙控制器来说,内存资源是非常宝贵的,所以不能在初始化的时候就分配足够的空间,需要按需分配;block作为内存分配的分配单位,可以是不同大小的block,也可以是固定大小的block,具体大小可以自由定义。
如图2所示,为一种block的结构示意图,每个block包括块指针next_block、头节点指针free_head及地址域ram,next_block指向下一个被分配的block的起始地址,free_head指向该block内第一个空闲node的起始地址;
在实施中,next_block可以占用4个字节或其它定义的长度,free_head可以占用4个字节或其它定义的长度。
实施例中还定义了头指针head,记录对应block链表中第一个被分配block的位置。如图3所示的block链表连接示意图,可以通过从前往后的顺序遍历block链表中被分配的所有的block;具体可以通过head查找第一个被分配的block1,通过block1中的next_block查找到block2,通过block2中的next_block查找到block3,依次类推能够查找到所有被分配的block。
实施例中block中的ram域的内存由一个个的node组成,没有分配出去的是空闲节点free node,已经分配出去的是被使用节点used node(也称被分配节点)。对于freenode,其具有指向所在的空闲节点链表中下一个空闲node的节点指针next_pointer,而used node中没有该节点指针next_pointer。
本实施例中通过被分配的block的free_head指向该block的空闲节点链表中的第一个空闲节点,从而支持通过该被分配的block的空闲节点链表遍历该被分配的block的所有free node。
在实施中,先查找到block1,以block1有3个空闲节点为例,通过该block1的free_head查找到block1的第一个空闲节点free_node1,通过free_node1中的next_pointer查找到block1中的free_node2,通过free_node2中的next_pointer查找到block1中的free_node3。对于查找的其它被分配的block,以同样的方式可以遍历该block中所有的free_node。需要说明的是上述free_node1、free_node2、free_node3是空闲节点链表上的排序关系,其实际地址域的排序可能是不同的。
分配内存时,首先根据分配请求中申请空间大小,计算实际需要分配空间的大小。
本实施例中通过按照block被分配的顺序,从前往后遍历block,在查找到每个block时从前往后遍历每个free_node,在查找到满足要求的free_node时,从该free_node进行内存分配,并停止查找。
从free_node进行内存分配后,block中的node占用情况会改变,free_node至少一部分或全部转换为used_node,因此需要根据node占用情况进行空闲节点链表更新,如果第一空闲节点有变化,则更新对应的free_node。
本发明实施例提供的上述内存分配方法,通过借助block链表和空闲节点链表,实现从被分配的block的free_node进行内存分配,一方面可以满足快速分配内存的要求,另一方面对于FIFO数据,可以提高内存的利用率,避免内存资源的浪费。
作为一种可选的实施方式,每个node还包括用于指示该node容量的容量指示域size,及指示该node为是否为空闲node的状态标志位及地址域,其中,空闲node中的状态标志位为空闲标志,被分配的node中的状态标志位为使用标志。
具体地,如图4所示,free node的格式中,free node包括用于指示该node容量的容量指示域free_size、用于指示该node为空闲node的状态标志位mem_flag、节点指针next_pointer及地址域ram。
如图5所示,used node的格式中,used node包括用于指示该node容量的容量指示域size、用于指示该node为被使用node的状态标志位mem_flag、及地址域ram。
可选地,head初始化指向空值NULL,即表示没有分配任何内存块,每个block初始化时被划分有一个free node,每个block的next_block初始化为指向空值NULL,即表示后面没有被分配的block,每个block初始化时的free_node的next_pointer指向空值,即表示后面没有free_node。
初始状态下,内存只占用一个4字节的head指针,指向NULL,即没有分配block。所以该内存管理方法需要耗费的额外管理空间特别少。
本发明实施例中,发生节点分配内存、节点释放内存、节点合并、添加block或者释放block时,可能会引起对应链表中block和/或node的变化,因此会根据变化情况对应修改block链表中block和/或node中的信息,如果block链表中的第一个block的地址发生变化,也要修改对应头指针的信息。
具体地,如果遍历block链表未查找可用free node,包括以下情况,一种没有进行block分配或之前分配的block全部被释放,一种有被分配的block但没有满足要求的freenode。
一、对于没有进行block分配或之前分配的block全部被释放的情况;
一种可选的实施例,初次内存分配之前或者之前分配的block全部被释放后所述头指针为空,当收到(初次)内存分配请求时,从内存中新分配一个第一block并连接到block链表中。
需要说明的是,收到内存分配请求时,block链表对应的head指向空,未找到被分配的block,因此从内存中新分配一个第一block,将head指向该新分配的第一block,实现将第一block连接到block链表,将该新分配的第一block的next_block指向空值,表示是block链表中最后一个block,新分配的第一block中的free_node指向该第一block的第一个free node,实现将第一个free node连接到第一block的空闲节点链表。
二、对于有被分配的block但没有满足要求的free node情况
一种可选的实施例,确定未查找到满足分配请求的第一空闲node时,从内存中新分配一个第二block连接到block链表的最后,具体将之前block链表中最后一个block的块指针指向该第二block,实现将第二block连接到block链表,将第二block的next_block指向空值;根据第二block对应头节点指针及第二空闲节点链表,遍历查找第二block中空闲节点;确定查找到满足分配请求的第二空闲节点时,从第二空闲节点中进行分配内存,并更新第二空闲节点链表,如果第二block对应头节点指针指向的空闲节点被分配,则对应需要更新第二block的头节点指针。
上述实施例中,申请block可以直接调用page分配接口申请,这类申请特别快速。对于无系统的单蓝牙控制器平台,也可以利用预先对内存划分为同等大小的block链表进行快速申请。
可选地,当第一free node/第二free node被分配出去后,可能会转换为一个usednode或者转换为一个used node和一个新的free node。
一个可选的实施方式,从该第一free node/第二free node中进行分配内存,包括:
确定第一free node/第二free node节点容量超过满足分配请求所需内存容量时,从第一free node/第二free node中分配满足分配请求所需的内存容量,若分配后第一free node/第二free node的剩余内存容量满足设定阈值,则将分配后第一free node/第二free node的剩余内存划分为一个新的free node;否则,将该第一free node/第二freenode全部分配。
需要说明的是,满足设定阈值可以为大于等于设定阈值,该设定阈值跟free node的格式有关,例如图4所示的free node格式,相应的设定阈值不小于free_size、mem_flag和next_pointer的大小之和,才能够生成一个新的free node。
下面结合附图进行说明,如图6所示,以第一个分配的block为例,block header占用了block最开始的8字节,其中4个字节的next_block指向NULL,并将其加入block链表的最后,4个字节的free_head指针指向free node1的起始地址。
本实施例中block header的设计主要为了存放该block的块指针next_block和头节点指针free_head。
block header之后的内存都是可被使用的内存,即block header之后为freenode,从开头分配对应申请的内存出去,生成used node1。
假设申请的内存是4bytes时,used node1的最开始两字节8表示used node1实际占用了8字节的空间。接着的0x8338是一个标志(该标志也可以是其它的,可随意定义),表示该内存正被使用。最后的ram占用4字节即为分配出去的被使用的空间,分配接口返回的即为该ram起始位置的地址。
剩下的block空间满足条件则生成一个free node1,最开始0x7F0表示free node1实际占用的空间。0xA55A是一个标志(该标志也可以是其它的,可随意定义),表示该内存未被使用。NULL表示该free node1已经是该block最后的free node。
完成上述分配后,free_head更新为指向free node1的起始地址,free node1中的next_pointer指向空值。
内存分配时通过遍历block查找到满足要求free node,或者通过新分配block查找到满足的free node,先将free node中前面对应申请内存大小的空间分配出去,生成used node。剩下的空间如果超过一个free node的最小大小,则生成新的free node。如果剩下的空间不足一个free node的最小大小,则会一同分配到used node中,如图7所示。
在实施中如果有分配的block,则逐个遍历block中的free node,直到找到满足需求的free node为止。一种实施例中,根据蓝牙控制器FIFO的内存使用特性,先申请的内存先释放,所以内存是从前往后一直分配下去,直到分配到block的末尾为止。如图8所示为本发明实施例中内存分配的详细流程图,主要包括以下步骤:
步骤801,收到内存分配请求时,确定需要分配的内存大小;
步骤802,根据block链表遍历被分配的block,确定是否查找到被分配的block,若是,执行步骤803,否则执行步骤811;
步骤803,根据空闲节点链表在查找到的block中遍历free node,确定是否查找到free node,若是,执行步骤805,否则执行步骤804;
步骤804,根据block链表查找到下一个被分配的block,如有下一个被分配的block,则返回执行步骤803,否则执行步骤811;
步骤805,判断查找的free node大小是否满足要求,若是,执行步骤807,否则执行步骤806;
步骤806,根据空闲节点链表查找该block中下一个free node,如果有下一个freenode,则返回执行步骤805,否则返回步骤804;
步骤807,从查找的free node中划分出对应的内存生成used node;
步骤808,确定free node划分出used node之后剩余内存是否大于设定最小值,若是,执行步骤809,否则执行步骤810;
步骤809,将剩余内存容量生成一个新的free node,并更新空闲节点链表;
步骤810,将剩余内存容量归入上述used node中,并更新空闲节点链表,即从空闲节点链表中删除该free node;
步骤811,申请一个新的block,判断是否申请成功,如是,执行步骤812,否则执行步骤814;
步骤812,将新分配的block加入block链表;
步骤813,从新分配的block中的free node进行内存分配,更新空闲节点链表并结束;
步骤814,返回出错信息。
在本发明实施例提供上述内存分配的基础上,本发明实施例采用如下方式进行内存回收:
收到内存释放请求时,根据请求释放的节点的起始地址及节点容量,确定请求释放的节点的地址域;根据请求释放的节点的地址域,确定请求释放的节点所处的第三block;将请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表。
其中,内存释放请求中携带请求释放的节点的起始地址,通过size可以定位到整个node的地址,可将上述node的地址域与block的地址域进行比较,从而定位到请求释放的节点所处的第三block。
作为一种可选的实施方式,将第三free node连接到第三空闲节点链表,具体地,将第三free node的next pointer指向该第三block中物理地址上的下一个空闲节点(即将下一个空闲节点的地址信息存放在next pointer中),如果没有下一个空闲节点则指向空。如果该第三block中第三free node的前面还有free node,则将该前面的free node的nextpointer指向该第三free node。如果该第三block的第一个free node发生变化则更新该第三block的free_node。
作为另一种可选的实施方式,包括将第三free node连接到第三空闲节点链表的末尾,具体地,将原有的第三空闲节点链表的最后一个空闲节点的节点指针指向该第三free node,将该第三free node的next pointer指向空值。这种将每次释放出的空闲节点加入到对应空闲节点链表的末端,即可以节省释放的时间,又符合FIFO内存使用特性,从而保证分配时优先使用先释放的空间,避免了反复使用上述空闲节点导致多碎片和影响使用寿命的问题。
如图9所示为将used node1释放后新生成free node的示意图,used node的格式和free node的格式相比,实际上只差了一个4字节的next pointer指针。将used node1转换为free node,即将mem_flag的值转换为空闲状态,增加next pointer,且next pointer指向NULL。
作为另一种可选的实施方式,释放节点后,遍历所在block的空闲节点链表,当某个空闲节点的地址域与所述释放节点的地址域相邻时,合并两个地址域相邻的空闲节点。
具体的,当used node被释放后将新生成的第三free node合并到地址相邻的freenode中。如图10所示为将新生成的free node2合并到地址相邻的free node1中示意图,将新生成free node2的free size、状态标志位、next pointer、地址域与free node1的地址域合并,更新free node1中free size的值。
一种可选的实施方式,每个block中空闲节点数量不超过3个。
当数据满足先进先出特性,并且地址域相邻的空闲节点会被合并时,每个block中最多不超过3个空闲节点,合并后最多不超过2个。
对于合并free node的一种实施方式,将请求释放node更新为第三空闲node;确定第三空闲node所处的第三block,通过第三block的空闲节点链表,遍历查找该第三block中空闲node;在查找到其中的第四空闲node,并确定该第四空闲node的下一个node为第三node时,将查找到的第四空闲node与第三空闲node合并为一个空闲node;更新第三block的空闲节点链表中的节点指针。
在实施中,更新第三block对应的第三空闲节点链表之后,还包括:
确定第三block中的node全部为空闲node时,从block链表中删除第三block。
具体可以是删除block链表中整个第三block,包括其块指针、头节点指针及其空闲节点链表,并更新block链表。
通过比较第三block的free node的大小是否与block最大空闲ram大小相等,可以得知第三block是否全部变为空闲状态。如果第三block全部空闲,需要将第三block释放。
具体地,确定block链表中的头指针指向第三block时,从block链表中删除第三block的块指针和头节点指针,删除第三block的空闲节点链表,将头指针更新为指向空值;
确定block链表中的头指针未指向第三block时,确定第三block在block链表中的块指针是否指向空值,若是,将指向该第三block的块指针修改为指向空值,否则将指向第三block的块指针修改为指向该第三block的块指针所指向的被分配的block。
如图11所示,为释放used node的详细过程,具体如下:
步骤1101,收到内存释放请求时,获取释放的used node的头信息;
根据头信息查找到used node的size字段,确定used node的地址范围;
步骤1102,通过block链表查找到第一个被分配的block;
步骤1103,确定释放的used node是否处在查找到的block,若是执行步骤1105,否则,执行步骤1104;
步骤1104,通过block链表查找到下一个被分配的block,返回步骤1103;
步骤1105,将used node转换为free node;
步骤1106,通过遍历对应空闲节点链表,判断该block中是否存在与上述freenode相邻地址的free node,如果是,执行步骤1107,否则步骤1110;
一种判断过程为,通过查找的block的节点链表中的free_node指针,查找第一个free node1,将free node1的地址加偏移size,可以得到下一个node的起始地址。不管该node是used node还是free node,取node的起始地址偏移2字节位置,得到该node的mem_flag。通过判断mem_flag可以知道该node是free node还是used node。如果是used node则不需要合并,如果是free node则需要合并。合并的过程也很方便,例如将free node1的size改为free node1和free node2的size之和。由于合并的过程是物理地址上由前往后的,所以需要遍历该block节点链表上的所有node。
步骤1107,合并两个free node;
步骤1108,确定查找到的block是否为空,若是,执行步骤1109,否则,结束。
确定查找到block中的free node的大小与定义的block的ram大小一致时,说明block为空。
步骤1109,释放查找的block,并更新block链表,然后结束。
block链表的更新方式参见前面的描述,该block对应的空闲节点链表随着该block被释放也不存在了。这里不再详述。
步骤1110,将释放出的free node加入对应空闲节点链表的末端,并更新相应节点指针信息,然后结束。
根据本发明上述实施例提供的内存分配方法,刚开始时,分配一个block,如图12所示,该block内存从前慢慢往后开始分配,且还未有释放回收的内存,则block中只有一个free node处于内存的尾部,即标号(1)对应的占用情况。
当然,一般情况下内存在block全部内存用完之前就会有释放的,根据FIFO的特性,应该是先释放used node1,再释放used node2这样的顺序,所以释放的used node可以合并为一块连续的物理空间,即标号(2)中的free node2。
当block的内存已经分配到末尾后,free node又剩下一个,即标号(3)处于block的头部。
接着继续从头部分配内存,free node会移到block的中间,即标号(4)对应的内存占用情况。
最后还有一种情况是,内存分配到末尾时,free node1剩下的空间太少,比如只有8bytes,而后续又一直没有申请小于5bytes的空间,则会导致后续空间需要从free node2分配,而free node1一直没能分配出去。即标号(5)对应的node占用情况。
从上图的分析可知,如果申请分配分配的数据流符合FIFO特性,block中合并freenode后最多只会有两个free node,只需要花费很短的查询时间,就能分配内存。
本发明实施例提供上述内存分配方法可以应用于蓝牙控制器或其它具有FIFI数据流的设备,当然也可以应用于具有其他数据流的设备。
作为一种可选的实施方式,还可以进一步对内存进行分类管理,本实施例可以根据请求内存分配的数据的特征,对数据进行分类得到多类数据流,针对每一类数据流建立一个block链表,针对每个block建立一个空闲节点链表。
可选地,数据的特征包括以下任一或任多个特征:
存储数据的生命周期;
存储数据的数据流向;
存储数据的先入先出FIFO特性。
作为一种可选的实施方式,针对先入先出FIFO的至少一类数据流,对于每一类FIFO的数据流,建立一个block链表,针对每个block建立一个空闲节点链表。即需要针对每类数据流建立一个head,初始化该head为NULL。
下面以本发明内存分配方法应用于蓝牙控制器,结合蓝牙控制器的数据流特征给出具体的数据流分类。
常见的蓝牙控制器有用于接收空中所有ACL链路的控制命令的数据流,假设叫做LMP_IN;有用于接收空中所有ACL链路的用户数据流,假设叫做L2CAP_IN;有用于接收空中所有同步链路的语音数据流,假设叫做SCO_IN;有用于接收HOST端命令数据流,假设叫做HCI_CMD;有用于发送给HOST端的事件数据流,假设叫做HCI_EVT;有用于发送空中不同ACL链路的控制命令的数据流,假设叫做LMP_OUT;有用于发送空中不同ACL链路的用户数据流,假设叫做L2CAP_OUT;有用于发送空中不同同步链路的语音数据流,假设叫做SCO_OUT;有用于控制器内部事件处理的队列,假设叫做SHCED_EVT。这些数据流和队列独自都具有先进先出的特性,但如果每个数据流都要独立分配一个内存管理,则会导致内存块太过零散,无法较好利用大内存统一分配的优势。
本发明实施例只分配了三个内存管理模块,假设分别叫做MEM_FIFO_OUT、MEM_FIFO_NONE_OUT和MEM_NONE_FIFO。
其中第一类数据流包括以下部分或全部:LMP_OUT、L2CAP_OUT、SCO_OUT,统一由MEM_FIFO_OUT内存管理模块管理。它们发送往空中的数据流,可能会由于空中链路的阻塞而导致生命周期变得比较长,可能会由于蓝牙基带资源管理器的调度而变成非严格意义上的FIFO模型。但由于蓝牙控制器限定了ACL链路和同步链路的buffer个数,所以一切还在可控的范围内。
第二类数据流包括以下部分或全部:LMP_IN、L2CAP_IN、HCI_CMD、HCI_EVT、SCO_IN、SHCED_EVT,统一由MEM_FIFO_NONE_OUT内存管理模块管理。这些从空中或者从HOST端接收的数据流,都会按照数据产生的顺序,挂到控制器内部统一的事件队列上,按照先进先出的顺序逐一处理。它们的生命周期最短,唯一的不确定因素是事件处理线程可能会被系统其它更高优先级的线程阻塞。
第三类数据流包括:蓝牙控制器中的全局指针结构体,一般都是常驻或者分场景常驻的内存,统一由MEM_NONE_FIFO内存管理模块管理。它们虽然不是FIFO模型的内存,但由于内存一旦分配出去,就长时间占用的特性,导致在一段时间周期内去观察内存的状态时,会发现这是一种纯消耗的内存,它们也算特殊的FIFO模型了。
本发明将控制器内存进行分类管理,设计了一套内存快速分配方法,特别有利于内存主要为先入先出使用特性的控制器。内存管理的顶级是一张block链表,能够自适应扩展。Block格式、free node格式和used node格式的设计,占用极少的管理空间,减少内存浪费。如果控制器数据流有先入先出及生命周期短等特性,实际使用过程中block的个数会很少(一般为1到2个)。通过合并后,每个block中free node的个数也会很少。所以,在分配空间时可以快速的找到合适的空间并进行分配。释放空间时,可以快速找到对应的block,并进行合并释放。
实施例2
本发明实施例提供一种内存分配装置,包括处理器和存储器,所述处理器用于:
针对一个内存构建至少一个用于链接被分配的内存块block的block链表;
在所述block链表的基础上,构建至少一个用于链接block中空闲节点的空闲节点链表;
收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存。
可选地,每个所述block链表对应一个头指针,用于指向对应block链表中第一个被分配的block;上述处理器具体用于:
将从所述内存中分配出的每个block连接到对应的block链表,所述block被划分为至少一个节点,每个block具有指向所在block链表中下一个被分配block的块指针,及指向所在block的空闲节点链表中第一个空闲节点的头节点指针;
将每个block的空闲节点连接到该block的空闲节点链表,所述空闲节点具有指向所在空闲节点链表中下一个空闲节点的节点指针。
上述处理器所述收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存,包括:
根据所述头指针和所述块指针遍历所述block链表查找被分配的block;
在查找到每个被分配的block时,根据所述block头节点指针及所述block的空闲节点链接链表,遍历查找所述block中空闲节点;
确定查找到满足分配请求的第一空闲节点时,从该第一空闲节点中进行分配内存,并更新所述block的空闲节点链表。
可选地,上述处理器还用于:
收到初次内存分配请求时,从内存中新分配一个第一block并连接到block链表。
可选地,上述处理器还用于:
确定未查找到满足分配请求的第一空闲节点时,从内存中新分配一个第二block连接到所述block链表的最后;
根据所述第二block的头节点指针及对应第二空闲节点链表,遍历查找所述第二block中空闲节点;
确定查找到满足分配请求的第二空闲节点时,从所述第二空闲节点中进行分配内存,并更新所述第二空闲节点链表。
可选地,上述处理器具体用于:
确定第一空闲节点/第二空闲节点容量超过满足分配请求所需内存容量时,从第一空闲节点/第二空闲节点中分配满足分配请求所需的内存容量,若分配后剩余部分内存容量大于等于设定阈值,则将所述分配后剩余部分划分为一个新的空闲节点;
否则,将该第一空闲节点/第二空闲节点全部分配。
可选地,上述处理器还用于:
收到内存释放请求时,根据请求释放的节点的起始地址及节点容量,确定所述请求释放的节点的地址域;
根据所述请求释放的节点的地址域,确定所述请求释放的节点所处的第三block;
将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表。
可选地,上述处理器还用于:
将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表之后,确定第三block中的节点全部为空闲节点时,从block链表中删除第三block。
可选地,上述处理器还用于:
根据请求内存分配的数据的特征,对数据进行分类得到多类数据流;
其中,针对每一类数据流建立一个block链表,针对每个block建立一个空闲节点链表。
可选地,所述数据的特征包括以下任一或任多个特征:
存储数据的生命周期;
存储数据的数据流向;
存储数据的先入先出FIFO特性。
可选地,多类数据流包括如下任一或任多类数据流:
第一类数据流,包括以下部分或全部:用于发送空中不同ACL链路的控制命令的数据流、用于发送空中不同ACL链路的用户数据流、用于发送空中不同同步链路的语音数据流;
第二类数据流,包括以下部分或全部:用于接收空中所有ACL链路的控制命令的数据流、用于接收空中所有ACL链路的用户数据流、用于接收HOST端命令数据流、用于发送给HOST端的事件数据流、用于接收空中所有同步链路的语音数据流、用于控制器内部事件处理的队列数据流;
第三类数据流,包括全局指针结构体数据流。
可选地,每个block中空闲节点数量不超过3个。
本发明实施例还提供一种内存分配装置,如图13所示,包括:
第一级链表建立单元1301,用于针对一个内存构建至少一个用于链接被分配的内存块block的block链表;
第二级链表建立单元1302,用于在所述block链表的基础上,构建至少一个用于链接block中空闲节点的空闲节点链表;
内存分配单元1303,用于收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存。
可选地,每个所述block链表对应一个头指针,用于指向对应block链表中第一个被分配的block;第一级链表建立单元针对一个内存构建至少一个用于链接被分配的内存块block的block链表包括:
将从所述内存中分配出的每个block连接到对应的block链表,所述block被划分为至少一个节点,每个block具有指向所在block链表中下一个被分配block的块指针,及指向所在block的空闲节点链表中第一个空闲节点的头节点指针;
第二级链表建立单元构建至少一个用于链接block中的空闲节点的空闲节点链表包括:
将每个block的空闲节点连接到该block的空闲节点链表,所述空闲节点具有指向所在空闲节点链表中下一个空闲节点的节点指针。
上述内存分配单元收到内存分配请求时,根据所述至少一个block链表和所述至少一个空闲节点链表,实现分配内存,包括:
根据所述头指针和所述块指针遍历所述block链表查找被分配的block;
在查找到每个被分配的block时,根据所述block头节点指针及所述block的空闲节点链接链表,遍历查找所述block中空闲节点;
确定查找到满足分配请求的第一空闲节点时,从该第一空闲节点中进行分配内存,并更新所述block的空闲节点链表。
可选地,内存分配单元还用于:
收到初次内存分配请求时,从内存中新分配一个第一block并连接到block链表。
可选地,内存分配单元还用于:
确定未查找到满足分配请求的第一空闲节点时,从内存中新分配一个第二block连接到所述block链表的最后;
根据所述第二block的头节点指针及对应第二空闲节点链表,遍历查找所述第二block中空闲节点;
确定查找到满足分配请求的第二空闲节点时,从所述第二空闲节点中进行分配内存,并更新所述第二空闲节点链表。
可选地,内存分配单元从所述第一空闲节点/第二空闲节点中进行分配内存,包括:
确定第一空闲节点/第二空闲节点容量超过满足分配请求所需内存容量时,从第一空闲节点/第二空闲节点中分配满足分配请求所需的内存容量,若分配后剩余部分内存容量大于等于设定阈值,则将所述分配后剩余部分划分为一个新的空闲节点;
否则,将该第一空闲节点/第二空闲节点全部分配。
可选地,上述内存分配单元还用于:
收到内存释放请求时,根据请求释放的节点的起始地址及节点容量,确定所述请求释放的节点的地址域;
根据所述请求释放的节点的地址域,确定所述请求释放的节点所处的第三block;
将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表。
可选地,内存分配单元将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表之后,还用于:
确定第三block中的节点全部为空闲节点时,从block链表中删除第三block。
可选地,该内存分配装置还包括:
数据分类单元,用于根据请求内存分配的数据的特征,对数据进行分类得到多类数据流;其中,针对每一类数据流建立一个block链表,针对每个block建立一个空闲节点链表。
可选地,所述数据的特征包括以下任一或任多个特征:
存储数据的生命周期;
存储数据的数据流向;
存储数据的先入先出FIFO特性。
可选地,多类数据流包括如下任一或任多类数据流:
第一类数据流,包括以下部分或全部:用于发送空中不同ACL链路的控制命令的数据流、用于发送空中不同ACL链路的用户数据流、用于发送空中不同同步链路的语音数据流;
第二类数据流,包括以下部分或全部:用于接收空中所有ACL链路的控制命令的数据流、用于接收空中所有ACL链路的用户数据流、用于接收HOST端命令数据流、用于发送给HOST端的事件数据流、用于接收空中所有同步链路的语音数据流、用于控制器内部事件处理的队列数据流;
第三类数据流,包括全局指针结构体数据流。
可选地,每个block中空闲节点数量不超过3个。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

Claims (12)

1.一种内存分配方法,其特征在于,该方法包括:
将从内存中分配出的每个block连接到对应的block链表,每个所述block链表对应一个头指针,用于指向对应block链表中第一个被分配的block, 所述block被划分为至少一个节点,每个block具有指向所在block链表中下一个被分配block的块指针,及指向所在block的空闲节点链表中第一个空闲节点的头节点指针;
在所述block链表的基础上,将每个block的空闲节点连接到该block的空闲节点链表,所述空闲节点具有指向所在空闲节点链表中下一个空闲节点的节点指针;
收到内存分配请求时,根据所述头指针和所述块指针遍历所述block链表查找被分配的block;
在查找到每个被分配的block时,根据所述block头节点指针及所述block的空闲节点链接链表,遍历查找所述block中空闲节点;
确定查找到满足分配请求的第一空闲节点时,从该第一空闲节点中进行分配内存,并更新所述block的空闲节点链表;
其中,所述从所述第一空闲节点中进行分配内存,包括:
确定第一空闲节点容量超过满足分配请求所需内存容量时,从第一空闲节点中分配满足分配请求所需的内存容量,若分配后剩余部分内存容量大于等于设定阈值,则将所述分配后剩余部分划分为一个新的空闲节点;
否则,将该第一空闲节点全部分配。
2.根据权利要求1所述的方法,其特征在于,还包括:
收到初次内存分配请求时,从内存中新分配一个第一block并连接到block链表。
3.根据权利要求1所述的方法,其特征在于,还包括:
确定未查找到满足分配请求的第一空闲节点时,从内存中新分配一个第二block连接到所述block链表的最后;
根据所述第二block的头节点指针及对应第二空闲节点链表,遍历查找所述第二block中空闲节点;
确定查找到满足分配请求的第二空闲节点时,从所述第二空闲节点中进行分配内存,并更新所述第二空闲节点链表。
4.根据权利要求1所述的方法,其特征在于,还包括:
收到内存释放请求时,根据请求释放的节点的起始地址及节点容量,确定所述请求释放的节点的地址域;
根据所述请求释放的节点的地址域,确定所述请求释放的节点所处的第三block;
将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表。
5.根据权利要求4所述的方法,其特征在于,将所述请求释放的节点更新为第三空闲节点,并更新第三block对应的第三空闲节点链表之后,还包括:
确定第三block中的节点全部为空闲节点时,从block链表中删除第三block。
6.根据权利要求1所述的方法,其特征在于,还包括:
根据请求内存分配的数据的特征,对数据进行分类得到多类数据流;
其中,针对每一类数据流建立一个block链表,针对每个block建立一个空闲节点链表。
7.根据权利要求6所述的方法,其特征在于,所述数据的特征包括以下任一或任多个特征:
存储数据的生命周期;
存储数据的数据流向;
存储数据的先入先出FIFO特性。
8.根据权利要求6或7所述的方法,其特征在于,多类数据流包括如下任一或任多类数据流:
第一类数据流,包括以下部分或全部:用于发送空中不同ACL链路的控制命令的数据流、用于发送空中不同ACL链路的用户数据流、用于发送空中不同同步链路的语音数据流;
第二类数据流,包括以下部分或全部:用于接收空中所有ACL链路的控制命令的数据流、用于接收空中所有ACL链路的用户数据流、用于接收HOST端命令数据流、用于发送给HOST端的事件数据流、用于接收空中所有同步链路的语音数据流、用于控制器内部事件处理的队列数据流;
第三类数据流,包括全局指针结构体数据流。
9.根据权利要求1或6所述的方法,其特征在于,每个block中空闲节点数量不超过3个。
10.一种内存分配装置,其特征在于,包括处理器和存储器,其中,所述存储器存储有程序代码,当所述程序代码被所述处理器执行时,使得所述处理器执行权利要求1~9任一所述方法的步骤。
11.一种内存分配装置,其特征在于,包括:
block链表构建单元,用于将从内存中分配出的每个block连接到对应的block链表,每个所述block链表对应一个头指针,用于指向对应block链表中第一个被分配的block所述block被划分为至少一个节点,每个block具有指向所在block链表中下一个被分配block的块指针,及指向所在block的空闲节点链表中第一个空闲节点的头节点指针;
空闲节点链表构建单元,用于在所述block链表的基础上,将每个block的空闲节点连接到该block的空闲节点链表,所述空闲节点具有指向所在空闲节点链表中下一个空闲节点的节点指针;
内存分配单元,用于收到内存分配请求时,根据所述头指针和所述块指针遍历所述block链表查找被分配的block;在查找到每个被分配的block时,根据所述block头节点指针及所述block的空闲节点链接链表,遍历查找所述block中空闲节点;确定查找到满足分配请求的第一空闲节点时,从该第一空闲节点中进行分配内存,并更新所述block的空闲节点链表;
其中,所述从所述第一空闲节点中进行分配内存,包括:
确定第一空闲节点容量超过满足分配请求所需内存容量时,从第一空闲节点中分配满足分配请求所需的内存容量,若分配后剩余部分内存容量大于等于设定阈值,则将所述分配后剩余部分划分为一个新的空闲节点;
否则,将该第一空闲节点全部分配。
12.一种计算机存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1~9任一所述方法的步骤。
CN201811333061.4A 2018-11-09 2018-11-09 一种内存分配方法及装置 Active CN111177017B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811333061.4A CN111177017B (zh) 2018-11-09 2018-11-09 一种内存分配方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811333061.4A CN111177017B (zh) 2018-11-09 2018-11-09 一种内存分配方法及装置

Publications (2)

Publication Number Publication Date
CN111177017A CN111177017A (zh) 2020-05-19
CN111177017B true CN111177017B (zh) 2022-05-27

Family

ID=70647954

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811333061.4A Active CN111177017B (zh) 2018-11-09 2018-11-09 一种内存分配方法及装置

Country Status (1)

Country Link
CN (1) CN111177017B (zh)

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN112069198B (zh) * 2020-07-16 2021-09-10 中科驭数(北京)科技有限公司 Sql解析优化方法和装置
CN113419858B (zh) * 2021-06-30 2024-02-13 明见(厦门)技术有限公司 一种动态内存分配方法
CN113821191A (zh) * 2021-10-13 2021-12-21 芯河半导体科技(无锡)有限公司 一种可配置fifo深度的装置及方法
CN116935915A (zh) * 2022-04-08 2023-10-24 长鑫存储技术有限公司 半导体存储器、刷新方法、控制方法和电子设备
CN115964002B (zh) * 2023-03-13 2023-07-07 杭州炬华科技股份有限公司 一种电能表终端档案管理方法、装置、设备及介质

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7111289B2 (en) * 2001-12-21 2006-09-19 Agere Systems, Inc. Method for implementing dual link list structure to enable fast link-list pointer updates
CN100452761C (zh) * 2004-04-27 2009-01-14 华为技术有限公司 通信设备中数据包的存储方法
CN101149703A (zh) * 2007-10-10 2008-03-26 中兴通讯股份有限公司 一种固定内存的管理方法
CN101950273B (zh) * 2010-09-26 2012-05-23 中国人民解放军海军工程大学 一种dsp数据区动态管理方法
CN102063385A (zh) * 2010-12-23 2011-05-18 深圳市金宏威实业发展有限公司 一种内存管理方法和系统
CN105302734B (zh) * 2014-07-22 2018-04-06 北京畅游天下网络技术有限公司 内存管理系统和方法

Also Published As

Publication number Publication date
CN111177017A (zh) 2020-05-19

Similar Documents

Publication Publication Date Title
CN111177017B (zh) 一种内存分配方法及装置
CN105245912B (zh) 一种缓存视频数据及读取视频数据的方法及装置
US11467975B2 (en) Data processing method and NVMe storage device
WO2017133623A1 (zh) 一种数据流处理方法、装置和系统
US10044646B1 (en) Systems and methods for efficiently storing packet data in network switches
US10268410B2 (en) Efficient modification of storage system metadata
US10740006B2 (en) System and method for enabling high read rates to data element lists
US9569291B1 (en) Systems and methods for inter-process messaging
CN110795028B (zh) 针对网络装置实施阶层分布式链接列表的系统及方法
CN108121603B (zh) 一种嵌入式系统内存管理方法
JP7074839B2 (ja) パケット処理
US7000073B2 (en) Buffer controller and management method thereof
CN110858162A (zh) 内存管理方法及装置、服务器
US9785367B2 (en) System and method for enabling high read rates to data element lists
CN107025184B (zh) 一种数据管理方法及装置
CN113805816B (zh) 一种磁盘空间管理方法、装置、设备及存储介质
US10594631B1 (en) Methods and apparatus for memory resource management in a network device
CN114024844B (zh) 数据调度方法、数据调度装置及电子设备
CN114401072B (zh) 一种基于hinoc协议的拆帧重排序队列的动态缓存控制方法及系统
CN108139767B (zh) 针对网络装置实施分布式链接列表的系统及方法
CN109040214B (zh) 一种云环境下可靠性增强的服务部署方法
US9128785B2 (en) System and method for efficient shared buffer management
CN115878309A (zh) 资源分配方法、装置、处理核、设备和计算机可读介质
CN109302353B (zh) 一种分配报文缓存空间的方法及装置
CN111131197B (zh) 一种过滤策略管理系统及其方法

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
CB02 Change of applicant information
CB02 Change of applicant information

Address after: 519085 High-tech Zone, Tangjiawan Town, Zhuhai City, Guangdong Province

Applicant after: ACTIONS TECHNOLOGY Co.,Ltd.

Address before: 519085 High-tech Zone, Tangjiawan Town, Zhuhai City, Guangdong Province

Applicant before: ACTIONS (ZHUHAI) TECHNOLOGY Co.,Ltd.

GR01 Patent grant
GR01 Patent grant