CN112214329A - 内存管理方法、装置、设备及计算机可读存储介质 - Google Patents
内存管理方法、装置、设备及计算机可读存储介质 Download PDFInfo
- Publication number
- CN112214329A CN112214329A CN202011215098.4A CN202011215098A CN112214329A CN 112214329 A CN112214329 A CN 112214329A CN 202011215098 A CN202011215098 A CN 202011215098A CN 112214329 A CN112214329 A CN 112214329A
- Authority
- CN
- China
- Prior art keywords
- memory
- page
- shared memory
- shared
- pool
- 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.)
- Granted
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
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Memory System (AREA)
Abstract
本申请提供了一种内存管理方法、装置、设备及计算机可读存储介质;方法包括:获取进程请求的待分配共享内存类型;从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。通过本申请,能够根据实际需求缩放共享内存池的大小,从而可以提升内存利用率,并能更好地满足实际业务中的内存使用需求。
Description
技术领域
本申请涉及计算机技术,尤其涉及一种内存管理方法、装置、设备及计算机可读存储介质。
背景技术
共享内存是操作系统例如Unix系统中多进程之间的通信方法,这种方法通常用于一个程序的多进程间通信,或者多个程序间的信息传递。此外,共享内存还常用于保存进程的内存状态。由于共享内存的生命周期是依赖系统的运行时的,与进程生命周期独立。因此,可以利用这一特性,通过共享内存提高进程内存数据的可用性和可靠性。在相关技术中,通常采用预分配固定共享内存池的方式实现共享内存,由于该方式需要预先固定分配较大的内存片,会导致内存占用过高,且无法很好地满足实际应用中共享内存池缩放的使用需求。
发明内容
本申请实施例提供一种内存管理方法、装置、设备及计算机可读存储介质,能够根据实际需求缩放共享内存池的大小,从而可以提升内存利用率,并能更好地满足实际业务中的内存使用需求。
本申请实施例的技术方案是这样实现的:
本申请实施例提供一种内存管理方法,包括:
获取进程请求的待分配共享内存类型;
从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;
根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;
根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
在一些实施例中,所述根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元,包括:根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页;在所述内存页中为所述进程分配共享内存单元。
在一些实施例中,所述根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页,包括:根据所述内存页配置信息,确定所述共享内存池的当前分配页;在所述当前分配页中的共享内存单元分配完的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页;对应地,所述在所述内存页中为所述进程分配共享内存单元,包括:在所述当前分配页中为所述进程分配共享内存单元。
在一些实施例中,所述根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页,包括:在所述共享内存池中查找可分配内存页;在所述共享内存池中不存在可分配内存页的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页;将所述新的内存页确定为所述共享内存池的新的当前分配页;在所述共享内存池中存在可分配内存页的情况下,将所述可分配内存页确定为新的当前分配页。
在一些实施例中,所述内存页配置信息中包括所述共享内存池的内存增长模式;所述根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页,包括:根据所述共享内存池的内存增长模式,确定当前内存增长量;从所述内存中申请大小为所述当前内存增长量的新的内存页;将所述新的内存页确定为所述共享内存池的新的当前分配页。
在一些实施例中,所述方法还包括:获取进程发送的待释放的共享内存单元的标识;根据所述标识,释放与所述标识对应的共享内存单元;根据所述标识,确定所述共享内存单元所属的内存页和所述内存页所属的共享内存池;在所述内存页中的各共享内存单元均未被使用,且所述内存页不是所述共享内存池的当前分配页的情况下,释放所述内存页。
在一些实施例中,所述方法还包括:在所述内存页中的各共享内存单元均未被使用,且所述内存页为所述共享内存池的当前分配页的情况下,查找所述内存页的前一页;在所述前一页的共享内存单元使用率小于使用率阈值的情况下,释放所述当前分配页;从所述内存页依次向前查找所述共享内存池中的各内存页,将查找到的第一个不为空的内存页确定为所述共享内存池的新的当前分配页。
本申请实施例提供一种内存管理装置,包括:
第一获取模块,用于获取进程请求的待分配共享内存类型;
第二获取模块,用于从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;
第三获取模块,用于根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;
分配模块,用于根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
在一些实施例中,所述分配模块,还用于:根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页;在所述内存页中为所述进程分配共享内存单元。
在一些实施例中,所述分配模块,还用于:根据所述内存页配置信息,确定所述共享内存池的当前分配页;在所述当前分配页中的共享内存单元分配完的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页;在所述当前分配页中为所述进程分配共享内存单元。
在一些实施例中,所述分配模块,还用于:在所述共享内存池中查找可分配内存页;在所述共享内存池中不存在可分配内存页的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页;将所述新的内存页确定为所述共享内存池的新的当前分配页;在所述共享内存池中存在可分配内存页的情况下,将所述可分配内存页确定为新的当前分配页。
在一些实施例中,所述内存页配置信息中包括所述共享内存池的内存增长模式;所述分配模块,还用于:根据所述共享内存池的内存增长模式,确定当前内存增长量;从所述内存中申请大小为所述当前内存增长量的新的内存页;将所述新的内存页确定为所述共享内存池的新的当前分配页。
在一些实施例中,所述装置还包括:第四获取模块,用于获取进程发送的待释放的共享内存单元的标识;第一释放模块,用于根据所述标识,释放与所述标识对应的共享内存单元;第一确定模块,用于根据所述标识,确定所述共享内存单元所属的内存页和所述内存页所属的共享内存池;第二释放模块,用于在所述内存页中的各共享内存单元均未被使用,且所述内存页不是所述共享内存池的当前分配页的情况下,释放所述内存页。
在一些实施例中,所述装置还包括:查找模块,用于在所述内存页中的各共享内存单元均未被使用,且所述内存页为所述共享内存池的当前分配页的情况下,查找所述内存页的前一页;第三释放模块,用于在所述前一页的共享内存单元使用率小于使用率阈值的情况下,释放所述当前分配页;第二确定模块,用于从所述内存页依次向前查找所述共享内存池中的各内存页,将查找到的第一个不为空的内存页确定为所述共享内存池的新的当前分配页。
本申请实施例提供一种内存管理设备,包括:存储器,用于存储可执行指令;处理器,用于执行所述存储器中存储的可执行指令时,实现本申请实施例提供的方法。
本申请实施例提供一种计算机可读存储介质,存储有可执行指令,用于引起处理器执行时,实现本申请实施例提供的方法。
本申请实施例具有以下有益效果:
通过从内存中预先创建的共享内存片内,获取与待分配共享内存类型对应的共享内存池的管理区域地址,根据管理区域地址,从共享内存片内,获取共享内存池的内存页配置信息,并根据内存页配置信息,从内存中为进程动态分配共享内存单元。这样,由于预先创建的内存片中只需要存储各个类型内存池的管理区域地址和内存页配置信息等管理信息,因此只需占用较小的固定内存。此外,由于在使用过程中可以从内存中为进程动态分配共享内存单元,因此可以根据实际需求缩放共享内存池的大小,从而可以提升内存利用率,并能更好地满足实际业务中的内存使用需求。
附图说明
图1A是相关技术中共享内存的分配示意图;
图1B是本申请实施例提供的信息处理系统的一个可选的架构示意图;
图2是本申请实施例提供的内存管理设备的结构示意图;
图3是本申请实施例提供的内存管理方法的一个可选的流程示意图;
图4是本申请实施例提供的内存管理方法的一个可选的流程示意图;
图5是本申请实施例提供的内存管理方法的一个可选的流程示意图;
图6是本申请实施例提供的内存管理方法的一个可选的流程示意图;
图7是本申请实施例提供的内存管理方法的一个可选的流程示意图;
图8A是本申请实施例提供的内存管理方法的一种内存分配示意图;
图8B为本申请实施例提供的一种内存管理初始化方法的实现流程示意图;
图8C为本申请实施例提供的一种内存分配方法的实现流程示意图;
图8D为本申请实施例提供的一种内存回收方法的实现流程示意图。
具体实施方式
为了使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述,所描述的实施例不应视为对本申请的限制,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本申请保护的范围。
在以下的描述中,涉及到“一些实施例”,其描述了所有可能实施例的子集,但是可以理解,“一些实施例”可以是所有可能实施例的相同子集或不同子集,并且可以在不冲突的情况下相互结合。
如果申请文件中出现“第一/第二”的类似描述则增加以下的说明,在以下的描述中,所涉及的术语“第一\第二\第三”仅仅是区别类似的对象,不代表针对对象的特定排序,可以理解地,“第一\第二\第三”在允许的情况下可以互换特定的顺序或先后次序,以使这里描述的本申请实施例能够以除了在这里图示或描述的以外的顺序实施。
除非另有定义,本文所使用的所有的技术和科学术语与属于本申请的技术领域的技术人员通常理解的含义相同。本文中所使用的术语只是为了描述本申请实施例的目的,不是旨在限制本申请。
为了更好地理解本申请实施例提供的内存管理方法,下面先对相关技术中共享内存池的设计方案进行说明。
在相关技术中,通常采用预分配固定共享内存池的方式实现共享内存。参见图1A,图1A是相关技术中共享内存的分配示意图。如图1A所示,进程初始化时,在内存中预先分配一个固定大小的共享内存片10,并根据不同类型的内存池的配置,在共享内存片10中初始化出i个不同大小的共享内存池20、21、22、23、……、2(i-1),其中i为大于0的整数,在共享内存片10的起始位置处存放有各个类型的共享内存池的管理信息,比如各共享内存池的起始地址、地址偏移量等等,其中,各共享内存池的起始地址保存在共享内存片10起始位置处的内存池地址数组11中,以共享内存池的类型作为内存池地址数组11的索引下标,即可找到与各类型对应的共享内存池的起始地址。在初始化一个共享内存池20时,根据配置指定包含预设数量的共享内存单元30,之后分配共享内存时从该共享内存池中获取共享内存单元进行分配。每个共享内存池的头部都保存有一个结构体,管理该共享内存池中的共享内存单元信息,例如共享内存单元的大小、共享内存单元的总数、共享内存池中未分配的共享内存单元数量等等。对于共享内存池中未分配的共享内存单元可以连接成一个空闲链表,每次分配共享内存单元时可以直接在该空闲链表中进行分配。共享内存池和共享内存单元都采用地址偏移量进行地址定位,共享内存池和共享内存单元的结构中都保存着相对于共享内存片的起始地址的偏移量),便于进程重新启动时进行内存恢复重构操作。
上述相关技术中的方案必须预先分配包含固定大小共享内存池的内存片,使用过程中不能根据实际需求缩放共享内存池的大小。这样,在实际产线运行过程中有如下缺点:1)必须预先分配满足最大业务需求大小的内存片,从而导致内存占用量过高;2)使用过程中,在内存需求较小时,不能根据实际情况缩小共享内存池的大小,从而导致内存利用率过低;3)使用过程中,不能根据实际业务对内存的增长需求扩大共享内存池的大小,从而导致共享内存的分配无法满足业务使用需求。
本申请实施例提供一种内存管理方法、装置、设备和计算机可读存储介质,能够根据实际需求缩放共享内存池的大小,从而可以提升内存利用率,并能更好地满足实际业务中的内存使用需求。下面说明本申请实施例提供的内存管理设备的示例性应用,本申请实施例提供的内存管理设备可以实施为笔记本电脑,平板电脑,台式计算机,机顶盒,移动设备(例如,移动电话,便携式音乐播放器,个人数字助理,专用消息设备,便携式游戏设备)等各种类型的用户终端,也可以实施为服务器。下面,将说明内存管理设备实施为服务器时的示例性应用。
参见图1B,图1B是本申请实施例提供的信息处理系统的一个可选的架构示意图,内置有操作系统的服务器200可以用于:获取进程请求的待分配共享内存类型;从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
在一些实施例中,服务器200可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群或者分布式系统,还可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content DeliveryNetwork,CDN)服务、以及大数据和人工智能平台等基础云计算服务的云服务器。
参见图2,图2是本申请实施例提供的内存管理设备200的结构示意图,图2所示的内存管理设备200包括:至少一个处理器210、存储器250、至少一个网络接口220和用户接口230。内存管理设备200中的各个组件通过总线系统240耦合在一起。可理解,总线系统240用于实现这些组件之间的连接通信。总线系统240除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但是为了清楚说明起见,在图2中将各种总线都标为总线系统240。
处理器210可以是一种集成电路芯片,具有信号的处理能力,例如通用处理器、数字信号处理器(DSP,Digital Signal Processor),或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等,其中,通用处理器可以是微处理器或者任何常规的处理器等。
用户接口230包括使得能够呈现媒体内容的一个或多个输出装置231,包括一个或多个扬声器和/或一个或多个视觉显示屏。用户接口230还包括一个或多个输入装置232,包括有助于用户输入的用户接口部件,比如键盘、鼠标、麦克风、触屏显示屏、摄像头、其他输入按钮和控件。
存储器250可以是可移除的,不可移除的或其组合。示例性的硬件设备包括固态存储器,硬盘驱动器,光盘驱动器等。存储器250可选地包括在物理位置上远离处理器210的一个或多个存储设备。
存储器250包括易失性存储器或非易失性存储器,也可包括易失性和非易失性存储器两者。非易失性存储器可以是只读存储器(ROM,Read Only Me mory),易失性存储器可以是随机存取存储器(RAM,Random Access Memor y)。本申请实施例描述的存储器250旨在包括任意适合类型的存储器。
在一些实施例中,存储器250能够存储数据以支持各种操作,这些数据的示例包括程序、模块和数据结构或者其子集或超集,下面示例性说明。
操作系统251,包括用于处理各种基本系统服务和执行硬件相关任务的系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务;
网络通信模块252,用于经由一个或多个(有线或无线)网络接口220到达其他计算设备,示例性的网络接口220包括:蓝牙、无线相容性认证(WiFi)、和通用串行总线(USB,Universal Serial Bus)等;
呈现模块253,用于经由一个或多个与用户接口230相关联的输出装置231(例如,显示屏、扬声器等)使得能够呈现信息(例如,用于操作外围设备和显示内容和信息的用户接口);
输入处理模块254,用于对一个或多个来自一个或多个输入装置232之一的一个或多个用户输入或互动进行检测以及翻译所检测的输入或互动。
在一些实施例中,本申请实施例提供的内存管理装置可以采用软件方式实现,图2示出了存储在存储器250中的内存管理装置255,其可以是程序和插件等形式的软件,包括以下软件模块:第一获取模块2551、第二获取模块2552、第三获取模块2553、分配模块2554,这些模块是逻辑上的,因此根据所实现的功能可以进行任意的组合或进一步拆分。
将在下文中说明各个模块的功能。
在另一些实施例中,本申请实施例提供的装置可以采用硬件方式实现,作为示例,本申请实施例提供的装置可以是采用硬件译码处理器形式的处理器,其被编程以执行本申请实施例提供的内存管理方法,例如,硬件译码处理器形式的处理器可以采用一个或多个应用专用集成电路(ASIC,Application Specif ic Integrated Circuit)、DSP、可编程逻辑器件(PLD,Programmable Logic De vice)、复杂可编程逻辑器件(CPLD,ComplexProgrammable Logic Device)、现场可编程门阵列(FPGA,Field-Programmable GateArray)或其他电子元件。
下面将结合本申请实施例提供的终端或服务器的示例性应用和实施,说明本申请实施例提供的内存管理方法。
参见图3,图3是本申请实施例提供的内存管理方法的一个可选的流程示意图,下面将结合图3示出的步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
在步骤S101中,获取进程请求的待分配共享内存类型。
这里,进程可以通过向操作系统发送请求来请求分配共享内存。待分配共享内存类型为进程请求分配的共享内存的类型,进程可以根据不同的业务需求请求不同类型的共享内存,可以申请的共享内存的类型可以是根据实际业务需求预先设定的,不同类型可以对应不同的共享内存池,本申请实施例并不限定。在实施时,进程可以在发送的请求中携带待分配共享内存类型。
在步骤S102中,从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址。
这里,可以在进程初始化时,在内存中创建特定大小的共享内存块作为预先创建的共享内存片,在共享内存片内可以为至少一个具有不同类型的共享内存池划分对应的管理区域。在共享内存池的管理区域内可以存储该共享内存池的管理信息,包括但不限于共享内存池的初始大小、当前大小、内存增长模式、内存页的基础配置信息等中的一种或多种。
共享内存池的管理区域地址为共享内存池的管理区域所在的内存地址,可以将每一共享内存池的管理区域地址也存储在该共享内存片中。各共享内存池的管理区域地址可以存储在共享内存片中连续的地址处,也可以分散存储在共享内存片中不同的地址处。在实施时,本领域技术人员可以根据实际情况确定各共享内存池的管理区域地址的存储方式,并根据确定的存储方式,采用合适的方法根据待分配共享内存类型,从共享内存片内获取与待分配共享内存类型对应的共享内存池的管理区域地址,这里并不限定。
例如,各共享内存池的管理区域地址可以以数组形式存储在共享内存片的特定地址处,例如共享内存片的起始地址处、与起始地址具有一定地址偏移量的地址处等,该特定地址可以是系统默认的地址,也可以是用户配置的地址,通过访问该特定地址即可获得包括各共享内存池的管理区域地址的地址数组,根据预设的共享内存的类型与地址数组中各元素之间的对应关系,可以确定该地址数组中与待分配共享内存类型对应的共享内存池的管理区域地址。
再如,不同共享内存池的管理区域地址还可以按照预设的共享内存的类型与存储地址之间的对应关系,分别存储在共享内存片的不同地址处,根据预设的共享内存的类型与存储地址之间的对应关系,可以确定与待分配共享内存类型对应的存储地址,通过访问该存储地址,即可获得与待分配共享内存类型对应的共享内存池的管理区域地址。这样,可以根据共享内存的类型获取对应的共享内存池的管理区域地址,
在一些实施方式中,可以通过访问共享内存片中的特定地址,得到管理区域地址数组;以待分配共享内存类型作为索引下标,查询管理区域地址数组,得到与待分配共享内存类型对应的共享内存池的管理区域地址。
在步骤S103中,根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息。
这里,共享内存池的内存页配置信息为管理该共享内存池中的内存页的基本配置信息,例如内存页中共享内存单元的大小、内存页中初始分配的共享内存单元的数量、内存页中的共享内存单元数量的预设上限以及当前正在分配的内存页在内存页指针数组中的下标等。
在实施时,可以在进程初始化时,在共享内存片内为至少一个具有不同类型的共享内存池划分对应的管理区域后,在每一所述共享内存池的管理区域内,初始化所述共享内存池的内存页配置信息。这样,根据管理区域地址,可以从共享内存片内获取共享内存池的内存页配置信息。
在步骤S104中,根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
这里,共享内存单元是为进程进行内存分配时,共享内存池中可以分配或释放的最小内存块。共享内存单元的大小可以根据共享内存池的内存页配置信息确定,可以是用户根据实际业务需求设定的,也可以是系统默认值。
在进程初始化时,在预先创建的共享内存片中可以不用为共享内存池从内存中申请内存,或者可以仅从内存中申请初始大小的内存作为共享内存池中的初始共享内存。在为进程分配共享内存的过程中,可以根据共享内存池中的内存页配置信息,动态地从内存中申请内存,来为进程分配所需的共享内存单元。
本申请实施例中,通过从内存中预先创建的共享内存片内,获取与待分配共享内存类型对应的共享内存池的管理区域地址,根据管理区域地址,从共享内存片内,获取共享内存池的内存页配置信息,并根据内存页配置信息,从内存中为进程动态分配共享内存单元。这样,由于预先创建的内存片中只需要存储各个类型内存池的管理区域地址和内存页配置信息等管理信息,因此只需占用较小的固定内存。此外,由于在使用过程中可以从内存中为进程动态分配共享内存单元,因此可以根据实际需求缩放共享内存池的大小,从而可以提升内存利用率,并能更好地满足实际业务中的内存使用需求。
在一些实施例中,参见图4,图4是本申请实施例提供的内存管理方法的一个可选的流程示意图,图3示出的步骤S104可以通过步骤S401至步骤S402实现,下面将结合各步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
步骤S401中,根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页。
这里,共享内存池中的共享内存可以以内存页的形式存在,内存页可以以内存页数组、链表、集合等任意合适的方式实现,每个内存页中可以包括多个共享内存单元。在实施时,内存页中包括的共享内存单元的数量可以根据实际情况确定,这里并不限定。在共享内存池中没有从内存申请的共享内存时,共享内存池中的内存页数组或链表可以为空;在共享内存池中存在从内存申请的共享内存时,通过访问共享内存池中的内存页数组或链表等,即可查询到共享内存池中的内存页。
在当前共享内存池中能分配的共享内存单元不足的情况下,可以根据内存页配置信息,从内存中申请特定大小的新的内存页用于进行内存分配。在实施时,本领域技术人员可以根据实际情况采用合适的方式申请新的内存页,这里并不限定。
在一些实施方式中,共享内存池的管理区域中存储的管理信息中包括共享内存池的内存页指针数组,内存页指针数组用于存储指向该共享内存池中各内存页的指针。在实施时,在共享内存分配过程中,从内存中为共享内存池申请的内存页可以以匿名页的方式实现,申请成功后,可以指向与将该内存页对应的匿名页的起始地址的指针添加至共享内存池的内存页指针数组。
步骤S402中,在所述内存页中为所述进程分配共享内存单元。
这里,可以根据进程请求分配的共享内存的大小,从内存页中向进程分配相应数量的共享内存单元。在实施时,可以将分配的共享内存单元的标识信息返回给进程,共享内存单元的标识信息可以包括但不限于共享内存单元的起始地址、相对内存页起始地址的地址偏移量等中的一种或多种,通过该标识信息可以唯一地确定共享内存池中的一块共享内存单元。
本申请实施例中,根据共享内存池的内存页配置信息,从内存中动态获取共享内存池的内存页,并在内存页中为进程分配共享内存单元。这样,由于从内存中申请的内存页可以包括多个共享内存单元,可以有效减少从内存中申请内存页的频率,从而可以提高系统运行性能,并能较好地满足进程的共享内存分配请求。
在一些实施例中,参见图5,图5是本申请实施例提供的内存管理方法的一个可选的流程示意图,图4示出的步骤S401可以通过步骤S501至步骤S502实现,图4示出的步骤S402可以通过步骤S503实现,下面将结合各步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
步骤S501中,根据所述内存页配置信息,确定所述共享内存池的当前分配页。
这里,共享内存池的当前分配页为共享内存池中当前用于共享内存分配的内存页。内存页配置信息中可以包括共享内存池中当前用于共享内存分配的内存页的标识,根据该标识可以确定共享内存池的当前分配页。在实施时,内存页的标识可以包括但不限于内存页的指针或者存储该指针的地址等,本领域技术人员可以根据实际情况确定合适的内存页的标识,这里并不限定。
在一些实施方式中,共享内存池中各内存页的指针存储在内存页指针数组中,内存页的标识可以是内存页的指针在内存页指针数组中的下标。共享内存池的内存页配置信息中可以包括当前分配页在内存页指针数组中的下标,根据该下标,可以确定共享内存池中的当前分配页。
步骤S502中,在所述当前分配页中的共享内存单元分配完的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页。
这里,在当前分配页中的共享内存单元已分配完的情况下,需要从内存中申请新的内存页用于共享内存分配,可以将内存页配置信息中当前分配页的标识更新为新的内存页的标识,从而将内存中申请新的内存页作为共享内存池的新的当前分配页。在实施时,可以对已经分配的共享内存单元进行标记,通过该标记可以确定内存页中的共享内存单元是否已经分配完;还可以为每一内存页维护一个空闲内存单元链表,用于存放内存页中未被分配的共享内存单元,在该空闲内存单元链表为空的情况下,可以确定当前分配页中的共享内存单元已分配完,在该空闲内存单元链表不为空的情况下,可以确定当前分配页中的共享内存单元未分配完。本领域技术人员可以根据实际情况采用合适的方式确定当前分配页中的共享内存单元是否已分配完,本申请实施例并不限定。
步骤S503中,在所述当前分配页中为所述进程分配共享内存单元。
本申请实施例中,在当前分配页中的共享内存单元分配完的情况下,根据内存页配置信息,从内存中申请新的内存页作为共享内存池的新的当前分配页,这样,可以在实际业务对共享内存的增长需求较大时,动态扩大共享内存池的大小,从而能够更好地满足产线上随时存在的共享内存扩张需求。
在一些实施例中,基于图5,图5示出的步骤S502所述的根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页,可以通过步骤S5101至步骤S5104实现,下面将结合各步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
步骤S5101中,在所述共享内存池中查找可分配内存页。
这里,可分配内存页为共享内存池中共享内存单元未分配完的内存页。在实施时,可以通过任意合适的方式查找共享内存池中的内存页,来确定可分配内存页,本申请实施例对此并不限定。
步骤S5102中,在所述共享内存池中不存在可分配内存页的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页。
这里,内存页配置信息中可以包括当前要申请的新的内存页的配置信息,例如当前申请的内存页的大小、共享内存单元数量等。根据内存页配置信息,可以从内存中申请满足配置的新的内存页。
步骤S5103中,将所述新的内存页确定为所述共享内存池的新的当前分配页。
步骤S5104中,在所述共享内存池中存在可分配内存页的情况下,将所述可分配内存页确定为新的当前分配页。
这里,可以将找到的第一个可分配内存页作为新的当前分配页,也可以将共享内存池内找到的多个可分配内存页中共享内存单元使用率满足特定条件的可分配内存页作为新的当前分配页。在实施时,本领域技术人员可以根据实际情况采用合适的方式选择合适的可分配内存页作为新的当前分配页,本申请实施例并不限定。例如,可以将共享内存池内找到的多个可分配内存页中共享内存单元使用率最低的可分配内存页作为新的当前分配页。
本申请实施例中,在共享内存池中不存在可分配内存页的情况下,根据内存页配置信息,从内存中申请新的内存页作为共享内存池的新的当前分配页,在共享内存池中存在可分配内存页的情况下,将可分配内存页确定为新的当前分配页。这样,可以充分利用当前已申请的内存页,提高内存利用率,减少内存浪费,并且能够减少不必要的新的内存页的申请,从而可以有效提高系统性能。
在一些实施例中,基于图5,所述内存页配置信息中包括所述共享内存池的内存增长模式。图5示出的步骤S502所述的根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页,可以通过步骤S5201至步骤S5203实现,下面将结合各步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
步骤S5201中,根据所述共享内存池的内存增长模式,确定当前内存增长量。
这里,共享内存池的内存增长模式为共享内存池的内存动态扩张时的内存增长模式,可以包括但不限于指数模式、线性增长模式、等分模式等。用户可以根据实际业务中不同类型的共享内存的使用情况(比如内存使用过程中的增长趋势等),为对应不同类型的共享内存池配置合适的内存增长模式。
当前内存增量为当前申请新的内存页时,共享内存池的内存增量,也即当前要申请的内存页的大小。在实施时,可以根据共享内存池的内存增长模式,确定当前内存增长量。例如,在内存增长模式为指数模式的情况下,新增的内存页的大小会是上一次新增内存页的两倍,此时,当前内存增长量即为上一次新增内存页的内存大小的两倍,这样可以很好地保证内存需求呈指数增长的业务的运行。又如,在内存增长模式为等分模式的情况下,新增的内存页的大小会与上一次新增内存页的大小相等,此时,当前内存增长量即为上一次新增内存页的内存大小,这样可以很好地保证内存需求均匀增长的业务的运行,同时还能有效避免申请过大的新的内存页导致的内存浪费。
步骤S5202中,从所述内存中申请大小为所述当前内存增长量的新的内存页。
步骤S5203中,将所述新的内存页确定为所述共享内存池的新的当前分配页。
本申请实施例中,根据共享内存池的内存增长模式,确定当前内存增长量,并从内存中申请大小为当前内存增长量的新的内存页作为共享内存池的新的当前分配页。这样,由于共享内存池的内存增长模式为用户根据实际业务中不同类型的共享内存的使用情况设置的,因此,可以很好地保证不同内存需求增长趋势的业务的正常运行,并有效避免申请过大的新的内存页导致的内存浪费。
在一些实施例中,参见图6,图6是本申请实施例提供的内存管理方法的一个可选的流程示意图,基于图3至图5中任一所示的方法,该方法还可以执行如下步骤S601至步骤S604,下面将结合各步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
步骤S601中,获取进程发送的待释放的共享内存单元的标识。
这里,共享内存单元的标识可以包括但不限于共享内存单元的起始地址、相对内存页起始地址的地址偏移量等中的一种或多种,通过该标识信息可以唯一地确定共享内存池中的一块共享内存单元。
步骤S602中,根据所述标识,释放与所述标识对应的共享内存单元。
这里,根据标识可以唯一地确定待释放的共享内存单元,从而实现共享内存单元的释放。释放后的共享内存单元被回收至该共享内存单元所属的内存页中,可用于在该内存页中的再次分配。在实施时,本领域技术人员可以根据实际情况采用合适的方式释放确定的待释放共享内存单元,本申请实施例并不限定。
步骤S603中,根据所述标识,确定所述共享内存单元所属的内存页和所述内存页所属的共享内存池。
这里,共享内存单元所述的内存页和内存页所述的共享内存池均是唯一确定的,根据共享内存单元的标识即可确定。在实施时,本领域技术人员可以根据实际情况选择任意合适的方式确定共享内存单元所属的内存页和内存页所属的共享内存池。
例如,可以在共享内存池的管理信息中维护共享内存单元的标识与内存页的标识之间的对应关系,以及内存页的标识与共享内存池之间的对应关系,根据共享内存单元的标识与内存页的标识之间的对应关系以及内存页的标识与共享内存池之间的对应关系,即可确定共享内存单元的标识对应的共享内存单元所属的内存页和该内存页所属的共享内存池。
又如,共享内存单元的标识可以包括所属内存页的起始地址和该共享内存单元相对该起始地址的偏移地址,因此,根据该共享内存单元的标识可以确定所属内存页的起始地址,从而可以确定该共享内存单元所述的内存页;在共享内存池的管理信息中可以包括该共享内存池的内存范围,因此,根据该内存页的起始地址查找各共享内存池的内存范围,即可确定该内存页所属的共享内存池。
步骤S604中,在所述内存页中的各共享内存单元均未被使用,且所述内存页不是所述共享内存池的当前分配页的情况下,释放所述内存页。
这里,在内存页中的各共享内存单元均未被使用,且该内存页不是共享内存池的当前分配页的情况下,该内存页为空闲的内存页,因此,可以将该内存页。释放后的内存页被回收至内存中,可以用于其他进程在需要的时候申请使用。
需要说明的是,上述步骤S601至S604的执行顺序并不限于图6所示,例如,步骤S601至S604还可以在步骤S101之前执行。
本申请实施例中,可以根据进程发送的待释放的共享内存单元的标识,释放相应的共享内存单元,释放后的共享内存单元被回收至该共享内存单元所属的内存页中,可用于在该内存页中的再次分配,这样可以有效提高内存的利用率。并且,在内存页中的各共享内存单元均未被使用,且该内存页不是共享内存池的当前分配页的情况下,可以将该内存页回收至内存。这样,在共享内存需求较小时,能根据实际情况缩小共享内存池占用的内存大小,可以进一步提高内存利用率,减少内存的浪费。
在一些实施例中,参见图7,图7是本申请实施例提供的内存管理方法的一个可选的流程示意图,基于图6,该方法还可以执行如下步骤S701至步骤S703,下面将结合各步骤进行说明,下述步骤的执行主体可以是前文的终端或服务器。
步骤S701中,在所述内存页中的各共享内存单元均未被使用,且所述内存页为所述共享内存池的当前分配页的情况下,查找所述内存页的前一页。
这里,共享内存池中的内存页可以具有特定的先后顺序,内存页的前一页可以为基于该先后顺序确定的该内存页的前一内存页。在实施时,本领域技术人员可以根据实际情况采用合适的方式确定内存页的先后顺序,本申请实施例并不限定。例如,可以根据内存页指针在数组或链表中的顺序确定内存页的先后顺序,也可以根据内存页的大小确定内存页的先后顺序,还可以根据内存页的共享内存单元使用率确定内存页的先后顺序。
步骤S702中,在所述前一页的共享内存单元使用率小于使用率阈值的情况下,释放所述当前分配页。
这里,内存页的共享内存单元使用率为内存页中已分配的共享内存单元与该内存页中全部共享内存单元之间的比率。使用率阈值可以是系统的默认值,也可以是用户根据实际需求预先设定的值,这里并不限定。
在一些示例中,使用率阈值可以是50%,在前一页的共享内存单元使用率小于50%的情况下,可以释放当前分配页。
步骤S703中,从所述内存页依次向前查找所述共享内存池中的各内存页,将查找到的第一个不为空的内存页确定为所述共享内存池的新的当前分配页。
这里,在前一页的共享内存单元使用率小于使用率阈值的情况下,前一页中的各共享内存单元可能均未被使用,此时,还需要继续向前查找,直到找到第一个不为空的内存页,可以将该不为空的内存页作为共享内存池的新的当前分配页。若内存页中的各共享内存单元均未被分配,则该内存页为空;若内存页中由共享内存单元已被分配,则该内存页不为空。
需要说明的是,上述步骤S701至S703的执行顺序并不限于图7所示,例如,步骤S701至S703还可以在步骤S604之前执行。
本申请实施例中,在当前释放的共享内存单元所述的内存页为当前分配页且为空的情况下,若该内存页的前一页使用率小于特定的使用率阈值,则可以释放当前分配页,并将从该内存页往前查找到的第一个不为空的内存页更新为共享内存池的新的当前分配页。这样,可以进一步提高内存利用率,并能保证在内存页的释放过程中,共享内存池的当前分配页能够得到较好地维护,便于共享内存单元的后续分配。
下面,将说明本申请实施例在一个实际的应用场景中的示例性应用。本申请实施例提供的方法可以应用于任意运用共享内存的服务器进程的内存管理,例如各种游戏服务器进程的内存管理等场景。
以游戏服务器进程的共享内存管理场景为例,本申请实施例提供了一种内存管理方法,可以实现游戏服务器共享内存的动态分配与管理,该方法可以应用于任意支持共享内存的操作系统中,由前述的终端或服务器的处理器执行。例如,可以应用于Linux、SystemV、伯克利软件套件(Berkeley Software Di stribution,BSD)等类Unix系统中,也可以应用于Windows系统中。在该方法中,进程在运行时具有以下能力:1)启动时,需要占用的固有管理内存很少;2)在使用过程中,可以对共享内存进行动态的扩张与缩减;3)能提高内存利用率;4)能降低进程的内存占用率。
参见图8A,图8A是本申请实施例提供的内存管理方法的一种内存分配示意图。在如图8A所示,本申请实施例提供的内存管理方法在进程初始化时,在内存中预先分配一个较小的共享内存片800,在共享内存片800中划分出j个管理区域810、811、812、813、……、81(j-1),分别用于存储各个类型共享内存池中内存页的基本配置信息,其中j为大于0的整数;共享内存片800的起始位置用于存放各个类型共享内存池的管理信息801,比如各共享内存池的管理区域的起始地址、地址偏移量等等;根据不同类型的内存池的配置,可以在共享内存片800中各共享内存池的管理区域810、811、812、813、……、81(j-1)中,分别初始化出对应的内存页指针数组,用于存放共享内存池中的各内存页指针,内存页指针指向内存页所对应的从内存中申请的匿名页;例如,共享内存池管理区域810中初始化的内存页指针数组中包括共享内存池中的k个内存页指针8100、8101、8102、……、810(k-1),其中k为大于0的整数;在内存分配过程中,根据配置从内存中申请得到内存页,在申请的内存页中初始化出特定数量的共享内存单元830,在分配共享内存时,从内存页中获取共享内存单元进行分配。
本申请实施例提供的内存管理方法主要包括内存管理初始化、内存分配和内存回收三个流程,各流程的具体实现过程如下:
1)内存管理初始化
在初始化一个共享内存池时,可以根据配置指定该共享内存池内初始分配的共享内存单元的数量、后续内存动态扩张时共享内存池的内存增长模式(例如指数模式、线性增长模式、等分模式等)。每个共享内存池在相应的管理区域都保存有一个结构体,管理该共享内存池中的内存页的基本配置信息,例如内存页中共享内存单元的大小、内存页中初始分配的共享内存单元的数量、内存页中的共享内存单元数量的预设上限以及当前正在分配的内存页在内存页指针数组中的下标等。
参见图8B,图8B为本申请实施例提供的一种内存管理初始化方法的实现流程示意图。如图8B所示,该方法包括以下步骤:
步骤S811,根据配置计算待分配的共享内存唯一键值;这里共享内存唯一键值可以是系统自动分配的也可以是用户指定的,可以唯一确定一块共享内存片;
步骤S812,判断当前进程是否为恢复模式;若否,则进入步骤S813;若是,则进入步骤S818;这里,恢复模式为进程恢复共享内存与进程虚拟内存之间的映射的模式,可以根据启动进程时主动传入的进程启动模式的相关参数确定是否为恢复模式;
步骤S813,尝试创建键值为该共享内存唯一键值的共享内存块,并尝试连接创建的共享内存块;
步骤S814,判断该共享内存块是否连接成功;若是,则进入步骤S815;若否,则内存管理初始化失败;
步骤S815,将该共享内存块映射为共享内存片;
步骤S816,在共享内存片的结构体中为每个共享内存池划分管理区域;这里,可以根据业务内存类型为各共享内存池划分大小相等的管理区域,每一共享内存池的管理区域用于存储管理该共享内存池中的内存页的基本配置信息;
步骤S817,根据配置,初始化共享内存池中的内存页配置信息;这里,内存页配置信息即为管理该共享内存池中的内存页的基本配置信息,可以包括内存页的基础大小等,内存页的基础大小为内存页的管理数据的大小。共享内存池中的内存页配置信息初始化完成后,则内存管理初始化成功。
步骤S818,尝试连接共享内存唯一键值指向的共享内存块;
步骤S819,判断该共享内存块是否连接成功;若是,则内存管理初始化成功;若否,则共享内存块初始化失败。
2)内存分配
每次从共享内存池中为进程分配共享内存单元时,先检查当前分配页中的共享内存单元是否已经分配完毕,如果还没有分配完毕,则继续从当前分配页中分配共享内存单元。每一内存页中,未分配的共享内存单元通过一个空闲链表连接,每次从内存页中分配共享内存单元时,可以直接在该内存页的空闲链表中获取未分配的共享内存单元进行分配。如果当前分配页中的共享内存单元已经分配完,那么此时会根据该共享内存池的内存增长模式,从内存中新申请新大小的内存页作为新的当前分配页,例如:在内存增长模式为指数模式的情况下,新增的内存页的大小会是上一次新增内存页的两倍,这样可以很好地保证在运营的线上业务不断增长的内存需求。
参见图8C,图8C为本申请实施例提供的一种内存分配方法的实现流程示意图。如图8C所示,该方法包括以下步骤:
步骤S821,根据进程请求的共享内存池的类型,确定共享内存片中与该类型对应的共享内存池;这里,共享内存池的类型可以作为共享内存片起始地址处存储的共享内存池管理区域数组的索引下标,根据共享内存池的类型进行索引,可以确定共享内存池的管理区域,进而确定对应的共享内存池。进程请求的共享内存池的类型可以根据实际业务的不同而不同。
步骤S822,判断该共享内存池是否已初始化;若是,则进入步骤S823;若否,则分配失败。
步骤S823,判断该共享内存池的当前分配页中的共享内存单元是否分配完毕;若是,则进入步骤S824;若否,则进入步骤S829;
步骤S824,尝试在内存页指针数组中向后查找新的可分配内存页作为新的当前分配页;
步骤S825,判断是否找到新的可分配内存页;若是,则进入步骤S829;若否,则进入步骤S826;
步骤S826,尝试从内存申请新的内存页;
步骤S827,判断新的内存页是否申请成功;若是,则进入步骤S828;若否,则分配失败。
步骤S828,初始化新的内存页作为新的当前分配页;
步骤S829,从当前分配页的空闲链表中取出未分配的共享内存单元返回给进程。
3)内存回收
每次进程释放共享内存单元时,可以通过内存回收策略提高内存的使用率。如果释放共享内存单元后的当前内存页上的共享内存单元都已经释放完毕,且当前内存页并不是所在共享内存池的当前分配页,那么该当前内存页也可以释放了;如果当前内存页为所在共享内存池的当前分配页,且当前内存页的前一页的共享内存单元使用率不超过50%,那么可以将共享内存池的当前分配页下标调整至前一页。
参见图8D,图8D为本申请实施例提供的一种内存回收方法的实现流程示意图。如图8D所示,该方法包括以下步骤:
步骤S831,根据进程传入的共享内存单元的标识,释放该共享内存单元,并将该共享内存单元放入该共享内存单元所在的当前内存页的空闲链表中;这里,共享内存单元的标识可以包含该共享内存单元相对于当前内存页的起始地址的地址偏移量;
步骤S832,判断当前内存页是否全空;若是,则进入步骤S833;若否,则释放成功;这里,当前内存页中分配的共享内存单元均已释放时,可以确定当前内存页全空。
步骤S833,判断当前内存页是否为该共享内存池的当前分配页;若是,则进入步骤S834;若否,则进入步骤S837;
步骤S834,判断当前内存页的前一页的共享内存单元使用率是否小于一半;若是,则进入步骤S835;若否,则释放成功。
步骤S835,释放当前分配页;
步骤S836,在内存页指针数组中向前查找到第一个不为空的内存页作为新的当前分配页。
步骤S837,释放当前内存页。
本申请实施例提供的内存管理方法,进行需预先分配较小的共享内存片用于共享内存池的相关管理信息,在使用过程中能根据实际需求缩放共享内存池的大小。这样,在实际产线运行过程中有如下有益效果:1)无需预先分配满足最大业务需求大小的内存片,从而使得内存占用量极大降低;2)使用过程中,在内存需求较小时,能根据实际情况缩小内存分配大小,使得内存利用率高,减少内存的浪费;3)使用过程中,能根据实际业务对内存的增长需求,扩大内存分配大小,从而能够更好地满足产线上随时存在的内存扩张需求。
下面继续说明本申请实施例提供的内存管理装置255的实施为软件模块的示例性结构,在一些实施例中,如图2所示,存储在存储器250的内存管理装置255中的软件模块可以包括:
第一获取模块2551,用于获取进程请求的待分配共享内存类型;
第二获取模块2552,用于从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;
第三获取模块2553,用于根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;
分配模块2554,用于根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
在一些实施例中,所述分配模块,还用于:根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页;在所述内存页中为所述进程分配共享内存单元。
在一些实施例中,所述分配模块,还用于:根据所述内存页配置信息,确定所述共享内存池的当前分配页;在所述当前分配页中的共享内存单元分配完的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页;在所述当前分配页中为所述进程分配共享内存单元。
在一些实施例中,所述分配模块,还用于:在所述共享内存池中查找可分配内存页;在所述共享内存池中不存在可分配内存页的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页;将所述新的内存页确定为所述共享内存池的新的当前分配页;在所述共享内存池中存在可分配内存页的情况下,将所述可分配内存页确定为新的当前分配页。
在一些实施例中,所述内存页配置信息中包括所述共享内存池的内存增长模式;所述分配模块,还用于:根据所述共享内存池的内存增长模式,确定当前内存增长量;从所述内存中申请大小为所述当前内存增长量的新的内存页;将所述新的内存页确定为所述共享内存池的新的当前分配页。
在一些实施例中,所述装置还包括:第四获取模块,用于获取进程发送的待释放的共享内存单元的标识;第一释放模块,用于根据所述标识,释放与所述标识对应的共享内存单元;第一确定模块,用于根据所述标识,确定所述共享内存单元所属的内存页和所述内存页所属的共享内存池;第二释放模块,用于在所述内存页中的各共享内存单元均未被使用,且所述内存页不是所述共享内存池的当前分配页的情况下,释放所述内存页。
在一些实施例中,所述装置还包括:查找模块,用于在所述内存页中的各共享内存单元均未被使用,且所述内存页为所述共享内存池的当前分配页的情况下,查找所述内存页的前一页;第三释放模块,用于在所述前一页的共享内存单元使用率小于使用率阈值的情况下,释放所述当前分配页;第二确定模块,用于从所述内存页依次向前查找所述共享内存池中的各内存页,将查找到的第一个不为空的内存页确定为所述共享内存池的新的当前分配页。
本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行本申请实施例上述的内存管理方法。
本申请实施例提供一种存储有可执行指令的计算机可读存储介质,其中存储有可执行指令,当可执行指令被处理器执行时,将引起处理器执行本申请实施例提供的内存管理方法,例如,如图3示出的方法。
在一些实施例中,计算机可读存储介质可以是FRAM、ROM、PROM、EP ROM、EEPROM、闪存、磁表面存储器、光盘、或CD-ROM等存储器;也可以是包括上述存储器之一或任意组合的各种设备。
在一些实施例中,可执行指令可以采用程序、软件、软件模块、脚本或代码的形式,按任意形式的编程语言(包括编译或解释语言,或者声明性或过程性语言)来编写,并且其可按任意形式部署,包括被部署为独立的程序或者被部署为模块、组件、子例程或者适合在计算环境中使用的其它单元。
作为示例,可执行指令可以但不一定对应于文件系统中的文件,可以可被存储在保存其它程序或数据的文件的一部分,例如,存储在超文本标记语言(H TML,Hyper TextMarkup Language)文档中的一个或多个脚本中,存储在专用于所讨论的程序的单个文件中,或者,存储在多个协同文件(例如,存储一个或多个模块、子程序或代码部分的文件)中。
作为示例,可执行指令可被部署为在一个计算设备上执行,或者在位于一个地点的多个计算设备上执行,又或者,在分布在多个地点且通过通信网络互连的多个计算设备上执行。
综上所述,能够根据实际需求缩放共享内存池的大小,从而可以提升内存利用率,并能更好地满足实际业务中的内存使用需求。
以上所述,仅为本申请的实施例而已,并非用于限定本申请的保护范围。凡在本申请的精神和范围之内所作的任何修改、等同替换和改进等,均包含在本申请的保护范围之内。
Claims (10)
1.一种内存管理方法,其特征在于,包括:
获取进程请求的待分配共享内存类型;
从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;
根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;
根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
2.根据权利要求1所述的方法,其特征在于,所述根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元,包括:
根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页;
在所述内存页中为所述进程分配共享内存单元。
3.根据权利要求2所述的方法,其特征在于,所述根据所述内存页配置信息,从所述内存中动态获取所述共享内存池的内存页,包括:
根据所述内存页配置信息,确定所述共享内存池的当前分配页;
在所述当前分配页中的共享内存单元分配完的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页;
对应地,所述在所述内存页中为所述进程分配共享内存单元,包括:在所述当前分配页中为所述进程分配共享内存单元。
4.根据权利要求3所述的方法,其特征在于,所述根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页,包括:
在所述共享内存池中查找可分配内存页;
在所述共享内存池中不存在可分配内存页的情况下,根据所述内存页配置信息,从所述内存中申请新的内存页;
将所述新的内存页确定为所述共享内存池的新的当前分配页;
在所述共享内存池中存在可分配内存页的情况下,将所述可分配内存页确定为新的当前分配页。
5.根据权利要求3所述的方法,其特征在于,所述内存页配置信息中包括所述共享内存池的内存增长模式;所述根据所述内存页配置信息,从所述内存中申请新的内存页作为所述共享内存池的新的当前分配页,包括:
根据所述共享内存池的内存增长模式,确定当前内存增长量;
从所述内存中申请大小为所述当前内存增长量的新的内存页;
将所述新的内存页确定为所述共享内存池的新的当前分配页。
6.根据权利要求1至5中任一项所述的方法,其特征在于,所述方法还包括:
获取进程发送的待释放的共享内存单元的标识;
根据所述标识,释放与所述标识对应的共享内存单元;
根据所述标识,确定所述共享内存单元所属的内存页和所述内存页所属的共享内存池;
在所述内存页中的各共享内存单元均未被使用,且所述内存页不是所述共享内存池的当前分配页的情况下,释放所述内存页。
7.根据权利要求6所述的方法,其特征在于,所述方法还包括:
在所述内存页中的各共享内存单元均未被使用,且所述内存页为所述共享内存池的当前分配页的情况下,查找所述内存页的前一页;
在所述前一页的共享内存单元使用率小于使用率阈值的情况下,释放所述当前分配页;
从所述内存页依次向前查找所述共享内存池中的各内存页,将查找到的第一个不为空的内存页确定为所述共享内存池的新的当前分配页。
8.一种内存管理装置,其特征在于,包括:
第一获取模块,用于获取进程请求的待分配共享内存类型;
第二获取模块,用于从内存中预先创建的共享内存片内,获取与所述待分配共享内存类型对应的共享内存池的管理区域地址;
第三获取模块,用于根据所述管理区域地址,从所述共享内存片内,获取所述共享内存池的内存页配置信息;
分配模块,用于根据所述内存页配置信息,从所述内存中为所述进程动态分配共享内存单元。
9.一种内存管理设备,其特征在于,包括:
存储器,用于存储可执行指令;
处理器,用于执行所述存储器中存储的可执行指令时,实现权利要求1至7任一项所述的方法。
10.一种计算机可读存储介质,其特征在于,存储有可执行指令,用于被处理器执行时,实现权利要求1至7任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011215098.4A CN112214329B (zh) | 2020-11-04 | 2020-11-04 | 内存管理方法、装置、设备及计算机可读存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011215098.4A CN112214329B (zh) | 2020-11-04 | 2020-11-04 | 内存管理方法、装置、设备及计算机可读存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112214329A true CN112214329A (zh) | 2021-01-12 |
CN112214329B CN112214329B (zh) | 2023-09-22 |
Family
ID=74058193
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011215098.4A Active CN112214329B (zh) | 2020-11-04 | 2020-11-04 | 内存管理方法、装置、设备及计算机可读存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112214329B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112860444A (zh) * | 2021-04-26 | 2021-05-28 | 腾讯科技(深圳)有限公司 | 内存调用信息的确定方法和装置、存储介质及电子设备 |
CN113076266A (zh) * | 2021-06-04 | 2021-07-06 | 深圳华云信息系统有限公司 | 一种内存管理方法、装置、电子设备及存储介质 |
CN113194158A (zh) * | 2021-04-13 | 2021-07-30 | 杭州迪普科技股份有限公司 | 信息存储方法、装置、设备及计算机可读存储介质 |
CN113504994A (zh) * | 2021-07-26 | 2021-10-15 | 上海遁一信息科技有限公司 | 一种内存池性能弹性伸缩的实现方法及系统 |
CN113791988A (zh) * | 2021-11-17 | 2021-12-14 | 畅捷通信息技术股份有限公司 | 一种降低小程序包体积的渲染方法、装置及存储介质 |
CN114281484A (zh) * | 2021-12-29 | 2022-04-05 | 元心信息科技集团有限公司 | 数据传输方法、装置、设备及存储介质 |
CN115878351A (zh) * | 2023-03-03 | 2023-03-31 | 苏州浪潮智能科技有限公司 | 消息的传输方法及装置、存储介质及电子装置 |
CN116107762A (zh) * | 2023-04-11 | 2023-05-12 | 远江盛邦(北京)网络安全科技股份有限公司 | 内存分配方法、装置、电子设备和存储介质 |
CN117573377A (zh) * | 2024-01-15 | 2024-02-20 | 摩尔线程智能科技(北京)有限责任公司 | 内存管理方法、装置、设备及存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104050008A (zh) * | 2013-03-15 | 2014-09-17 | 中兴通讯股份有限公司 | 一种内存超分配管理系统及方法 |
US20150189034A1 (en) * | 2013-12-31 | 2015-07-02 | Rasesh Kelkar | Enhanced Shared Memory Based Communication Driver for Improved Performance and Scalability |
CN110704214A (zh) * | 2019-10-14 | 2020-01-17 | 北京京东乾石科技有限公司 | 进程间通信方法和装置 |
CN111427707A (zh) * | 2020-03-25 | 2020-07-17 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
-
2020
- 2020-11-04 CN CN202011215098.4A patent/CN112214329B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104050008A (zh) * | 2013-03-15 | 2014-09-17 | 中兴通讯股份有限公司 | 一种内存超分配管理系统及方法 |
US20150189034A1 (en) * | 2013-12-31 | 2015-07-02 | Rasesh Kelkar | Enhanced Shared Memory Based Communication Driver for Improved Performance and Scalability |
CN110704214A (zh) * | 2019-10-14 | 2020-01-17 | 北京京东乾石科技有限公司 | 进程间通信方法和装置 |
CN111427707A (zh) * | 2020-03-25 | 2020-07-17 | 北京左江科技股份有限公司 | 一种基于共享内存池的ipc通信方法 |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113194158A (zh) * | 2021-04-13 | 2021-07-30 | 杭州迪普科技股份有限公司 | 信息存储方法、装置、设备及计算机可读存储介质 |
CN112860444A (zh) * | 2021-04-26 | 2021-05-28 | 腾讯科技(深圳)有限公司 | 内存调用信息的确定方法和装置、存储介质及电子设备 |
CN112860444B (zh) * | 2021-04-26 | 2021-08-20 | 腾讯科技(深圳)有限公司 | 内存调用信息的确定方法和装置、存储介质及电子设备 |
CN113076266A (zh) * | 2021-06-04 | 2021-07-06 | 深圳华云信息系统有限公司 | 一种内存管理方法、装置、电子设备及存储介质 |
CN113504994A (zh) * | 2021-07-26 | 2021-10-15 | 上海遁一信息科技有限公司 | 一种内存池性能弹性伸缩的实现方法及系统 |
CN113504994B (zh) * | 2021-07-26 | 2022-05-10 | 上海遁一信息科技有限公司 | 一种内存池性能弹性伸缩的实现方法及系统 |
CN113791988B (zh) * | 2021-11-17 | 2022-02-18 | 畅捷通信息技术股份有限公司 | 一种降低小程序包体积的渲染方法、装置及存储介质 |
CN113791988A (zh) * | 2021-11-17 | 2021-12-14 | 畅捷通信息技术股份有限公司 | 一种降低小程序包体积的渲染方法、装置及存储介质 |
CN114281484A (zh) * | 2021-12-29 | 2022-04-05 | 元心信息科技集团有限公司 | 数据传输方法、装置、设备及存储介质 |
CN114281484B (zh) * | 2021-12-29 | 2022-08-26 | 元心信息科技集团有限公司 | 数据传输方法、装置、设备及存储介质 |
CN115878351A (zh) * | 2023-03-03 | 2023-03-31 | 苏州浪潮智能科技有限公司 | 消息的传输方法及装置、存储介质及电子装置 |
CN116107762A (zh) * | 2023-04-11 | 2023-05-12 | 远江盛邦(北京)网络安全科技股份有限公司 | 内存分配方法、装置、电子设备和存储介质 |
CN117573377A (zh) * | 2024-01-15 | 2024-02-20 | 摩尔线程智能科技(北京)有限责任公司 | 内存管理方法、装置、设备及存储介质 |
Also Published As
Publication number | Publication date |
---|---|
CN112214329B (zh) | 2023-09-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112214329B (zh) | 内存管理方法、装置、设备及计算机可读存储介质 | |
JP2018518733A (ja) | ファイル操作方法及び装置 | |
CN114416352A (zh) | 算力资源分配方法、装置、电子设备及储存介质 | |
CN111338779B (zh) | 资源分配方法、装置、计算机设备和存储介质 | |
CN114418828A (zh) | 显存管理方法、装置、设备、存储介质及程序产品 | |
US20150127916A1 (en) | Dynamic memory allocation | |
CN105872635A (zh) | 视频资源分发的方法和装置 | |
CN110706148A (zh) | 人脸图像处理方法、装置、设备和存储介质 | |
CN114730307A (zh) | 智能数据池 | |
CN113742058A (zh) | 管理堆外内存的方法和装置 | |
CN115934354A (zh) | 在线存储方法和装置 | |
CN109002332B (zh) | 一种进程启动、配置方法及装置、系统 | |
CN115665231A (zh) | 服务创建方法、装置以及计算机可读存储介质 | |
CN115174529B (zh) | 一种网络处理方法、装置、电子设备及存储介质 | |
CN107111549A (zh) | 一种文件系统的管理方法及装置 | |
CN115618409A (zh) | 数据库云服务生成方法、装置、设备及可读存储介质 | |
CN108958878B (zh) | 基于容器的网络设备运行控制方法和装置 | |
CN111782834A (zh) | 图像检索的方法、装置、设备及计算机可读存储介质 | |
CN113377490A (zh) | 虚拟机的内存分配方法、装置和系统 | |
CN113127430A (zh) | 镜像信息处理方法、装置、计算机可读介质及电子设备 | |
CN111078407A (zh) | 内存管理的方法、装置、存储介质及电子设备 | |
CN114356231B (zh) | 数据处理方法、设备及计算机存储介质 | |
KR101952651B1 (ko) | 분산 컴퓨팅 환경을 위한 고유 식별자 생성 방법 및 그 장치 | |
CN111582398B (zh) | 数据聚类方法、装置、系统、服务器以及存储介质 | |
JP2018106709A (ja) | OpenCLカーネルを処理する方法、及びそれを遂行するコンピューティング装置 |
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 | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20210122 Address after: 5 / F, area C, 1801 Hongmei Road, Xuhui District, Shanghai, 201200 Applicant after: Tencent Technology (Shanghai) Co.,Ltd. Address before: 518057 Tencent Building, No. 1 High-tech Zone, Nanshan District, Shenzhen City, Guangdong Province, 35 floors Applicant before: TENCENT TECHNOLOGY (SHENZHEN) Co.,Ltd. |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |