一种多线程下的内存管理方法

文档序号:8905134阅读:406来源:国知局
一种多线程下的内存管理方法
【技术领域】
[0001]本发明涉及计算机技术领域,尤其涉及一种多线程下的内存管理方法。
【背景技术】
[0002]出于对安全和效率的考虑,许多应用程序并不使用操作系统提供的内存管理,而是使用自身所具有的内存管理功能。对于多线程的应用程序,当多个线程同时访问同一资源时,必须采用合理的机制,例如互斥锁、信号量等,来避免线程之间发生冲突。
[0003]在多线程运行状况下进行内存管理时,程序经常面临一种矛盾,即当多个线程通过互斥锁访问内存队列时,经常会有线程处于暂停状态,一直要等待其它线程释放互斥锁,该线程拿到内存队列的访问权,才能继续运行。
[0004]从实践经验中看,当程序新开始处理一个事务时,多个线程都会申请新的内存。当事务处理完成时,各个线程又都在释放使用完成的内存。此时对于内存分配、释放的资源冲突将会频繁发生,常常会有线程被迫暂停,大大降低了程序的运行效率。

【发明内容】

[0005]本发明的目的是为了解决多线程下的内存管理中,多个线程通过同一套互斥锁访问内存队列而存在的效率低下问题。
[0006]为了解决此问题并实现发明目的,本发明提供了一种多线程下的内存管理方法,其技术方案如下:
[0007]一种多线程下的内存管理方法,向每个线程分配独立内存池,所述内存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、内存申请、内存释放以及释放内存队列的回收。
[0008]进一步地,内存申请过程分为以下步骤:步骤al,查看本线程的申请内存队列是否有足够的内存,足够则直接分配;步骤a2,如果步骤al中内存不足,则将释放内存队列中的内存块放回申请内存队列;步骤a3,检查释放内存队列中是否有内存块;步骤a4,如果步骤a3中释放内存队列中有内存块,如果有,则进行队列合并操作。
[0009]进一步地,内存释放过程分为以下步骤:步骤bl,确定待释放内存块是否属于本线程内申请的,是则直接执行合并操作;步骤b2,如果步骤bl中待释放内存块不属于本线程内申请的,则获取本线程互斥锁;步骤b3,执行合并操作;步骤b4,释放互斥锁。
[0010]进一步地,每个线程的申请内存队列为本线程专用。
[0011]进一步地,释放内存队列可以由多个线程使用,所述释放内存队列由互斥锁提供保护。
[0012]本发明所取得的有益效果为:
[0013]1.将传统内存管理方法中多个线程申请一个互斥锁变为对多套互斥锁的申请,大大分散了资源访问的目标,原先对于一个互斥锁的竞争,分散为对多个互斥锁的请求。从理论上讲,如果有N个线程,则对每个互斥锁的访问次数只有原先的N分之一,从而有效降低了资源冲突的频率。
[0014]2.将内存队列被拆分为申请、释放两个队列。申请内存队列仅由本线程使用,不存在资源冲突,仅在多个线程访问释放队列时有可能产生冲突,大大降低了冲突频率。
【附图说明】
[0015]图1为本发明的多线程内存管理方法的内存管理示意图;
[0016]图2为本发明的多线程内存管理方法的内存申请流程图;
[0017]图3为本发明的多线程内存管理方法的内存释放流程图。
【具体实施方式】
[0018]下面结合附图以及具体实施例,对本发明的内容进行进一步的阐释。
[0019]图1所示为本发明的内存管理方式,程序运行时可以包括N个线程,N个线程中的每个都有自己的两个内存队列:一个申请内存队列,一个释放内存队列并且每个线程都有专属该线程的互斥锁。每个线程仅可以从本线程的申请内存队列中申请和释放内存。在程序运行过程中,线程I申请到的内存可以被传递到线程2。当线程2使用完该内存后,必须将此内存释放回线程I的申请内存队列。否则,就会导致线程I的申请内存队列越来越小,最终全部用光,线程I无法再继续工作。
[0020]此外,每个线程的互斥锁仅用于释放内存队列。当线程申请内存时,无需检查互斥锁的状态,可以直接从申请内存队列中取用内存块,因为线程的申请内存队列只专属于本线程使用,不存在资源冲突问题。
[0021]当线程释放内存时,如果是其它线程的内存,则必须检查互斥锁,因为在此同时,别的进程可能也会释放内存到这个释放内存队列。为了防止资源冲突,每次释放其它线程的内存之前,必须检查相应的互斥锁状态。
[0022]在对多线程下的内存进行管理时,先将内存队列进行初始化,在初始化时,所有内存块都保存在申请内存队列中,释放内存队列为空。
[0023]如图2所示,在进行内存申请操作时,首先查看本线程的申请内存队列状态。检查此队列中使用和剩余的内存块是否还有20 %没有分配出去。
[0024]如果还有大于20%的内存块可供分配,则直接分配。绝大部分情况下,都有充足的内存块可供分配,由下文中的分析可知,一旦内存块不足,将以极快的速度将释放内存队列里的内存块放回申请内存队列中。因此绝大多数次内存申请操作的流程一旦申请,无需申请互斥锁或其它任何额外操作,程序执行速度极快。
[0025]如果申请内存队列中,剩余内存块的数量已经不足20%,则应当将释放内存队列中的内存块放回申请内存队列中,以保证申请内存队列中存在足够内存块,其流程为:首先,检查释放内存队列中是否有内存块;如果释放内存队列中有内存块,则应当执行队列合并操作,将已经释放的内存块放回申请内存队列中去,以供分配使用;在合并队列之前,必须先拿到释放内存队列的互斥锁,因为这一操作将会修改释放内存队列,必须保证没有其他线程也在使用释放内存队列;拿到互斥锁之后,即进行队列合并操作。此操作只需将释放内存队列的第一块内存块并入申请内存队列的最后一块内存块后面即可,可以具体由以下代码实现:
[0026]alloc_que->tail->next = free_que->head ;
[0027]free_que->head->prev = alloc_que->tail ;
[0028]alloc_que->num+ = free_que_>num ;
[0029]free—que_>num = 0 ;
[0030]alloc—que_>tail = free—que_>tail ;
[0031]free—que_>head = NULL ;
[0032]执行完以上代码,即可释放互斥锁。在此过程中程序占用互斥锁的时间极短。而且,程序仅当申请内存队列中内存块数量很少时才执行合并队列操作,这个操作的执行次数也极少,合并队列操作对互斥锁的占用对线程间资源冲突的影响极小。
[0033]如果释放内存队列中没有内存块,则意味着释放内存队列为空。此时检查申请内存队列中是否为空。
[0034]如果申请内存队列为空,则所有内存块都已分配出去,没有多余内存块可供分配,返回失败。
[0035]如果申请内存队列不为空,则执行内存分配操作。
[0036]如图3所示的内存释放过程中,首先需要获取释放内存队列的互斥锁。此处可能会产生等待,但由于每次释放操作占用互斥锁的时间极短,因此即使产生等待,等待时间也非常短。
[0037]然后将待释放的内存块放入释放内存队列进行合并操作。同样,此操作也非常简单,可以通过以下代码实现:
[0038]free_que->tail->next = mem_block ;
[0039]mem_block_>prev = free_que->tail ;
[0040]free_que->tail = mem_block ;
[0041]mem_block_>next = NULL ;
[0042]free_que->num++ ;
[0043]释放完成后,即可释放互斥锁。
[0044]可以看出,线程占用互斥锁的时间极短,这大大降低了资源冲突的可能性。
[0045]以上所述实施例仅表达了本发明的实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
【主权项】
1.一种多线程下的内存管理方法,其特征在于,向每个线程分配独立内存池,所述内存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、内存申请、内存释放以及释放内存队列的回收。2.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述内存申请过程分为以下步骤: 步骤al:查看本线程的申请内存队列是否有足够的内存,足够则直接分配; 步骤a2:如果步骤al中内存不足,则将释放内存队列中的内存块放回申请内存队列; 步骤a3:检查释放内存队列中是否有内存块; 步骤a4:如果步骤a3中释放内存队列中有内存块,如果有,则进行队列合并操作。3.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述内存释放过程分为以下步骤: 步骤bl:确定待释放内存块是否属于本线程内申请的,是则直接执行合并操作; 步骤b2:如果步骤bl中待释放内存块不属于本线程内申请的,则获取本线程互斥锁; 步骤b3:执行合并操作; 步骤b4:释放互斥锁。4.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述每个线程的申请内存队列为本线程专用。5.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述释放内存队列可以由多个线程使用,所述释放内存队列由互斥锁提供保护。
【专利摘要】本发明提供了一种多线程下的内存管理方法,该方法向每个线程分配独立内存池,内存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、内存申请、内存释放以及释放内存队列的回收。
【IPC分类】G06F9/50
【公开号】CN104881324
【申请号】CN201410508410
【发明人】孙一桉, 李凯斌
【申请人】北京匡恩网络科技有限责任公司
【公开日】2015年9月2日
【申请日】2014年9月28日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1