一种内存管理方法、系统及服务器

阅读: 评论:0

著录项
  • CN200910110423.8
  • 20091030
  • CN101702138A
  • 20100505
  • 深圳市新飞扬数码技术有限公司
  • 王燊望
  • G06F12/02
  • G06F9/50 G06F12/02

  • 广东省深圳市福田区益田路南方国际广场A座1601室
  • 广东(44)
  • 深圳中一专利商标事务所
  • 张全文
摘要
本发明适用于服务器技术领域,提供了一种内存管理方法、系统及服务器,所述方法包括下述步骤:根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表;接收用户的内存申请请求,根据所述申请的内存大小,定位内存池;当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户;当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户,分配效率高,实现多个内存池对应多个并行的线程,内存分配并发性高。
权利要求

1.一种内存管理方法,其特征在于,所述方法包括下述步骤:

根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表;

接收用户的内存申请请求,根据所述申请的内存大小,定位内存池;

当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户;

当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户。

2.如权利要求1所述的方法,其特征在于,所述当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户的步骤具体包括下述步骤:

控制进入所述内存池的常用内存链表,锁住所述常用内存链表的自旋锁;

判断所述常用内存链表的第一链表头是否存在可用内存;

若是,则控制读取所述内存池的常用内存链表的内存分配给申请用户,同时,修改所述常用内存链表的从第二链表头开始的链表头的序号;

控制解开所述自旋锁。

3.如权利要求1所述的方法,其特征在于,所述当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户的步骤具体包括下述步骤:

控制进入所述内存池的大内存链表,锁住所述大内存链表的自旋锁;

判断所述大内存链表的正使用大内存中是否有剩余的内存块;

若是,则更改所述大内存链表的正使用大内存的偏移量,同时,控制读取所述内存池的大内存链表的剩余的内存块分配给申请用户;

若否,则向操作系统申请一内存块,并执行更改偏移量和控制读取内存的步骤;

控制解开所述自旋锁。

4.如权利要求1所述的方法,其特征在于,所述当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户的步骤之后还包括下述步骤:

计算定位需要释放的内存所在的内存池;

锁住内存池的自旋锁,将内存释放在所述内存池的链表的头部;

控制解开所述自旋锁。

5.一种内存管理系统,其特征在于,所述系统包括:

预先配置模块,用于根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表;

定位模块,用于接收用户的内存申请请求,根据所述申请的内存大小,定位内存池;

第一内存读取模块,用于当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户;以及

第二内存读取模块,用于当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户。

6.如权利要求5所述的系统,其特征在于,所述第一内存读取模块具体包括:

第一自旋锁锁住模块,用于控制进入所述内存池的常用内存链表,锁住所述常用内存链表的自旋锁;

第一判断模块,用于判断所述常用内存链表的第一链表头是否存在可用内存;

第一读取控制操作模块,用于当所述第一判断模块判断所述常用内存链表的第一链表头存在可用内存,则控制读取所述内存池的常用内存链表的内存分配给申请用户,同时,修改所述常用内存链表的从第二链表头开始的链表头的序号;以及

第一解锁控制模块,用于控制解开所述自旋锁。

7.如权利要求5所述的系统,其特征在于,所述第二内存读取模块具体包括:

第二自旋锁锁住模块,用于控制进入所述内存池的大内存链表,锁住所述大内存链表的自旋锁;

第二判断模块,用于判断所述大内存链表的正使用大内存中是否有剩余的内存块;

第二读取控制操作模块,用于当所述第二判断模块判断所述大内存链表的正使用大内存中有剩余的内存块,则更改所述大内存链表的正使用大内存的偏移量,同时,控制读取所述内存池的大内存链表的剩余的内存块分配给申请用户;

内存块申请模块,用于当所述第二判断模块判断所述大内存链表的正使用大内存中没有剩余的内存块,则向操作系统申请一内存块;以及

第二解锁控制模块,用于控制解开所述自旋锁。

8.如权利要求5所述的系统,其特征在于,所述系统还包括:

内存释放控制模块,用于将内存释放在所述内存池的链表的头部。

9.一种包括权利要求5至8任一项的内存管理系统的服务器。

说明书
技术领域

技术领域

本发明属于服务器技术领域,尤其涉及一种内存管理方法、系统及服务器。

背景技术

传统的内存分配是直接通过操作系统提供的函数来分配,其函数内部具体的执行过程如下所述:

1.锁上线程锁,防止其它线程进入。

2.以4096字节的倍数取出内存块(无论用户需要多大的内存,都以4096为一页来分配)。

3.解除线程锁,允许其它线程进入。

4.把成功分配的内存返回给用户层。

上述过程在普通的程序中足以满足需求,但对于服务器程序会大大降低程序性能,其具体为:

服务器对内存的分配和释放频率非常高,以游戏服务器为例,通常需要每秒100万次;服务器的内存分配者是由上百个线程来完成;由于传统的函数里只有一个线程锁,这样会降低程序的并发能力;而且,传统的线程锁是采用内核对象方式来处理,在内存分配时需要用到复杂的算法,这将消耗大量的CPU资源,降低了程序的性能。

发明内容

本发明实施例的目的在于提供一种内存管理方法,旨在解决现有传统的内存分配机制难以满足服务器对内存分配的要求的问题。

本发明实施例是这样实现的,一种内存管理方法,所述方法包括下述步骤:

根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表;

接收用户的内存申请请求,根据所述申请的内存大小,定位内存池;

当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户;

当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户。

本发明实施例的另一目的在于提供一种内存管理系统,所述系统包括:

预先配置模块,用于根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表;

定位模块,用于接收用户的内存申请请求,根据所述申请的内存大小,定位内存池;

第一内存读取模块,用于当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户;以及

第二内存读取模块,用于当定位到的内存池的常用内存链表不存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户。

本发明实施例的另一目的在于提供一种包括内存管理系统的服务器。

在本发明实施例中,根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表,接收用户的内存申请请求,根据申请的内存大小,定位内存池;当定位到的内存池的常用内存链表存在可用内存时,控制读取内存池的常用内存链表的内存分配给申请用户;当定位到的内存池的常用内存链表不存在可用内存时,控制读取内存池的大内存链表的内存分配给申请用户,分配效率高,实现多个内存池对应多个并行的线程,内存分配并发性高。

附图说明

图1是本发明第一实施例提供的内存管理方法的实现流程图;

图2是本发明第二实施例提供的内存管理方法的实现流程图;

图3是本发明实施例提供的控制读取内存池的常用内存链表的内存分配给申请用户的实现流程图;

图4是本发明实施例提供的内存池的常用内存链表的结构示意图;

图5是本发明实施例提供的控制读取内存池的大内存链表的内存分配给申请用户的步骤的具体实现流程图;

图6是本发明实施例提供的内存池的大内存链表的结构示意图;

图7是本发明实施例提供的内存管理系统的结构框图;

图8是本发明实施例提供的第一内存读取模块的结构框图;

图9是本发明实施例提供的第二内存读取模块的结构框图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

在本发明实施例中,根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表,接收用户的内存申请请求,根据申请的内存大小,定位内存池;当定位到的内存池的常用内存链表存在可用内存时,控制读取内存池的常用内存链表的内存分配给申请用户;当定位到的内存池的常用内存链表不存在可用内存时,控制读取内存池的大内存链表的内存分配给申请用户。

图1示出了本发明第一实施例提供的内存管理方法的实现流程,其详细步骤如下所述:

在步骤S101中,根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表。

在本发明实施例中,为了满足多线程并发分配内存,该实施例将预先配置至少两个内存池,其中,该内存池刚配置时是空的,并没有实际的内存,在用户使用时才分配实际的内存,预先配置的内存池是虚拟的,不是实际将内存分配为两个内存池,是预先建立生成 一索引数组,该索引数组至少包括2个数据元素,在内存使用过程中才根据该索引实际分配内存。

例如,以8的倍数为大小生成总共8192个内存池,每个子内存池相互独立,子内存池只处理8个区域的内存分配,即:1~8、9~16、17~24、...、65529~65536,在此每一段数据都对应到一个内存池,上述8192个子内存池实际上是一个数组,该数组包括8192个元素,此处仅为本发明的一个具体实施例,在此不用以限制本发明。

在步骤S102中,接收用户的内存申请请求,根据申请的内存大小,定位内存池。

在本发明实施例中,当有内存申请请求时,根据该申请内存的大小,确定其对应的内存池,例如,申请内存的大小为3458,则根据倍数的大小8进行计算,3458/8=432还余2,则该申请内存对应的内存池为第433个内存池,在此仅为本发明的一个实施例,不用以限制本发明。

在步骤S103中,当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户。

在本发明实施例中,当与用户申请的内存大小相对应的的内存池的常用内存链表的第一链表头为空,若不为空则控制读取所述内存池的常用内存链表的内存分配给申请用户,同时,修改所述常用内存链表的从第二链表头开始的链表头的序号。

在本发明实施例中,当分配内存时,还需要控制锁住和解开自旋锁的操作,在此不再赘述,下有详细描述,在此不用以限制本发明。

在步骤S104中,当定位到的内存池的常用内存链表存在可用内存时,控制读取内存池的大内存链表的内存分配给申请用户。

在本发明实施例中,若大内存链表的正使用大内存中有剩余的内存块,则更改所述大内存链表的正使用大内存的偏移量,同时,控制读取所述内存池的大内存链表的剩余的内存块分配给申请用户,否则向操作系统申请一内存块,然后执行更改偏移量和控制读取内存的步骤,在该实施例中,当分配内存时,还需要控制锁住和解开自旋锁的操作,在此不再赘述,下有详细描述,在此不用以限制本发明。

图2示出了本发明第二实施例提供的内存管理方法的实现流程,其详细步骤如下所述:

在步骤S201中,根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表。

在步骤S202中,接收用户的内存申请请求,判断该申请的内存大小是否合法,是则执行步骤S203,否则返回错误。

在本发明实施例中,当该内存大小超过预设的大小时,该内存申请不合法,则直接向操作系统申请内存,其中,该内存合法的判断依据是该申请内存是否大于0。

在步骤S203中,判断申请的内存大小是否超过预先设置的内存管理大小阈值,是则执行步骤S204,否则执行步骤S209。

在本发明实施例中,当内存大小合法后,对内存大小进行检测,即判断内存大小是否超过预先设置的内存管理内大小阈值,即判断申请的内存大小是否大于上述65536,是则需要向操作系统申请内存,在此仅为本发明的一个具体实施例,不用以限制本发明。

在步骤S204中,根据申请的内存大小,定位内存池。

在步骤S205中,判断定位到的内存池的常用内存链表是否存在可用内存,是则执行步骤步骤S206,否则执行步骤S207。

在步骤S206中,当定位到的内存池的常用内存链表存在可用内存时,控制读取所述内存池的常用内存链表的内存分配给申请用户。

在本发明实施例中,当分配内存时,还需要控制锁住和解开自旋锁的操作,在此不再赘述,下有详细描述,在此不用以限制本发明。

在步骤S207中,判断定位到的内存池的大内存链表是否存在可用内存,是则执行步骤S208;否则执行步骤S209。

在步骤S208中,当定位到的内存池的大内存链表存在可用内存时,控制读取所述内存池的大内存链表的内存分配给申请用户。

在本发明实施例中,当分配内存时,还需要控制锁住和解开自旋锁的操作,在此不再赘述,下有详细描述,在此不用以限制本发明。

在步骤S209中,向操作系统申请一内存块。

在本发明实施例中,当用户申请的内存超过预先设置的内存管理阈值时,则操作系统单独分配内存给该申请用户。

在本发明实施例中,当定位到的内存池的常用内存链表不存在可用内存时,向操作系统申请一内存块,存放到内存池常用内存链表的正在使用内存的表头上,改变偏移量,读取该内存块,同时解开自旋锁。

图3示出了本发明实施例提供的控制读取所述内存池的常用内存链表的内存分配给申请用户的实现流程,其详细步骤如下所述:

在步骤S301中,控制进入内存池的常用内存链表,锁住常用内存链表的自旋锁。

在本发明实施例中,该常用内存链表的自旋锁主要用于保护该常用内存链表的数据同步。

在步骤S302中,判断所述常用内存链表的第一链表头是否存在可用内存,是则执行步骤S303,否则执行步骤S306。

在本发明实施例中,判断常用内存链表的第一链表头是否存在可用内存的依据是判断该常用内存链表的链表头是否为空,为空则表示该常用内存池已经无内存可用,不为空则表示该常用内存池有可用内存,其中,内存池的常用内存链表的结构示意图,如图4所示,在此仅为本发明的一个实施例,不用以限制本发明。

在步骤S303中,控制读取所述内存池的常用内存链表的内存分配给申请用户。

在本发明实施例中,该操作是将常用内存链表第一链表头的内存分配给申请用户使用。

在步骤S304中,修改常用内存链表的从第二链表头开始的链表头的序号。

在本发明实施例中,当将常用内存链表的第一链表头对应的内存分配给用户后,该常用内存链表的从第二链表头开始的链表头序号自动修改,依次为第一链表头,第二链表头,....,如果在该常用内存链表中,就剩余第一链表头的内存可以使用,则可以不用执行该操作,在此仅为本发明的一个实施例,不用以限制本发明。

在步骤S305中,控制解开自旋锁。

在本发明实施例中,在常用内存链表中,内存分配完毕之后,将锁住的自旋锁解 锁,以便其他用户继续使用该常用内存链表的内存。

在步骤S306中,解开常用内存链表的自旋锁,控制进入大内存链表,进行内存的分配。

在本发明实施例中,对于大内存链表的内存分配机制如下实施例所述。

图5示出了本发明实施例提供的控制读取内存池的大内存链表的内存分配给申请用户的步骤的具体实现流程,其具体为:

在步骤S501中,控制进入内存池的大内存链表,锁住大内存链表的自旋锁。

在本发明实施例中,大内存链表的自旋锁主要用于保护数据同步以及内存偏移量值的改变,如图6所示,大内存链表包括自旋锁、正使用大内存的偏移量和正是用大内存。

在步骤S502中,判断大内存链表的正使用大内存中是否有剩余的内存块,是则执行步骤S503,否则执行步骤S504。

在本发明实施例中,判断大内存链表的正使用大内存中是否有剩余的内存块的依据是检测大内存链表的正在使用大内存的偏移量,当正使用大内存的偏移量大于等于内存的大小时,表示正使用大内存中没有内存块可用。

假设该大内存链表的大小为4096,则当正在使用大内存的偏移量为0时,表示该大内存链表没用使用过;当正在使用大内存的偏移量为4096时,表示该大内存链表已经没用内存可使用。

在步骤S503中,更改大内存链表的正使用大内存的偏移量,同时,控制读取内存池的大内存链表的剩余的内存块分配给申请用户。

在本发明实施例,当大内存链表中存在可用的内存块时,在分配给用户内存块时,需要更改该大内存链表的正使用大内存的偏移量值,以便后来用户申请内存时,查看是否有可用内存,在此不用以限制本发明。

在步骤S504中,向操作系统申请一内存块,然后执行步骤S503。

在本发明实施例中,当大内存链表中,没用可用内存块时,向操作系统申请一块内存块,将该申请的内存块放在该大内存链表的表头,供分配给用户使用,其中,该申请的内存块的大小大于用户申请的内存大小即可,在此不用以限制本发明。

在步骤S505中,控制解开自旋锁。

在本发明实施例中,在大内存链表中,当内存分配完毕之后,将锁住的自旋锁解锁,以便其他用户继续使用该大内存链表的内存。

上述流程为本发明实施例提供的内存分配机制,当内存分配使用完毕之后,需要释放内存,图6示出了本发明实施例提供的内存释放方法的实现流程,其具体步骤如下所述:

在步骤S601中,根据所述申请的内存大小,定位内存池。

在本发明实施例中,当内存大小不合法时,直接将该内存释放给操作系统,在此不再赘述,但不用以限制本发明。

在步骤S602中,进入定位到的内存池的链表,锁住该链表的自旋锁。

在步骤S603中,将需要释放的内存放到该链表的头部。

在步骤S604中,解开自旋锁。

在该实施例中,上述链表可以是常用内存链表,也可以是大内存链表,在此不用以 限制本发明。

图7示出了本发明实施例提供的内存管理系统的结构框图,为了便于说明,图中仅给出了与本发明实施例相关的部分,其中,内存管理系统可以内置于服务器的软件单元、硬件单元或软硬件结合单元。

预先配置模块11根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表;定位模块12接收用户的内存申请请求,根据所述申请的内存大小,定位内存池;当定位到的内存池的常用内存链表存在可用内存时,第一内存读取模块13控制读取所述内存池的常用内存链表的内存分配给申请用户;当定位到的内存池的常用内存链表不存在可用内存时,第二内存读取模块14控制读取所述内存池的大内存链表的内存分配给申请用户。

在本发明实施例中,内存释放控制模块15将内存释放在所述内存池的链表的头部,其中,其具体的实现过程为:计算定位需要释放的内存所在的内存池;锁住内存池的自旋锁,将内存释放在所述内存池的链表的头部;控制解开所述自旋锁,在此不用以限制本发明。

作为本发明的一个实施例,如图8所示,第一自旋锁锁住模块131控制进入所述内存池的常用内存链表,锁住所述常用内存链表的自旋锁;第一判断模块132判断所述常用内存链表的第一链表头是否存在可用内存;当所述第一判断模块132判断所述常用内存链表的第一链表头存在可用内存,第一读取控制操作模块133控制读取所述内存池的常用内存链表的内存分配给申请用户,同时,修改所述常用内存链表的从第二链表头开始的链表头的序号;第一解锁控制模块134控制解开所述自旋锁。

作为本发明的另一个实施例,如图9所示,第二自旋锁锁住模块141控制进入所述内存池的大内存链表,锁住所述大内存链表的自旋锁;第二判断模块142判断所述大内存链表的正使用大内存中是否有剩余的内存块;当所述第二判断模块142判断所述大内存链表的正使用大内存中有剩余的内存块,第二读取控制操作模块143更改所述大内存链表的正使用大内存的偏移量,同时,控制读取所述内存池的大内存链表的剩余的内存块分配给申请用户;当所述第二判断模块142判断所述大内存链表的正使用大内存中没有剩余的内存块,内存块申请模块144向操作系统申请一内存块;第二解锁控制模块145控制解开所述自旋锁。

在本发明实施例中,根据内存的大小,预先配置至少两个内存池,所述内存池包括常用内存链表和大内存链表,接收用户的内存申请请求,根据申请的内存大小,定位内存池;当定位到的内存池的常用内存链表存在可用内存时,控制读取内存池的常用内存链表的内存分配给申请用户;当定位到的内存池的常用内存链表不存在可用内存时,控制读取内存池的大内存链表的内存分配给申请用户,分配效率高,实现多个内存池对应多个并行的线程,内存分配并发性高,而且减少了线程切换所耗费的资源。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

本文发布于:2023-04-13 18:23:27,感谢您对本站的认可!

本文链接:https://patent.en369.cn/patent/1/86650.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图