CN106844041B - 内存管理的方法及内存管理*** - Google Patents
内存管理的方法及内存管理*** Download PDFInfo
- Publication number
- CN106844041B CN106844041B CN201611241110.2A CN201611241110A CN106844041B CN 106844041 B CN106844041 B CN 106844041B CN 201611241110 A CN201611241110 A CN 201611241110A CN 106844041 B CN106844041 B CN 106844041B
- Authority
- CN
- China
- Prior art keywords
- memory
- module
- thread
- thread module
- management
- 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
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)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本申请公开了一种内存管理的方法及内存管理***,该方法应用于内存管理***中,该内存管理***包括内存管理模块和多个第一线程模块,该内存管理模块用于管理多个内存空间,且该多个内存空间中的第一内存空间包括多个第一内存,该第一内存的容量为定值,该第一线程模块用于管理第二内存空间,该第二内存空间包括至少一个该第一内存,该方法包括:该第一线程模块接收业务数据;该第一线程模块确定该第二内存空间是否满足该业务数据的内存需求;该第一线程模块在该第二内存空间满足该业务数据的内存需求时,该第一线程模块使用该第二内存空间中的内存,处理该业务数据。本申请实施例能够减少锁冲突,以及提高***的并发能力。
Description
技术领域
本申请实施例涉及计算机存储领域,并且更具体地,涉及内存管理的方法及内存管理***。
背景技术
内存管理是存储***中一项重要的***基础服务,能够管理***输入/输出(Input/Output,IO)模块和业务模块的内存申请和释放,以及对高性能的***提供基础的服务,避免***在IO路径中因内存资源紧张导致存储业务异常,最终影响为上层的业务提供服务。
内存管理是通过一系列算法对***的内存进行管理,如linux内存中的内存的管理算法有内存管理伙伴算法(buddy)算法、分配机制算法(slab)等。此外,存储***可以作为大型***中的核心的部分,且当前业界主流的趋向是存储云化,因而出现了各种基于X86服务器的分布式存储,如开源的分布式存储(Ceph)等产品。这些存储的特点是把它们的核心进程部署在Linux的用户态,以及对***的资源进行预申请分配,这样***在运行过程中,避免动态的向Linux***中分配和释放资源,保证它们的***运行正常的同时,避免在IO的过程中因为业务的需求频繁的向***申请和释放内存,给***带来大量的CPU的开销。更重要的是,如果底层存储的大量***资源因***内存资源不够而申请不到内存,会对上层的***的业务造成影响巨大。因此,存储***通常都会对存储***所需要的所有涉及到的内存自己进行管理。
现有技术中,采用定长内存的简单的队列(即链表的方式)实现对内存的管理,在业务申请内存和释放内存的线程个数不只一个时,需要配置互斥锁,但是线程个数太多时,互斥锁的冲突也比较严重,***并发能力较低。
发明内容
本申请实施例提供了一种内存管理的方法及内存管理***,能够降低锁冲突,以及提高***并发能力。
第一方面,提供了一种内存管理的方法,该方法应用于包括内存管理模块和多个第一线程模块的内存管理***中,该内存管理模块用于管理多个内存空间,且该多个内存空间中的第一内存空间包括多个第一内存,该第一内存的容量为定值,该第一线程模块用于管理第二内存空间,该第二内存空间包括至少一个该第一内存,该方法包括:该第一线程模块接收业务数据;该第一线程模块确定该第二内存空间是否满足该业务数据的内存需求;在该第二内存空间满足该业务数据的内存需求时,该第一线程模块使用该第二内存空间中的内存,处理该业务数据。
第一业务线程接收业务数据,确定第二内存空间是否能够满足该业务数据需求的内存大小,在该第二内存空间满足该业务数据的内存需求时,根据该第二内存空间中的内存,处理该业务数据。这样,在多个业务线程场景下,不同线程模块分别通过各自的第二内存空间处理业务数据,避免了多个线程模块同时处理业务数据时,内存管理模块想要通过内存链表上的管理锁锁定第一内存空间的所有内存造成的锁冲突,从而减少了锁开销,提高了***的并发能力。
在一些可能的实现方式中,该方法还包括:在该第二内存空间不满足该业务数据的内存需求时,该第一线程模块向该内存管理模块发送内存请求,该内存请求用于请求从该第一内存空间申请内存;该内存管理模块根据该内存请求,分配内存,并对该第一内存空间设置第一管理锁,该第一管理锁用于控制该第一内存空间中内存的访问;该内存管理模块为该第一线程模块配置内存,并释放该第一管理锁;该第一线程线程模块将该配置的内存存储到该第二内存空间,以使该第二内存空间能够满足该业务数据的内存需求。
每个第一线程模块在第二内存空间不能满足需求时,从内存管理模块申请内存,也就是说,每个第一线程仍然能够通过各自的第二内存空间处理业务数据,避免了多个线程模块同时处理业务数据时,内存管理模块想要通过内存链表上的管理锁锁定第一内存空间的所有内存造成的锁冲突,从而减少了锁开销,提高了***的并发能力。
在一些可能的实现方式中,该内存管理模块根据该内存请求,分配内存包括:该内存管理模块根据该内存请求,分配该第一内存空间中的至少一个第一内存集合,该第一内存空间包括多个第一内存集合,该第一内存集合包括至少两个该第一内存;其中,该内存管理模块向该第一线程模块发送内存包括:该内存管理模块向该第一线程模块发送该至少一个内存集合。
在第一线程模块需要大量内存的情况下,避免了一一遍历每个内存,从而能够节省时延。
在一些可能的实现方式中,该方法还包括:该内存管理模块为该多个第一内存集合中的每个第一内存集合配置内存索引值;其中,该内存管理模块根据该内存请求,分配至少一个第一内存集合包括:该内存管理模块根据该内存请求和该内存索引值,分配该至少一个第一内存集合。
在第一线程模块需要批量获取内存时,可以快速的批量配置内存,且只需要修改几个指针,节省了开销。
在一些可能的实现方式中,在该第一线程模块确定该第二内存空间是否满足该业务数据的内存需求之前,该方法还包括:该第一线程模块向该内存管理模块发送第一注册请求,该第一注册请求用于向该内存管理模块请求内存;该内存管理模块根据该第一注册请求,向该第一线程模块发送至少一个该第一内存;该第一线程模块根据该至少一个该第一内存,生成该第二内存空间。
第一线程模块可以提前获取内存,进而用于处理业务数据,而不需要在需要内存时才从第一内存空间中获取内存,节省业务数据处理时延。
在一些可能的实现方式中,该内存管理***还包括第二线程模块;其中,该第一线程模块根据该第二内存空间中的内存,处理该业务数据包括:该第一线程模块将该业务数据封装在该第二内存空间中的内存中生成业务消息;该第一线程模块向该第二线程模块发送该业务消息。
第一线程模块根据第二内存空间中的内存可以处理业务数据,具体可以是将业务数据封装在第二内存空间的内存中生成业务消息,发送给内存管理***中的第二线程模块。
在一些可能的实现方式中,该方法还包括:该第二线程模块向该内存管理模块发送第二注册请求,该第二注册请求用于向该内存管理模块请求内存;该内存管理模块根据该第二注册请求,向该第二线程模块发送至少一个该第一内存;该第二线程模块根据该至少一个该第一内存,生成第三内存空间。
第二线程模块可以提前获取内存,进而用于处理业务数据,而不需要在需要内存时才从第一内存空间中获取内存,节省业务数据处理时延。
在一些可能的实现方式中,该第一线程模块为业务线程模块,该第二线程模块为网络线程模块,该方法还包括:该第二线程模块向存储节点发送该业务消息;该第二线程模块向该存储节点发送该业务消息之后,为该第三内存空间设置第二管理锁,并修改该第三内存空间的内存使用计数和业务路径,该第二管理锁用于控制对该内存使用计数和该业务路径的修改,且该第二管理锁不同于该第一管理锁。
该内存使用计数用于检测该业务消息占用的内存是否使用完成,而业务路径用于在***内存泄露,踩内存等异常时,可以快速的定位问题。这样在满足内存定位等辅助设计需求的同时,避免设置相同的管理锁造成的锁冲突。
在一些可能的实现方式中,该第一线程模块为网络线程模块,该第二线程模块为业务线程模块,该方法还包括:该第二线程模块向用户发送该业务消息;在该第二线模块向该用户发送该业务消息之后,该第二线程模块为该第三内存空间设置第二管理锁,并修改该第三内存空间的内存使用计数和业务路径,该第二管理锁用于控制对该内存使用计数和该业务路径的修改,且该第二管理锁不同于该第一管理锁。
在满足内存定位等辅助设计需求的同时,避免设置相同的管理锁造成的锁冲突。
在一些可能的实现方式中,该方法还包括:该第二线程模块根据该内存使用计数,确定是否释放该业务消息所占用的内存。
第二线程模块在业务消息占用的内存使用完成后,对该内存进行释放,进而可以供其他业务消息使用,提高了内存使用率。
在一些可能的实现方式中,该第三内存空间包括第一链表和第二链表,该内存使用计数的初始预设值为1,且该内存使用计数在对应的内存处于占用状态时加1,处于空闲状态时减1;其中,该第二线程模块根据该内存使用计数,确定是否释放该业务消息所占用的内存包括:在该内存使用计数为1时,该第二线程模块将该业务消息所占用的内存释放到该第二链表中;在该第二链表中内存个数超过第一数目阈值时,该第二线程模块将该业务消息所占用的剩余内存释放到该第一链表中。
该第三内存空间包括第一链表和第二链表,该第一链表和第二链表用于存储该第三内存空间中的至少一个第一内存。也就是说,该第三内存空间中的至少一个第一内存可以通过链表的形式管理,例如以free list链表(表示为第一链表)为例,当free list链表中的内存个数超过的低水位(表示为第一数目阈值),即不再放入free list链表中,而是放入unit list链表(表示为第二链表)中。这样能够方便后续批量回收free list中的内存,提高了回收效率。
在一些可能的实现方式中,该方法还包括:在该第三内存空间中的内存个数超过第二数目阈值时,该第二线程模块将该第二链表中的内存释放到该第一内存空间。
内存管理模块可以将第三内存空间中部分的内存回收到第一内存空间中,这样可以避免个别业务线程因为IO不均等的问题把资源全占用了。
第二方面,提供了一种内存管理***,该内存管理***包括用于执行第一方面或第一方面的任意可能的实现方式中的内存管理的方法的模块。
第三方面,提供了一种内存管理***,包括:处理器、存储器和通信接口。处理器与存储器和通信接口连接。存储器用于存储指令,处理器用于执行该指令,通信接口用于在处理器的控制下与其他网元进行通信。该处理器执行该存储器存储的指令时,该执行使得该处理器执行第一方面或第一方面的任意可能的实现方式中的内存管理的方法。
第四方面,本申请提供了一种计算机存储介质,该计算机存储介质中存储有程序代码,该程序代码用于指示执行上述第一方面或第一方面的任一种可能的实现方式中的内存管理的方法的指令。
基于上述技术方案,第一业务线程接收业务数据,确定第二内存空间是否能够满足该业务数据需求的内存大小,在该第二内存空间满足该业务数据的内存需求时,根据该第二内存空间中的内存,处理该业务数据。这样,线程模块分别通过各自的第二内存空间处理业务数据,避免了在内存链表上配置管理锁,锁定第一内存空间的所有内存,从而减少了锁冲突,提高了***的并发能力。
附图说明
图1是根据本申请实施例的应用场景;
图2是根据本申请内存管理***的结构图;
图3是根据单生产者单消费者场景的内存管理的示意图;
图4是根据多生产者多消费者场景的内存管理的示意图;
图5是根据多生产者多消费者场景的内存管理实施例的示意图;
图6是根据多生产者多消费者场景的另一种内存管理的示意图;
图7是根据本申请实施例的内存管理的架构示意图;
图8是根据本申请实施例的内存管理的方法的示意性流程图;
图9是根据本申请另一个实施例的内存管理的方法的示意性流程图;
图10是根据本申请又一个实施例的内存管理的方法的示意性流程图;
图11是根据本申请实施例的内存管理***的装置示意图;
图12是根据本申请实施例的内存管理***的结构示意图。
具体实施方式
存储***中的内存具体分为以下三类:(1)长度固定的内存;(2)长度不固定的内存;(3)长度不固定且需要IO对齐的内存,如512字节对齐、4K对齐等。这三种不同的内存的类型对应的管理方法也不同,对应的采集算法也不同。例如,长度固定的内存,通常可能采用链表方式管理;长度不固定的内存,在IO业务的申请大小不一时,可能存在链表中间部分的内存没有释放,而导致该链表后边的内存无法满足需求,从而产生众多的小内存碎片,通常采用类似Linux***中的buddy算法等进行内存的管理。本申请实施例主要涉及到长度固定的内存。
图1示出了本申请实施例的应用场景。如图1所示为计算存储一体机中的分布式存储模块中的业务模块,业务模块处理功能相当于存储的客户端(client),对外提供存储业务的能力。本申请实施例的内存管理***可以应用于图1所示的计算存储一体机中的IO请求模块110、业务处理模块120和缓存池(CACHE POOL)130任意项模块中。其中,缓存池130具体可以是中央处理器(Central Processing Unit,CPU)、闪存(Flash)和磁盘(DISK)等。
应理解,本申请实施例可以应用于key-value存储***,也可以应用于其他存储***,本申请对此不进行限定。但为描述方便,本申请实施例以key-value存储***为例进行说明。
图2示出了内存管理***的结构图。如图2所示,内存管理***主要包括多个业务线程210、多个网络线程220和框架内存管理模块230。
其中,业务线程210主要用于处理上层业务模块的IO,从内核态中获取接口(SCSI)的消息,然后转换成本***识别的关键值(Key Value)消息,并根据Key Value消息的IO路由装备发往网络线程中,最终发到存储节点。
网络线程220主要用于负责客户端节点和存储节点的网络链路的维护和消息发送、接收等业务,例如,上层业务进行写业务,则IO从业务线程处理后,根据Key Value消息的IO路由发送对应的网络线程,网络线程最终把IO发送到后端的存储节点。当存储节点IO写入存储后,消息从存储节点中返回到客户端,也需要通过网络线程接收存储节点的反馈,然后把消息返回给业务处理线程,业务处理线程把写入或者读取的结果反馈给上层的业务。
框架内存管理模块230,主要用于负责定长、变长和IO等内存的管理,在IO下发到业务处理的各个线程时,由于业务的需要,需要从框架内存中申请内存,然后把消息发送给网络线程并转发到存储节点,网络模块把消息发送出去后,会把内存释放给框架内存。同理,如果消息从存储节点返回的时候,网络线程也需要从框架内存模块中申请内存用于填充消息信息,把返回的消息返回给业务处理线程,业务处理线程把消息结果返回给上层应用后,会把内存释放给框架内存。
在存储***中,IO的过程中频繁的涉及到内存的申请和释放,内存的高效管理对***的性能影响非常大,如果管理低效会导致***CPU的开销增加,同时影响***的并发能力,最终导致降低***性能。在多生产者多消费者(即多线程申请某类临界资源(如内存),每个线程既要申请资源,又要释放资源)场景中,现有技术采用简单的队列管理,生产者和消费者每次申请都需要从队列中分配和释放,需要大量的垃圾回收,且不利于批量的获取回收,效率较低。特别是在生产者和消费者比较多的时候,队列头和队列尾锁竞争比较大,很难同步,***的资源开销比较大。具体地,现有技术对定长的内存的管理通常有以下几种:
如图3所示为单生产者单消费者场景的常用内存管理。此种场景不需要加锁,定长的内存可以通过读指针和写指针进行控制队列操作,具体实现可以参考linux内核提供的先进先出的队列的免锁算法(kfifo)的实现。
如图4所示为多生产者多消费者场景的常用内存管理。通常在多线程场景中,涉及到多个生产者和多个消费者的场景,最简单的管理办法还是采用链表的方式,在链表头部和尾部都是设置了互斥锁,控制线程之间对临界资源(如图4中的1号内存和4号内存)的访问。然而,当线程越多的时候,这个方式的弊端越明显。
具体地,以图5所示的多生产者多消费者场景设置一个互斥锁为例进行说明。如图5所示,每一种大小相同的内存块(即定长内存)串成一个链,比如32B的数据块一个链,64B数据块一个链,每个链有一个锁,当某个消费者需要申请比如32B内存资源的时候,申请过程中需要对32B的链进行加锁,这时候其他消费者就不能申请该链,只有当前面一个申请完成之后才会解锁,因此在多个消费者同时要申请一个链的内存资源,在申请锁的过程中,会产生锁冲突,导致并发能力上不去。
应理解,定长内存的大小可以是32B、64B、128B,…,2nB等,本申请对此不进行限定。
如图6所示为多生产者多消费者场景的另一种常用的内存管理。***(Disruptor)是目前公认的在处理多生产者和多消费者的高效的管理方法,它采用特殊的ring buffer队列实现的数据结构,不仅能够解决了多生产者和多消费者的在锁冲突严重的问题,还能够方便***跟踪内存的轨迹,以便在***内存泄露,踩内存等异常中,可以快速的定位。但是在***中存储生产者和消费者比较多的时候,多个业务线程同时申请内存资源时,两个环形缓冲器(ring buffer)环配合,锁的冲突比较严重,管理和实现也比较复杂,后期的代码理解和维护代价较高。
在当前大型存储***内存的管理中,不仅简单的进行对内存的申请和释放的管理,同时为能够方便***跟踪内存的轨迹,增加了较多的辅助设计,以便于在***内存泄露,踩内存等异常时,可以快速的定位问题。然而,线程模块进行跟踪内存等操作,也需要申请内存资源,并管理这些内存资源的临界资源,这样就可能涉及到一个锁内嵌套另一个锁。
因此,如图7所示,本申请实施例提出了一种内存管理的架构示意图,能够降低锁冲突,且能够提高***的并发能力。本申请实施例中,框架内存管理模块(对应于图2中的框架内存管理模块230)还包括:
(1)模块标识(module id,MID):由于框架内存管理模块是一个公共的模块,能够对不同模块的内存进行管理,如图7所示,本申请实施例中业务模块(例如客户端业务模块),网络模块等分别用不同的MID进行表示。
(2)元数据(metadata):分别对不同的模块分配一个全局的元数据管理,它的元数据结构如下所示:
struct dsw_mem_meta
{
dsw_u8mid;//模块ID号
...
...
...
dsw_u16*fmt_map;//管理不同定长的内存的元数据
};
其中fmt_map是一个数组,每个元数据管理不同长度大小、定长的内存单元,通常我们设计的定长的大小为2的指数级的增长,如32、64、128、256等字节长度的内存。如图7所示,每个全局的元数据的结构中,管理了N个长度固定的链表。
(3)fmt_level:是定长内存的索引链表值,如32的索引为5,64为6等,能够方便业务线程申请对应长度内存快速的索引。
(4)fmt_list:***初始的时候,业务线程首先会估算IO业务过程中,最大可能需要多少个这类长度的内存,然后在框架内存中注册。进程启动的时候,根据注册的个数,把定长的内存先用链表的方式管理起来,构成了一个链表大池,如图7所示包括多个链表大池。每个定长的内存会有一个内存的管理单元,管理单元对内存的管理主要有内存的使用情况、在使用过程中的轨迹等消息。定长的内存的管理单元的数据结构如下:
struct dsw_mem_fmt_unit
{
dsw_u32mid:6;//模块ID号
dsw_mem_fmt_unit_op_trace_t op_trace;//记录内存轨迹
dsw_u32index;//长度的索引
dsw_u32alloc_time;
dsw_s64used_flag;/*use flag 0:free,1:alloc;*/
mem_bs_info;//执行小池的实际的内存单元的信息
...
...
...
char*data_addr;//内存实际分配地址
};
另外,每个管理单元的管理头实际指向内存的地址为data addr,每个实际分配的地址前会增加13个字节,如ref cnt用于检测当前的内存是否使用完,当ref cnt为1的时候(***约定初始化的时候为1,后续申请使用,或者发送给其它线程的时候,会增加1),则说明这个内存可以释放。如果内存单元可能涉及跨线程的,则需要锁,spin lock能够在解决多个线程修改ref cnt的时候使用,详细的结构如图7所示。其中,unit index用于表示当前的这个内存单元是属于哪个类型长度的,如32B字节,64字节等;memid用于指示该内存是属于动态管理的内存类型还是静态分配管理的类型ID;spin lock用于锁ref cnt和内存管理头中的op trace的属性,通过对资源进行细分,用两个不同的锁,进一步的降低锁冲突的概率。
(5)头锁(headlock)/尾锁(tail lock):业务线程注册内存个数的时候,会设置这类的内存是否存在多个人使用的情况,如果只有一个业务线程使用,则不需要带锁的链表,如果是多个业务共享这类资源,则需要加锁;当业务线程申请内存资源时从队列头分配,用head lock锁进行互斥;当业务线程需要释放部分资源到大池中的时候,采用tail lock进行互斥,确保链表的安全,不会因为多个业务线程修改链表导致链表的断链。
(6)大池(big pool):框架模块把业务线程初始注册的内存安装链表的方式统一放在这个链表池中,在后续的描述中将这个链表统称为大池。
(7)大池索引(big pool index):在大池链表中,由于部分业务注册的资源比较多,后续业务线程进行批量分配的时候,如果进行锁后面遍历获取,则锁的开销比较大。所以,为了降低锁的冲突的开销,对大池的链表进行索引,确保批量分配的时候,可以快速的批量分配,且这样开销只是修改几个指针的代价。
业务模块/网络模块:图7中业务模块包括多个业务模块线程710,网络模块包括多个网络模块线程720,每个线程对应私有的指针,这个指针指向了业务线程模块或者网络线程模块的小池(small pool)的元数据管理,小池的元数据管理结构如下:
typedef struct dsw_mem_small_list_s
{
dsw_int water_level;//水位(个数)--正常设置为总数的5%(最多20个线程)--TODO:可配
dsw_int water_high;//water_level*2
…
…
…
dsw_list_t unit_list;//单个格式化链
…
…
}dsw_mem_small_list_t;
线程的私有地址空间指向small pool类型的元数据指针,意味着small pool的资源是专门申请给某个线程私有使用的,当业务模块或者网络模块线程需要申请内存的时候,首先从自己本线程的私有空间中的内存小池中检查是否有剩余的内存,如果有,则直接分配内存空间给业务线程;如果业务线程的队列中没有内存空间,则需要从框架内存中的大池中申请,从大池申请的时候是批量的从申请一定量的内存块个数,具体的个数参考后续分配注册的部分的算法。
图8为本申请实施例提供的内存管理的方法的示意图。
801,该第一线程模块接收业务数据。
内存管理***包括内存管理模块和多个第一线程模块,该内存管理模块可以是图2中框架内存管理模块230,该第一线程模块可以是业务线程210,也可以是网络线程220。
内存管理模块包括多个内存空间,该多个内存空间分别用于存储32B、64B或者128B等任一项的定长内存,且每个内存空间中可以包括多个定长的内存(表示为第一内存),例如,多个内存空间中的任意一个内存空间(表示为第一内存空间)可以包括多个32B定长的内存。此外,内存管理***包括的多个第一线程模块,每个第一线程模块包括一个私有的内存空间(表示为第二内存空间),且第二内存空间包括至少一个定长的内存(例如,32B定长的内存)。也就是说,任意一个第一线程模块都可以获知自己的第二内存空间的内存容量。
应理解,该第二内存空间中的定长内存可以是从内存管理模块的内存空间中获取的,也可以是第一线程模块原有的内存,本申请对此不进行限定。
还应理解,第一内存空间中的多个第一内存,以及第二内存空间中的至少一个第一内存可以以链表的形式存在。
802,该内存管理模块确定第二内存空间是否满足该业务数据的内存需求。
在第一业务线程模块接收到业务数据后,先确定该第一线程模块的第二内存空间是否能够满足该业务数据需求的内存大小。也就是说,第一业务线程模块的具有固定大小的内存(即第二内存空间),多个业务线程模块中的每个业务线程模块的第二内存空间可以用于独立处理业务数据,相互之间不会造成影响。
可选地,业务线程模块启动后,可以向内存管理模块注册请求(第一注册请求)。内存管理模块根据该第一注册请求将第一内存空间中的至少一个第一内存发送给第一线程模块。第一线程模块存储该至少一个第一内存生成第二内存空间,这样业务线程可以提前获取内存,进而用于处理业务数据,而不需要在需要内存时才从第一内存空间中获取内存,节省业务数据处理时延。
该注册请求具体可以包括注册定长的内存,其中包括注册内存的类型、内存链表包括的内存个数、以及内存是否需要配置管理锁(也可以简称“锁”)等。其中,内存类型可以是大小为32B、64B或者128B等任一项的定长内存;内存链表包括多个定长内存;以及内存管理模块用于服务的线程模块是单个还是多个,若是单个线程模块,则内存链表不需要配置管理锁,若为多个线程模块,则内存链表需要配置管理锁。
应理解,本申请实施例中,第一内存空间可以表述为“大池”,第二内存空间也可以表述为“对应于第一线程模块的小池”。
803,在该第二内存空间满足该业务数据的内存需求时,该第一线程模块根据该第二内存空间,处理该业务数据。
在第二内存空间能够满足业务数据对内存的需求时,例如,第一线程模块处理业务数据需求一个64B的内存,若第二内存空间包括一个64B的内存,则该第一线程模块根据该64B的内存能够处理该业务数据。这样,在业务数据需要多个业务线程的场景下,多个线程模块分别通过各自的第二内存空间处理业务数据,避免了多个线程模块同时处理业务数据时,内存管理模块想要通过内存链表上的管理锁锁定第一内存空间的所有内存造成的锁冲突,从而减少了锁开销,提高了***的并发能力。
可选地,作为一个实施例,在该第二内存空间不满足该业务数据的内存需求时,该第一线程模块向内存管理模块发送内存请求,以申请内存资源,内存管理模块为第一线程模块分配内存,并将发送给第一线程模块,第一线程模块将接收到的内存存储到该第二内存空间。这样第一线程模块可以根据当前的(即申请到内存后的)第二内存空间处理业务数据。
需要说明的是,内存管理模块接收到第一线程模块的内存请求后,需要确认第一内存空间是否有剩余内存能够分配给第一线程模块。若剩余内存,则内存管理模块对第一内存空间设置管理锁(表示为第一管理锁),并在向第一线程模块发送内存后,解开该第一管理锁。这里的第一管理锁可以是上述描述的互斥锁。
应理解,第一线程模块可以不停地向内存管理模块申请内存,直到第二内存空间中的内存能够满足业务数据的内存需求。
可选地,作为另一个实施例,内存管理模块可以将第一内存空间中的内存划分为多个内存集合(表示为第一内存集合),每个第一内存集合包括的内存数目相同。这样第一线程模块每次向第一内存空间申请内存时,可以获取到一个或多个第一内存集合,也就是说,在第一线程模块需要大量内存的情况下,避免了一一遍历每个内存,从而能够节省时延。
可选地,作为另一个实施例,内存管理模块可以为多个第一内存集合中的每个第一内存集合设置内存索引值,该多个内存索引值可以以列表的形式呈现(例如,索引表)。例如,在内存管理模块确定有剩余内存能够分配为第一线程模块,则内存管理模块为第一内存空间设置第一管理锁,然后从第一内存空间的索引表中获取批量的头节点和尾节点指针。在第一线程模块需要批量获取内存时,可以快速的批量配置内存,且只需要修改几个指针,节省了开销。
应理解,内存管理模块设置第一管理锁后,第一内存空间只能服务于该第一线程模块,只有在内存管理模块为第一线程模块分配内存后,才会解锁。
还应理解,内存管理模块为第一线程模块配置内存后,需要修改第一内存空间中的索引表的指针,以避免链表的断链。
可选地,第一线程模块根据第二内存空间中的内存处理业务数据具体可以是将业务数据封装在当前的第二内存空间中的内存中生成业务消息,然后向第二线程模块发送该业务消息。
应理解,这里的当前的第二内存空间可以是该第一线程模块对应的原始的第二内存空间,也可以是原始第二内存空间不满足业务数据的内存需求,经过从内存管理模块获取内存后得到的第二内存空间。
可选地,第二线程模块也可以向内存管理模块发送注册请求(表示为第二注册请求),内存管理模块根据该第二注册请求将第一内存空间中的至少一个第一内存发送给第二线程模块。第二线程模块存储该至少一个第一内存生成第三内存空间,这样业务线程可以提前获取内存,进而用于处理业务数据,而不需要在需要内存时才从第一内存空间中获取内存,节省业务数据处理时延。
应理解,内存管理***可以包括多个第二线程模块,每个第二线程模块都可以按照上述方式获取第三内存空间。此外,第三内存空间包括的第一内存的数目可以与第二内存空间包括的内存数目相同,也可以不同,本申请对此不进行限定。
可选地,本申请实施例中,第一线程模块可以是业务线程模块,也可以是网络线程模块。其中,当第一线程模块是业务线程模块,第二线程模块是网络线程模块时,业务线程模块向网络线程模块发送业务消息后,网络线程模块再将业务消息发送给存储节点。之后,网络线程模块修改网络线程模块的内存空间(即第三内存空间)的内存使用计数和业务路径。该内存使用计数用于检测该业务消息占用的内存是否使用完成,而业务路径用于在***内存泄露,踩内存等异常时,可以快速的定位问题。
例如,假设***约定初始化的时候内存使用计数(ref cnt)为1,后续申请使用,或者发送给其它线程的时候可以加1。也就是说,当ref cnt取值大于1表示有线程正在使用;若ref cnt取值等于1表示线程模块使用完成,这时可以释放内存。
在业务线程模块向网络线程模块发送业务消息后,网络线程模块为第三内存空间设置管理锁(表示为第二管理锁),第二管理锁用于控制对内存使用计数和业务路径的修改,这样只有一个线程能够修改内存使用计数和业务路径。此外,第二管理锁不同于第一管理锁,这样在满足内存定位等辅助设计需求的同时,避免设置相同的管理锁造成的锁冲突。
具体地,第二管理锁(即spin lock)的配置结构可以如图7所示,spin lock用于锁ref cnt和内存管理头中的业务路径(op trace)的属性,通过对资源进行细分,用两个不同的锁,进一步的降低锁冲突的概率。
应理解,该第二管理锁可以简称为“小锁”,该第三内存空间也可以表述为“对应于第二线程模块的小池”,“内存使用计数”也可以称为“内存引用计数”,本申请对此不进行限定。
可选地,本申请实施例还可以应用于存储节点处理业务消息后,向用户反馈结果信息的场景中,即该处理流程相当于业务线程模块到网络线程模块的逆过程。此时,第一线程模块是网络线程模块,第二线程模块是业务线程模块。网络线程模块将结果信息返回给业务线程模块,业务线程模块将结果信息发送给用户,并修改网络线程模块的内存空间的使用计数和使用轨迹。该内存使用计数用于检测该业务消息占用的内存是否使用完成,而业务路径用于在***内存泄露,踩内存等异常时,可以快速的定位问题。
应理解,从网络线程模块到业务线程模块的过程,与从业务线程模块到网络线程模块的过程相同,为避免重复,本申请不再详细赘述。
可选地,第二线程模块根据内存使用计数可以确定是否释放业务消息所占用的内存资源。
可选地,若内存使用计数的初始预设值为1,且所述内存使用计数在对应的内存处于占用状态时加1,处于空闲状态时减1,则在内存使用计数减到1时,则第二线程模块可以将业务消息占用的内存释放到第三内存空间中。该第三内存空间包括第一链表和第二链表,该第一链表和第二链表用于存储该第三内存空间中的至少一个第一内存。也就是说,该第三内存空间中的至少一个第一内存可以通过链表的形式管理,例如以free list链表(表示为第一链表)为例,其中在回收的时候,第二线程模块可以将释放的内存先放入第三内存空间中的free list中,当free list链表中的内存个数超过的低水位(表示为第一数目阈值),即不再放入free list链表中,而是放入unit list链表中。这样能够方便后续批量回收free list中的内存,提高了回收效率。
需要说明的是,该内存使用计数对应的内存,可以是任意一个内存,即每个内存都可以有对应的内存使用计数确定将资源是否到第三内存空间中;或者是一个业务消息占用的至少一个内存通过一个内存使用计数来记录,本申请对此不进行限定。
应理解,低水位可以是内存管理模块出厂时配置的,也可以是根据第二内存空间内的内存大小或数目灵活设定的,本申请对此不进行限定。
可选地,内存管理模块可以为第三内存空间配置第二数目阈值(或者可以称为“高水位”)。内存管理模块在第三内存空间中内存个数超过高水位时,即free list链表和unitlist链表中总共有的内存数目超过高水位。内存管理模块可以将第三内存空间中部分的内存回收到第一内存空间中,这样可以避免个别业务线程因为IO不均等的问题把资源全占用了。
可选地,内存管理模块将第三内存空间中的内存回收到第一内存空间的过程中,可以批量的回收,即第二内存空间可以批量的将free list中的所有内存回收到第二内存空间中,从而提高回收效率。
因此,本申请实施例的内存管理的方法,第一业务线程接收业务数据,确定第二内存空间是否能够满足该业务数据需求的内存大小,在该第二内存空间满足该业务数据的内存需求时,根据该第二内存空间中的内存,处理该业务数据。这样,在多个业务线程场景下,不同线程模块分别通过各自的第二内存空间处理业务数据,避免了多个线程模块同时处理业务数据时,内存管理模块想要通过内存链表上的管理锁锁定第一内存空间的所有内存造成的锁冲突,从而减少了锁开销,提高了***的并发能力。
图9为本申请一个实施例提供的内存管理的方法的交互流程示意图。本实施例中的各种术语的含义与前述各实施例相同。
901、业务线程模块启动,并向内存管理模块发送第一注册请求。
902、内存管理模块根据第一注册请求,为该业务线程模块配置至少一个第一内存。该内存管理模块的第一内存空间包括多个第一内存。
903、业务线程模块根据配置的至少一个第一内存存储到业务线程模块的私有内存空间。
904、网络线程模块启动,并向内存管理模块发送第二注册请求。
905、内存管理模块根据第二注册请求,为该网络线程模块配置至少一个第一内存。
应理解,该第一注册请求与该第二注册请求可以相同,也可以不同,本申请对此不进行限定。
906、网络线程模块将配置的至少一个第一内存存储到网络线程的私有内存空间中。
应理解,本申请中业务线程和网络线程可以同时申请内存,也可以按先后顺序申请内存,即步骤901~903,与步骤904~906之间的先后顺序本申请不进行限定。
907、业务线程模块接收业务数据。
该步骤904在步骤901~906之前或之间的任一个步骤之后,本申请对此不进行限定。
908、业务线程模块根据该业务数据,确定业务线程的私有内存空间是否满足业务数据的内存需求。
909、在业务线程的私有内存空间不满足业务数据的内存需求时,第一业务线程向内存管理模块发送内存请求。
若业务线程的私有内存空间满足业务数据的内存需求,则直接执行步骤913。
910、内存管理模块将第一内存空间划分为多个内存集合,且根据内存请求为多个第一内存集合配置内存索引值,这样内存管理模块可以根据内存索引值为业务线程模块配置内存,即可以一次配置多个内存,不需要一个一个遍历。
应理解,内存管理模块在为业务线程模块配置内存的过程中,也需要设置第一管理锁,避免其他线程模块使用该第一内存空间。
911、内存管理模块为业务线程模块配置至少一个第一内存集合。在发送内存后,解开该第一管理锁。
912、业务线程模块将该至少一个第一内存集合存储到第二内存空间。
913、业务线程模块将业务数据封装在第二内存空间中的内存中生成业务消息。
914、业务线程模块向网络线程模块发送业务消息。
915、网络线程模块将该业务数据转发到存储节点。
916、网络线程模块将业务数据发出后,修改网络线程模块的私有内存空间中的内存使用计数和使用轨迹。
917、在内存使用计数为1时,网络线程模块将业务消息占用的内存释放到网络线程模块的私有内存空间中的第二链表,超过第二链表的第一数目阈值后,释放到第一链表。当第网络线程模块的私有内存空间中的内存超过第二内存数目阈值后,将第二链表的内存释放到内存管理模块的第一内存空间中。
918、内存管理模块接收网络线程模块释放的内存。
919、内存管理模块修改第一内存空间的索引表信息。
因此,本申请实施例的内存管理的方法,业务线程模块接收业务数据,确定网络线程模块的私有内存空间是否能够满足该业务数据需求的内存大小,在该网络线程模块的私有内存空间满足该业务数据的内存需求时,根据该网络线程模块的私有内存空间,处理该业务数据。在网络线程模块的私有内存空间不能满足业务数据的内存需求时,业务线程向内存管理模块申请内存,直至网络线程模块的私有内存空间能够满足该业务数据的内存需求,业务线程模块将业务数据封装在网络线程模块的私有内存空间中的内存中生成业务消息,并发送给网络线程模块。这样,在多个业务线程场景下,不同线程模块分别通过各自的私有内存空间处理业务数据,避免了多个线程模块同时处理业务数据时,内存管理模块想要通过内存链表上的管理锁锁定第一内存空间的所有内存造成的锁冲突,从而减少了锁开销,提高了***的并发能力。
图10为本申请另一个实施例提供的内存管理的方法的交互流程示意图。本实施例中的各种术语的含义与前述各实施例相同。
1001、网络线程模块启动,并向内存管理模块发送第二注册请求。
1002、内存管理模块根据第二注册请求,向该业务线程模块发送为该业务线程模块配置的至少一个第一内存。该内存管理模块的第一内存空间包括多个第一内存。
1003、网络线程模块将接收到的至少一个第一内存存储到网络线程模块的私有空间中。
1004、业务线程模块启动,并向内存管理模块发送第一注册请求。
1005、内存管理模块根据第一注册请求,为该业务线程模块配置至少一个第一内存。
应理解,该第一注册请求与该第二注册请求可以相同,也可以不同,本申请对此不进行限定。
1006、业务线程模块将配置的至少一个第一内存存储到业务线程模块的私有空间中。
应理解,本申请中业务线程和网络线程可以同时申请内存,也可以按先后顺序申请内存,即步骤1001~1003,与步骤1004~1006之间的先后顺序本申请不进行限定。
1007、网络线程模块接收响应业务数据,例如,业务数据用于写入操作,则该响应业务数据为写入的结果信息。
该步骤1004在步骤1001~1006之前或之间的任一个步骤之后,本申请对此不进行限定。或者,若该步骤在附图9对应的实施例之后执行时,该步骤1007可以在918之后执行,不需要上述步骤1001~步骤1006。
1008、网络线程模块根据该业务数据,确定网络线程模块的私有内存空间是否满足业务数据的内存需求。
1009、在网络线程模块的私有内存空间不满足业务数据的内存需求时,网络线程模块向内存管理模块发送内存请求。
若网络线程模块的私有内存空间满足业务数据的内存需求,则直接执行步骤1013。
1010、内存管理模块将第一内存空间划分为多个内存集合,且为多个第一内存集合配置内存索引值,这样内存管理模块可以根据内存索引值为业务线程模块配置内存,即可以依次配置多个内存,不需要一个一个遍历。
1011、内存管理模块为网络线程模块配置少一个第一内存集合。
1012、网络线程模块将该至少一个第一内存集合存储到网络线程模块的私有内存空间。
1013、网络线程模块将业务数据封装在网络线程模块的私有内存空间中的内存中生成业务消息。
1014、网络线程模块向业务线程模块发送业务消息。
1015、网络线程模块将该业务数据转发到用户。
1016、网络线程模块将业务数据发出后,修改内存使用计数和使用轨迹。
1017、在内存使用计数为1时,业务线程模块将业务消息占用的内存释放到网络线程模块的私有内存空间中的第一链表,超过第一链表的第一内存数目阈值后,释放到第二链表。当网络线程模块的私有内存空间中的内存超过第二内存数目阈值后,将第一链表的内存释放到内存管理模块的第一内存空间中。
1018、内存管理模块接收业务线程模块释放的内存。
1019,内存管理模块修改第一内存空间的索引表信息。
因此,本申请实施例的内存管理的方法,网络线程模块接收响应业务数据,确定网络线程模块的私有内存空间是否能够满足该业务数据需求的内存大小,在该网络线程模块的私有内存空间满足该业务数据的内存需求时,根据该网络线程模块的私有内存空间中的内存,处理该业务数据。在网络线程模块的私有内存空间不能满足业务数据的内存需求时,业务线程向内存管理模块申请内存,直至网络线程模块的私有内存空间能够满足该业务数据的内存需求,业务线程模块将业务数据封装在网络线程模块的私有内存空间中的内存中生成业务消息,并发送给业务线程模块。这样,在多个业务线程场景下,不同线程模块分别通过各自的私有内存空间处理业务数据,避免了在内存链表上配置管理锁,锁定第一内存空间的所有内存,从而减少了锁冲突,提高了***的并发能力。
上文中详细描述了根据本申请实施例的内存管理的方法,下面将描述根据本申请实施例的内存管理***。
图11示出了根据本申请实施例的内存管理***1100的示意性框图。该内存管理***包括内存管理模块1110和多个第一线程模块1120,该内存管理模块1110用于管理多个内存空间,且多个内存空间中的第一内存空间包括多个第一内存,该第一内存的容量为定值,该第一线程模块1120用于管理第二内存空间,该第二内存空间包括至少一个该第一内存。如图11所示,该内存管理***1100包括:
该第一线程模块1120,用于接收业务数据;
该第一线程模块1120,还用于确定该第二内存空间是否满足该业务数据的内存需求;
该第一线程模块1120,还用于使用该第二内存空间中的内存,处理该业务数据。
可选地,该第一线程模块1120还用于向该内存管理模1110块发送内存请求,该内存请求用于请求从该第一内存空间申请内存;该内存管理模块1110,用于根据该内存请求,分配内存,并对该第一内存空间设置第一管理锁,该第一管理锁用于控制该第一内存空间中内存的访问;该内存管理模块1110为该第一线程模块配置内存,并释放该第一管理锁;该第一线程模块1120,还用于将该配置的内存存储到该第二内存空间,以使该第二内存空间能够满足该业务数据的内存需求。
可选地,该内存管理模块1110具体用于:根据该内存请求,分配该第一内存空间中的至少一个第一内存集合,该第一内存空间包括多个第一内存集合,该第一内存集合包括至少两个该第一内存;该内存管理模块1110,还用于向该第一线程模块发送该至少一个内存集合。
可选地,该内存管理模块1110,用于为该多个第一内存集合中的每个第一内存集合配置内存索引值;该内存管理模块1110具体用于:根据该内存请求和该内存索引值,分配该至少一个第一内存集合。
可选地,该第一线程模块1120,还用于向该内存管理模块发送第一注册请求,该第一注册请求用于向该内存管理模块请求内存;该内存管理模块1110,还用于根据该第一注册请求,向该第一线程模块发送至少一个该第一内存;该第一线程模块1120,还用于根据该至少一个该第一内存,生成该第二内存空间。
可选地,该内存管理***还包括第二线程模块,该第一线程模块1120具体用于:将该业务数据封装在该第二内存空间中的内存中生成业务消息;该第一线程模块1120,还用于向该第二线程模块发送该业务消息。
可选地,该第二线程模块,还用于向该内存管理模块发送第二注册请求,该第二注册请求用于向该内存管理模块请求内存;该内存管理模块1110,还用于根据该第二注册请求,向该第二线程模块发送至少一个该第一内存;该第二线程模块,用于根据该至少一个该第一内存,生成第三内存空间。
可选地,该第一线程模块1120为业务线程模块,该第二线程模块为网络线程模块,该第二线程模块,还用于向存储节点发送该业务消息;该第二线程模块,还用于向该存储节点发送该业务消息之后,为该第三内存空间设置第二管理锁,并修改该第三内存空间的内存使用计数和业务路径,该第二管理锁用于控制对该内存使用计数和该业务路径的修改,且该第二管理锁不同于该第一管理锁。
可选地,该第一线程模块1120为网络线程模块,该第二线程模块为业务线程模块,该第二线程模块,还用于向用户发送该业务消息;该第二线程模块,还用于为该第三内存空间设置第二管理锁,并修改该第三内存空间的内存使用计数和业务路径,该第二管理锁用于控制对该内存使用计数和该业务路径的修改,且该第二管理锁不同于该第一管理锁。
可选地,该第二线程模块,还用于根据该内存使用计数,确定是否释放该业务消息所占用的内存。
可选地,该第三内存空间包括第一链表和第二链表,该内存使用计数的初始预设值为1,且该内存使用计数在对应的内存处于占用状态时加1,处于空闲状态时减1;该第二线程模块,还用于在该内存使用计数为1时,将该业务消息所占用的内存释放到该第二链表中;该第二线程模块,还用于在该第二链表中内存个数超过第一数目阈值时,将该业务消息所占用的剩余内存释放到该第一链表中。
可选地,该第二线程模块,还用于在该第三内存空间中的内存个数超过第二数目阈值时,将该第二链表中的内存释放到该第一内存空间。
因此,第一业务线程接收业务数据,确定第二内存空间是否能够满足该业务数据需求的内存大小,在该第二内存空间满足该业务数据的内存需求时,根据该第二内存空间中的内存,处理该业务数据。这样,线程模块分别通过各自的第二内存空间处理业务数据,避免了在内存链表上配置管理锁,锁定第一内存空间的所有内存,从而减少了锁冲突,提高了***的并发能力。
图12示出了本申请的实施例提供的内存管理***的结构示意图。如图12所示,该内存管理***包括至少一个处理器1202(例如具有计算和处理能力的通用处理器CPU、数字信号处理器(DSP)、专用集成电路(ASIC)、现成可编程门阵列(FPGA)等),处理器1202用于对内存管理***内各模块和器件进行管理和调度。图11所示的实施例中的内存管理模块1110、第一线程模块1120以及第二线程模块可以通过处理器1202实现。该内存管理***还包括至少一个收发器1205(接收器/发送器),存储器1206。内存管理***的各个组件通过内部连接通路互相通信,传递控制和/或数据信号。
上述本申请实施例揭示的方法可以应用于处理器1202,或者用于执行存储器1206中存储的可执行模块,例如计算机程序。存储器1206可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),存储器可以包括只读存储器和随机存取存储器,并向处理器提供需要的信令或数据、程序等等。存储器的一部分还可以包括非易失行随机存取存储器(NVRAM)。通过至少一个收发器1205(可以是有线或者无线)实现与至少一个其他网元之间的通信连接。
在一些实施方式中,存储器1206存储了程序12061,处理器1202执行程序12061,用于执行以下操作:
通过收发器1205接收业务数据;
确定该第二内存空间是否满足该业务数据的内存需求;
使用该第二内存空间中的内存,处理该业务数据。
需要说明的是,该内存管理***可以具体为图11所示的实施例中的内存管理***,并且可以用于执行图10所示的方法实施例中与内存管理模块1110、第一线程模块1120以及第二线程模块对应的各个步骤和/或流程。
从本申请实施例提供的以上技术方案可以看出,第一业务线程接收业务数据,确定第二内存空间是否能够满足该业务数据需求的内存大小,在该第二内存空间满足该业务数据的内存需求时,根据该第二内存空间中的内存,处理该业务数据。这样,线程模块分别通过各自的第二内存空间处理业务数据,避免了在内存链表上配置管理锁,锁定第一内存空间的所有内存,从而减少了锁冲突,提高了***的并发能力。
本申请实施例还提供一种计算机存储介质,该计算机存储介质可以存储用于指示上述任一种方法的程序指令。
可选地,该存储介质具体可以为存储器1206。
另外,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的***、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的***、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个***,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本申请实施例方案的目的。
另外,在本申请各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-OnlyMemory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本申请的具体实施方式,但本申请的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本申请揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本申请的保护范围之内。因此,本申请的保护范围应以权利要求的保护范围为准。
Claims (16)
1.一种内存管理的方法,其特征在于,所述方法应用于包括内存管理模块和多个第一线程模块的内存管理***中,所述内存管理模块用于管理多个内存空间,且所述多个内存空间中的第一内存空间包括多个第一内存,所述第一内存的容量为定值,所述第一线程模块用于管理第二内存空间,所述第二内存空间包括至少一个所述第一内存,所述方法包括:
所述第一线程模块接收业务数据;
所述第一线程模块确定所述第二内存空间是否满足所述业务数据的内存需求;
在所述第二内存空间满足所述业务数据的内存需求时,所述第一线程模块使用所述第二内存空间中的内存,处理所述业务数据;
所述内存管理***还包括第二线程模块;
其中,所述第一线程模块根据所述第二内存空间中的内存,处理所述业务数据包括:
所述第一线程模块将所述业务数据封装在所述第二内存空间中的内存中生成业务消息;
所述第一线程模块向所述第二线程模块发送所述业务消息;
所述方法还包括:
所述第二线程模块向所述内存管理模块发送第二注册请求,所述第二注册请求用于向所述内存管理模块请求内存;
所述内存管理模块根据所述第二注册请求,向所述第二线程模块发送至少一个所述第一内存;
所述第二线程模块根据所述至少一个所述第一内存,生成第三内存空间;
所述第一线程模块为业务线程模块,所述第二线程模块为网络线程模块,所述方法还包括:
所述第二线程模块向存储节点发送所述业务消息;
所述第二线程模块向所述存储节点发送所述业务消息之后,为所述第三内存空间设置第二管理锁,并修改所述第三内存空间的内存使用计数和业务路径,所述第二管理锁用于控制对所述内存使用计数和所述业务路径的修改,且所述第二管理锁不同于第一管理锁;或
所述第一线程模块为网络线程模块,所述第二线程模块为业务线程模块,所述方法还包括:
所述第二线程模块向用户发送所述业务消息;
在所述第二线程模块向所述用户发送所述业务消息之后,所述第二线程模块为所述第三内存空间设置第二管理锁,并修改所述第三内存空间的内存使用计数和业务路径,所述第二管理锁用于控制对所述内存使用计数和所述业务路径的修改,且所述第二管理锁不同于第一管理锁。
2.根据权利要求1所述的方法,其特征在于,所述方法还包括:
在所述第二内存空间不满足所述业务数据的内存需求时,所述第一线程模块向所述内存管理模块发送内存请求,所述内存请求用于请求从所述第一内存空间申请内存;
所述内存管理模块根据所述内存请求,分配内存,并对所述第一内存空间设置所述第一管理锁,所述第一管理锁用于控制所述第一内存空间中内存的访问;
所述内存管理模块为所述第一线程模块配置内存,并释放所述第一管理锁;
所述第一线程模块将所述配置的内存存储到所述第二内存空间,以使所述第二内存空间能够满足所述业务数据的内存需求。
3.根据权利要求2所述的方法,其特征在于,所述内存管理模块根据所述内存请求,分配内存包括:
所述内存管理模块根据所述内存请求,分配所述第一内存空间中的至少一个第一内存集合,所述第一内存空间包括多个第一内存集合,所述第一内存集合包括至少两个所述第一内存;
其中,所述内存管理模块向所述第一线程模块发送内存包括:
所述内存管理模块向所述第一线程模块发送所述至少一个内存集合。
4.根据权利要求3所述的方法,其特征在于,所述方法还包括:
所述内存管理模块为所述多个第一内存集合中的每个第一内存集合配置内存索引值;
其中,所述内存管理模块根据所述内存请求,分配至少一个第一内存集合包括:
所述内存管理模块根据所述内存请求和所述内存索引值,分配所述至少一个第一内存集合。
5.根据权利要求1至4中任一项所述的方法,其特征在于,在所述第一线程模块确定所述第二内存空间是否满足所述业务数据的内存需求之前,所述方法还包括:
所述第一线程模块向所述内存管理模块发送第一注册请求,所述第一注册请求用于向所述内存管理模块请求内存;
所述内存管理模块根据所述第一注册请求,向所述第一线程模块发送至少一个所述第一内存;
所述第一线程模块根据所述至少一个所述第一内存,生成所述第二内存空间。
6.根据权利要求1至4中任一项所述的方法,其特征在于,所述方法还包括:
所述第二线程模块根据所述内存使用计数,确定是否释放所述业务消息所占用的内存。
7.根据权利要求6所述的方法,其特征在于,所述第三内存空间包括第一链表和第二链表,所述内存使用计数的初始预设值为1,且所述内存使用计数在对应的内存处于占用状态时加1,处于空闲状态时减1;
其中,所述第二线程模块根据所述内存使用计数,确定是否释放所述业务消息所占用的内存包括:
在所述内存使用计数为1时,所述第二线程模块将所述业务消息所占用的内存释放到所述第二链表中;
在所述第二链表中内存个数超过第一数目阈值时,所述第二线程模块将所述业务消息所占用的剩余内存释放到所述第一链表中。
8.根据权利要求7所述的方法,其特征在于,所述方法还包括:
在所述第三内存空间中的内存个数超过第二数目阈值时,所述第二线程模块将所述第二链表中的内存释放到所述第一内存空间。
9.一种内存管理***,其特征在于,所述内存管理***包括内存管理模块和多个第一线程模块,所述内存管理模块用于管理多个内存空间,且所述多个内存空间中的第一内存空间包括多个第一内存,所述第一内存的容量为定值,所述第一线程模块用于管理第二内存空间,所述第二内存空间包括至少一个所述第一内存;
所述第一线程模块,用于接收业务数据;
所述第一线程模块,还用于确定所述第二内存空间是否满足所述业务数据的内存需求;
所述第一线程模块,还用于使用所述第二内存空间中的内存,处理所述业务数据;
所述内存管理***还包括第二线程模块;
所述第一线程模块具体用于:
将所述业务数据封装在所述第二内存空间中的内存中生成业务消息;
所述第一线程模块,还用于向所述第二线程模块发送所述业务消息;
所述第二线程模块,还用于向所述内存管理模块发送第二注册请求,所述第二注册请求用于向所述内存管理模块请求内存;
所述内存管理模块,还用于根据所述第二注册请求,向所述第二线程模块发送至少一个所述第一内存;
所述第二线程模块,用于根据所述至少一个所述第一内存,生成第三内存空间;
所述第一线程模块为业务线程模块,所述第二线程模块为网络线程模块,所述第二线程模块,还用于向存储节点发送所述业务消息;
所述第二线程模块,还用于向所述存储节点发送所述业务消息之后,为所述第三内存空间设置第二管理锁,并修改所述第三内存空间的内存使用计数和业务路径,所述第二管理锁用于控制对所述内存使用计数和所述业务路径的修改,且所述第二管理锁不同于第一管理锁;或
所述第一线程模块为网络线程模块,所述第二线程模块为业务线程模块,所述第二线程模块,还用于向用户发送所述业务消息;
所述第二线程模块,还用于为所述第三内存空间设置第二管理锁,并修改所述第三内存空间的内存使用计数和业务路径,所述第二管理锁用于控制对所述内存使用计数和所述业务路径的修改,且所述第二管理锁不同于第一管理锁。
10.根据权利要求9所述的内存管理***,其特征在于,所述第一线程模块还用于向所述内存管理模块发送内存请求,所述内存请求用于请求从所述第一内存空间申请内存;
所述内存管理模块,用于根据所述内存请求,分配内存,并对所述第一内存空间设置所述第一管理锁,所述第一管理锁用于控制所述第一内存空间中内存的访问;
所述内存管理模块,还用于为所述第一线程模块配置内存,并释放所述第一管理锁;
所述第一线程模块,还用于将所述配置的内存存储到所述第二内存空间,以使所述第二内存空间能够满足所述业务数据的内存需求。
11.根据权利要求10所述的内存管理***,其特征在于,所述内存管理模块具体用于:
根据所述内存请求,分配所述第一内存空间中的至少一个第一内存集合,所述第一内存空间包括多个第一内存集合,所述第一内存集合包括至少两个所述第一内存;
所述内存管理模块,还用于向所述第一线程模块发送所述至少一个内存集合。
12.根据权利要求11所述的内存管理***,其特征在于,所述内存管理模块,用于为所述多个第一内存集合中的每个第一内存集合配置内存索引值;
所述内存管理模块具体用于:
根据所述内存请求和所述内存索引值,分配所述至少一个第一内存集合。
13.根据权利要求9至12中任一项所述的内存管理***,其特征在于,所述第一线程模块,还用于向所述内存管理模块发送第一注册请求,所述第一注册请求用于向所述内存管理模块请求内存;
所述内存管理模块,还用于根据所述第一注册请求,向所述第一线程模块发送至少一个所述第一内存;
所述第一线程模块,还用于根据所述至少一个所述第一内存,生成所述第二内存空间。
14.根据权利要求9至12中任一项所述的内存管理***,其特征在于,所述第二线程模块,还用于根据所述内存使用计数,确定是否释放所述业务消息所占用的内存。
15.根据权利要求14所述的内存管理***,其特征在于,所述第三内存空间包括第一链表和第二链表,所述内存使用计数的初始预设值为1,且所述内存使用计数在对应的内存处于占用状态时加1,处于空闲状态时减1;
所述第二线程模块,还用于在所述内存使用计数为1时,将所述业务消息所占用的内存释放到所述第二链表中;
所述第二线程模块,还用于在所述第二链表中内存个数超过第一数目阈值时,将所述业务消息所占用的剩余内存释放到所述第一链表中。
16.根据权利要求15所述的内存管理***,其特征在于,所述第二线程模块,还用于在所述第三内存空间中的内存个数超过第二数目阈值时,将所述第二链表中的内存释放到所述第一内存空间。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611241110.2A CN106844041B (zh) | 2016-12-29 | 2016-12-29 | 内存管理的方法及内存管理*** |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201611241110.2A CN106844041B (zh) | 2016-12-29 | 2016-12-29 | 内存管理的方法及内存管理*** |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106844041A CN106844041A (zh) | 2017-06-13 |
CN106844041B true CN106844041B (zh) | 2020-06-16 |
Family
ID=59113130
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201611241110.2A Active CN106844041B (zh) | 2016-12-29 | 2016-12-29 | 内存管理的方法及内存管理*** |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106844041B (zh) |
Families Citing this family (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107147590A (zh) * | 2017-07-12 | 2017-09-08 | 郑州云海信息技术有限公司 | 一种基于rdma协议消息通信的方法及*** |
CN107391281A (zh) * | 2017-08-09 | 2017-11-24 | 腾讯科技(深圳)有限公司 | 一种服务器的数据处理方法、装置和存储介质 |
CN108037988A (zh) * | 2017-12-11 | 2018-05-15 | 郑州云海信息技术有限公司 | 一种samba多线程性能打点方法及装置 |
CN108319505A (zh) * | 2017-12-18 | 2018-07-24 | 湖北鸿云科技股份有限公司 | 基于iocp机制结合池分片的网络数据通信***和方法 |
CN108762940B (zh) * | 2018-04-12 | 2020-09-04 | 武汉斗鱼网络科技有限公司 | 多线程访问方法及装置 |
CN108920276A (zh) * | 2018-06-27 | 2018-11-30 | 郑州云海信息技术有限公司 | Linux***内存分配方法、***及设备和存储介质 |
CN109522113B (zh) * | 2018-09-28 | 2020-12-18 | 迈普通信技术股份有限公司 | 一种内存管理方法及装置 |
CN109874027A (zh) * | 2019-03-11 | 2019-06-11 | 宸瑞普惠(广州)科技有限公司 | 一种低延时手术示教直播方法及其*** |
CN110275978A (zh) * | 2019-07-01 | 2019-09-24 | 成都启英泰伦科技有限公司 | 语音大数据在磁盘冗余阵列上的快速存储和访问修改方法 |
CN112711546B (zh) * | 2019-10-24 | 2024-06-18 | 华为技术有限公司 | 内存配置方法、装置及存储介质 |
CN113296962B (zh) * | 2021-07-26 | 2022-01-11 | 阿里云计算有限公司 | 内存管理方法、装置、设备及存储介质 |
CN115878335B (zh) * | 2021-09-27 | 2024-06-11 | 华为技术有限公司 | 一种锁传递方法及相关装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101493787A (zh) * | 2009-02-18 | 2009-07-29 | 中兴通讯股份有限公司 | 一种内存操作的管理方法及*** |
CN102508872A (zh) * | 2011-10-12 | 2012-06-20 | 恒生电子股份有限公司 | 一种基于内存的联机处理***的数据处理方法及*** |
CN102567107A (zh) * | 2011-10-31 | 2012-07-11 | 广东电网公司电力科学研究院 | 高并行的实时内存资源管理调度方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8205062B2 (en) * | 2009-10-14 | 2012-06-19 | Inetco Systems Limited | Tiered data management method and system for high performance data monitoring |
US10277510B2 (en) * | 2011-08-02 | 2019-04-30 | Cavium, Llc | System and method for storing lookup request rules in multiple memories |
-
2016
- 2016-12-29 CN CN201611241110.2A patent/CN106844041B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101493787A (zh) * | 2009-02-18 | 2009-07-29 | 中兴通讯股份有限公司 | 一种内存操作的管理方法及*** |
CN102508872A (zh) * | 2011-10-12 | 2012-06-20 | 恒生电子股份有限公司 | 一种基于内存的联机处理***的数据处理方法及*** |
CN102567107A (zh) * | 2011-10-31 | 2012-07-11 | 广东电网公司电力科学研究院 | 高并行的实时内存资源管理调度方法 |
Also Published As
Publication number | Publication date |
---|---|
CN106844041A (zh) | 2017-06-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106844041B (zh) | 内存管理的方法及内存管理*** | |
US11010681B2 (en) | Distributed computing system, and data transmission method and apparatus in distributed computing system | |
CN112422615B (zh) | 一种通信的方法及装置 | |
CN105511954A (zh) | 一种报文处理方法及装置 | |
US20110265098A1 (en) | Message Passing with Queues and Channels | |
CN110704214B (zh) | 进程间通信方法和装置 | |
US8666958B2 (en) | Approaches to reducing lock communications in a shared disk database | |
US11579874B2 (en) | Handling an input/output store instruction | |
WO2015085826A1 (zh) | 一种访问共享资源的方法及装置 | |
US20170031798A1 (en) | Activity tracing diagnostic systems and methods | |
CN103389945B (zh) | 一种内存管理的方法及装置 | |
US11416399B2 (en) | Dedicated memory buffers for supporting deterministic inter-FPGA communication | |
CN112256460A (zh) | 进程间通信方法、装置、电子设备及计算机可读存储介质 | |
CN115733832A (zh) | 计算设备、报文接收方法、可编程网卡及存储介质 | |
US9021492B2 (en) | Dual mode reader writer lock | |
CN113672400A (zh) | 一种数据处理方法、装置、设备及可读存储介质 | |
CN110830385A (zh) | 一种捕包处理方法、网络设备、服务器及存储介质 | |
CN113826081A (zh) | 在计算***中传输报文的方法和计算*** | |
CN107911317B (zh) | 一种报文调度方法及装置 | |
US20170344488A1 (en) | Sharing data structures between processes by semi-invasive hybrid approach | |
CN114371945A (zh) | 报文的传输方法、装置、电子设备及计算机存储介质 | |
CN116841720A (zh) | 资源配置方法、装置、计算机设备、存储介质及程序产品 | |
CN116127259B (zh) | 张量处理方法、装置、设备及计算机可读存储介质 | |
WO2015004571A1 (en) | Method and system for implementing a bit array in a cache line | |
WO2022151950A1 (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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |