CN111143058A - 一种基于后备列表的内存管理方法 - Google Patents

一种基于后备列表的内存管理方法 Download PDF

Info

Publication number
CN111143058A
CN111143058A CN201911301923.XA CN201911301923A CN111143058A CN 111143058 A CN111143058 A CN 111143058A CN 201911301923 A CN201911301923 A CN 201911301923A CN 111143058 A CN111143058 A CN 111143058A
Authority
CN
China
Prior art keywords
memory
memory block
list
allocable
linked list
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.)
Pending
Application number
CN201911301923.XA
Other languages
English (en)
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.)
Changsha Xinhong Software Ltd
Original Assignee
Changsha Xinhong Software 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 Changsha Xinhong Software Ltd filed Critical Changsha Xinhong Software Ltd
Priority to CN201911301923.XA priority Critical patent/CN111143058A/zh
Publication of CN111143058A publication Critical patent/CN111143058A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5022Mechanisms to release resources

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Techniques For Improving Reliability Of Storages (AREA)

Abstract

一种基于后备列表的内存管理方法,包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表。可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。该方法具有可实现无锁分配和释放内存,且能在多个系统模块间共用的特点。

Description

一种基于后备列表的内存管理方法
技术领域
本发明涉及计算机系统软件编程领域,特别是一种基于后备列表的内存管理方法。
背景技术
在计算机系统软件中经常需要分配小块内存用于各种数据结构,对于一些频繁分配和释放内存的应用场景,经常需要分配大量相同大小的内存。后备列表(LookasideList)是一种常用的分配大量相同大小内存的方法,其核心思想是将大量相同大小的内存构成FILO序列的单向链表,分配内存时直接从链表取出一块,释放内存时将其放回链表,整个过程非常简单快速。当后备列表使用CAS原子操作时可以实现在多个处理器或线程之间无锁的分配和释放内存,例如Windows内核就是使用CAS原子操作的后备列表来为驱动程序和系统模块提供轻量级的小块内存分配方案。Linux中的SLAB分配器也使用了类似的方法,不过在Windows中后备列表更侧重于专属用途,一般不会在多个模块间共享。而Linux的SLAB虽然可以在多个模块间共用但实现过于复杂,而且也用到了锁机制。
发明内容
本发明的目的是提供一种基于后备列表的内存管理方法。该方法具有可实现无锁分配和释放内存,且能在多个系统模块间共用的特点。
一种基于后备列表的内存管理方法,该方法包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表。内存块通常远远大于分配内存的大小范围,例如64KB大小的内存块。可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。
根据申请内存的大小计算可分配的内存块的类型,若申请内存的大小为N则将N–1的值右移6个二进制位得到系数F。使用从高位到低位的二进制位扫描操作找到系数F中最高为1的二进制位X,如果F = 0则X = 0。再将N–1的值右移X + 5个二进制位得到基数值B,最后计算出可分配的内存块的类型值T = B + X + X。根据该算法计算出的类型值,从0到9可依次对应下列分配粒度:32、64、96、128、192、256、384、512、768、1024。即当0 <N≤32时按32字节粒度分配,当32< N≤64时按64字节粒度分配,当64< N≤96时按96字节粒度分配,以此类推。
分配内存时先根据申请内存的大小计算可分配的内存块的类型,再根据类型取对应链表中的第一个可分配的内存块。若链表中没有可分配的内存块则从后备列表中取一个空闲的内存块,若后备列表中也没有空闲的内存块则从系统内存中分配一个新的内存块,然后将内存块按类型对应的分配粒度分割成多个大小相同的片段并将内存块加入该链表成为可分配的内存块。从可分配的内存块中分配一个内存片段,若该内存块中所有片段全部分配完则将内存块从对应链表中移除。
释放内存时根据目标地址所在内存块将释放的内存片段标记为已释放。释放内存后,若内存块中只有一个可分配的内存片段,则将内存块添加到对应类型的链表中。若内存块中的所有内存片段已全部释放,则将内存块从链表中移除并作为空闲的内存块加入后备列表。当后备列表中的空闲的内存块积累到预设数量时,将后备列表中的空闲的内存块完全释放。
在多处理器系统中为每个处理器配置一组由可分配的内存块构成的链表,使得每个处理器在处理分配内存时仅从自己私有的链表中取可分配的内存块,没有可分配的内存块时再到后备列表中取空闲的内存块或从系统内存中分配一个新的内存块。
本发明与现有技术相比具有如下特点:使用后备列表提供空闲的内存块,再通过对内存块进行分类和切割实现的小内存分配机制。配合无锁化的链表实现内存的分配和释放过程完全无锁化,且后备列表的存在使得这种内存分配机制能像Linux的SLAB分配器一样在多个模块间使用。
附图说明
附图1为本发明具体实施方案的示意图;
附图2为本发明具体实施方案中可分配的内存块类型和对应分配粒度以及分割示意图;
附图3为本发明具体实施方案中分配内存时简化的主要流程示意图。
具体实施方式
如附图1所示:本发明由一个单向链表构成的后备列表101以及多个由可分配的内存块构成的链表组成,处理器CPU0和CPU1各有一组私有的链表。当CPU0从类型为“0”的可分配的内存块分配内存时取私有链表102中的可分配的内存块,当CPU1从类型为“0”的可分配的内存块分配内存时取私有链表103中的可分配的内存块,CPU0和CPU1之间不会互相干扰。只有当链表102和链表103都没有可分配的内存块时,CPU0和CPU1才会同时去后备列表101取空闲的内存块。
图1中所示处理器数量和链表数量并非实际应用中的场景,且图1中的双向链表可以是环形链表,该图仅用于在小规模示例中展现本发明的意图。
如附图2所示:内存块201是类型为“0”的可分配的内存块,分配粒度为32字节。内存块202是类型为“1”的可分配的内存块,分配粒度为64字节。内存块203是类型为“2”的可分配的内存块,分配粒度为96字节。所有内存块均按类型对应的分配粒度分割成多个大小相同的片段,分配内存时每次分配一个片段。
如附图3所示:分配内存时执行步骤301根据申请内存的大小计算可分配的内存块的类型,再执行步骤302根据类型判断对应链表中是否有可分配的内存块,若有则执行步骤303从可分配的内存块中分配一个内存片段。若链表中没有可分配的内存块则执行步骤304判断后备列表中是否有空闲的内存块,若有则执行步骤305取一个空闲的内存块,若没有则执行步骤307从系统内存中分配一个新的内存块。然后执行步骤306将内存块按类型对应的分配粒度分割成多个大小相同的片段并将内存块加入该链表成为可分配的内存块,再执行步骤303从可分配的内存块中分配一个内存片段,完成内存分配。
执行步骤303时,若该内存块中所有片段全部分配完则将内存块从对应链表中移除。释放内存时根据目标地址所在内存块,将释放的内存片段标记为已释放。释放内存后,若内存块中只有一个可分配的内存片段,则将内存块添加到对应类型的链表中。若内存块中的所有内存片段已全部释放,则将内存块从链表中移除并作为空闲的内存块加入后备列表。
当后备列表中的空闲的内存块积累到一定数量时,例如1024个空闲的内存块,将后备列表中的空闲的内存块完全释放。
本发明涉及到计算机系统中二进制位的运算操作,特别是涉及二进制位扫描的操作,在一些处理器平台上有专门的指令来提供硬件支持以提高性能,例如在Intel的x86平台上可以使用BSR指令来快速获得目标值中最高为“1”的位。
对于本专业领域的技术人员,能够熟练的在不同处理器平台上使用该平台的相关机器指令实现该操作。对于没有提供硬件支持的处理器平台,本专业领域的技术人员也能熟练的使用且不限于二分法和查表法来获得目标值中最高为1的位。不能将这些实现上的差异解释为超出本发明的范畴。

Claims (8)

1.一种基于后备列表的内存管理方法,该方法包括至少一个全局共享的后备列表用于存放空闲的内存块,以及多个由可分配的内存块构成的链表;其特征是:可分配的内存块有多种类型,每种类型对应一种分配粒度,每个可分配的内存块按类型对应的分配粒度分割成多个大小相同的片段,每个链表只包含同一类型的可分配的内存块。
2.根据权利要求1所述的一种基于后备列表的内存管理方法,该方法还包括根据申请内存的大小计算可分配的内存块类型的方法,其特征是:若申请内存的大小为N则将N–1的值右移6个二进制位得到系数F;使用从高位到低位的二进制位扫描操作找到系数F中最高为1的二进制位X,如果F = 0则X = 0;再将N–1的值右移X + 5个二进制位得到基数值B,最后计算出可分配的内存块的类型值T = B + X + X。
3.根据权利要求1所述的一种基于后备列表的内存管理方法,其特征是:分配内存时先根据申请内存的大小计算可分配的内存块的类型,再根据类型取对应链表中的第一个可分配的内存块。
4.根据权利要求3所述的一种基于后备列表的内存管理方法,其特征是:若链表中没有可分配的内存块则从后备列表中取一个空闲的内存块,若后备列表中也没有空闲的内存块则从系统内存中分配一个新的内存块,然后将内存块按类型对应的分配粒度分割成多个大小相同的片段并将内存块加入该链表成为可分配的内存块。
5.根据权利要求3或4所述的一种基于后备列表的内存管理方法,其特征是:从可分配的内存块中分配一个内存片段,若该内存块中所有片段全部分配完则将内存块从对应链表中移除。
6.根据权利要求1所述的一种基于后备列表的内存管理方法,其特征是:释放内存时根据目标地址所在内存块将释放的内存片段标记为已释放;释放内存后,若内存块中只有一个可分配的内存片段,则将内存块添加到对应类型的链表中;若内存块中的所有内存片段已全部释放,则将内存块从链表中移除并作为空闲的内存块加入后备列表。
7.根据权利要求6所述的一种基于后备列表的内存管理方法,其特征是:当后备列表中的空闲的内存块积累到预设数量时,将后备列表中的空闲的内存块完全释放。
8.根据权利要求1所述的一种基于后备列表的内存管理方法,还包括在多处理器系统中为每个处理器配置一组由可分配的内存块构成的链表,其特征是:每个处理器在处理分配内存时先从自己私有的链表中取可分配的内存块,没有可分配的内存块时再到后备列表中取空闲的内存块或从系统内存中分配一个新的内存块。
CN201911301923.XA 2019-12-17 2019-12-17 一种基于后备列表的内存管理方法 Pending CN111143058A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201911301923.XA CN111143058A (zh) 2019-12-17 2019-12-17 一种基于后备列表的内存管理方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201911301923.XA CN111143058A (zh) 2019-12-17 2019-12-17 一种基于后备列表的内存管理方法

Publications (1)

Publication Number Publication Date
CN111143058A true CN111143058A (zh) 2020-05-12

Family

ID=70518601

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201911301923.XA Pending CN111143058A (zh) 2019-12-17 2019-12-17 一种基于后备列表的内存管理方法

Country Status (1)

Country Link
CN (1) CN111143058A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN116627359A (zh) * 2023-07-24 2023-08-22 成都佰维存储科技有限公司 内存管理方法、装置、可读存储介质及电子设备
WO2024078429A1 (zh) * 2022-10-12 2024-04-18 杭州阿里云飞天信息技术有限公司 内存管理方法、装置、计算机设备及存储介质

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060112254A1 (en) * 2004-11-20 2006-05-25 Piper Scott A Satisfying memory allocation requests from memory pool or lookaside lists based on memory size requested to be allocated
WO2013163008A1 (en) * 2012-04-27 2013-10-31 Microsoft Corporation Systems and methods for partitioning of singly linked lists for allocation memory elements

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060112254A1 (en) * 2004-11-20 2006-05-25 Piper Scott A Satisfying memory allocation requests from memory pool or lookaside lists based on memory size requested to be allocated
WO2013163008A1 (en) * 2012-04-27 2013-10-31 Microsoft Corporation Systems and methods for partitioning of singly linked lists for allocation memory elements
CN104254839A (zh) * 2012-04-27 2014-12-31 微软公司 用于分割单链表以供分配存储器元素的系统和方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
闫家年;陈文光;郑纬民;: "面向结构体数据布局优化的高效内存管理" *

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2024078429A1 (zh) * 2022-10-12 2024-04-18 杭州阿里云飞天信息技术有限公司 内存管理方法、装置、计算机设备及存储介质
CN116627359A (zh) * 2023-07-24 2023-08-22 成都佰维存储科技有限公司 内存管理方法、装置、可读存储介质及电子设备
CN116627359B (zh) * 2023-07-24 2023-11-14 成都佰维存储科技有限公司 内存管理方法、装置、可读存储介质及电子设备

Similar Documents

Publication Publication Date Title
US5784698A (en) Dynamic memory allocation that enalbes efficient use of buffer pool memory segments
US9329988B2 (en) Parallel dynamic memory allocation using a nested hierarchical heap
DE102013022712B4 (de) Virtuelle Speicherstruktur für Coprozessoren, die Speicherallokationsbegrenzungen haben
US20070156997A1 (en) Memory allocation
CN110008009B (zh) 在运行时绑定常量以提高资源利用率
US9710306B2 (en) Methods and apparatus for auto-throttling encapsulated compute tasks
US10705951B2 (en) Shared fabric attached memory allocator
US20230196502A1 (en) Dynamic kernel memory space allocation
CN107430529B (zh) 大型内存数据库的负载均衡的装置
US9507638B2 (en) Compute work distribution reference counters
US20140359248A1 (en) Memory allocation improvements
US20130198419A1 (en) Lock-free fifo
US10824555B2 (en) Method and system for flash-aware heap memory management wherein responsive to a page fault, mapping a physical page (of a logical segment) that was previously reserved in response to another page fault for another page in the first logical segment
US10853140B2 (en) Slab memory allocator with dynamic buffer resizing
US11347698B2 (en) Garbage collection for hash-based data structures
US8095742B2 (en) Microcomputer with address translation circuit
US20170344398A1 (en) Accelerator control device, accelerator control method, and program storage medium
CN111143058A (zh) 一种基于后备列表的内存管理方法
Winter et al. Ouroboros: virtualized queues for dynamic memory management on GPUs
US20220206839A1 (en) Address mapping-aware tasking mechanism
CN117271136A (zh) 数据处理方法、装置、设备和存储介质
CN110178119B (zh) 处理业务请求的方法、装置与存储系统
US12019629B2 (en) Hash-based data structure
WO2017095367A1 (en) Managing objects stored in memory
US9990303B2 (en) Sharing data structures between processes by semi-invasive hybrid approach

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