CN111143058A - 一种基于后备列表的内存管理方法 - Google Patents
一种基于后备列表的内存管理方法 Download PDFInfo
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5016—Allocation 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/46—Multiprogramming arrangements
- G06F9/50—Allocation of resources, e.g. of the central processing unit [CPU]
- G06F9/5005—Allocation of resources, e.g. of the central processing unit [CPU] to service a request
- G06F9/5011—Allocation 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/5022—Mechanisms 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所述的一种基于后备列表的内存管理方法,还包括在多处理器系统中为每个处理器配置一组由可分配的内存块构成的链表,其特征是:每个处理器在处理分配内存时先从自己私有的链表中取可分配的内存块,没有可分配的内存块时再到后备列表中取空闲的内存块或从系统内存中分配一个新的内存块。
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)
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)
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 |
-
2019
- 2019-12-17 CN CN201911301923.XA patent/CN111143058A/zh active Pending
Patent Citations (3)
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)
Title |
---|
闫家年;陈文光;郑纬民;: "面向结构体数据布局优化的高效内存管理" * |
Cited By (3)
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 |