G06F9/50
1.一种多线程下的内存管理方法,其特征在于,向每个线程分配独立 内存池,所述内存池分配包括三个部分:申请内存队列、释放内存队列以 及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内 存队列初始化、内存申请、内存释放以及释放内存队列的回收。
2.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述 内存申请过程分为以下步骤:
步骤a1:查看本线程的申请内存队列是否有足够的内存,足够则直接 分配;
步骤a2:如果步骤a1中内存不足,则将释放内存队列中的内存块放 回申请内存队列;
步骤a3:检查释放内存队列中是否有内存块;
步骤a4:如果步骤a3中释放内存队列中有内存块,如果有,则进行 队列合并操作。
3.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述 内存释放过程分为以下步骤:
步骤b1:确定待释放内存块是否属于本线程内申请的,是则直接执行 合并操作;
步骤b2:如果步骤b1中待释放内存块不属于本线程内申请的,则获 取本线程互斥锁;
步骤b3:执行合并操作;
步骤b4:释放互斥锁。
4.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述 每个线程的申请内存队列为本线程专用。
5.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述 释放内存队列可以由多个线程使用,所述释放内存队列由互斥锁提供保 护。
本发明涉及计算机技术领域,尤其涉及一种多线程下的内存管理方 法。
出于对安全和效率的考虑,许多应用程序并不使用操作系统提供的内 存管理,而是使用自身所具有的内存管理功能。对于多线程的应用程序, 当多个线程同时访问同一资源时,必须采用合理的机制,例如互斥锁、信 号量等,来避免线程之间发生冲突。
在多线程运行状况下进行内存管理时,程序经常面临一种矛盾,即当 多个线程通过互斥锁访问内存队列时,经常会有线程处于暂停状态,一直 要等待其它线程释放互斥锁,该线程拿到内存队列的访问权,才能继续运 行。
从实践经验中看,当程序新开始处理一个事务时,多个线程都会申请 新的内存。当事务处理完成时,各个线程又都在释放使用完成的内存。此 时对于内存分配、释放的资源冲突将会频繁发生,常常会有线程被迫暂停, 大大降低了程序的运行效率。
本发明的目的是为了解决多线程下的内存管理中,多个线程通过同一 套互斥锁访问内存队列而存在的效率低下问题。
为了解决此问题并实现发明目的,本发明提供了一种多线程下的内存 管理方法,其技术方案如下:
一种多线程下的内存管理方法,向每个线程分配独立内存池,所述内 存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥 锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、 内存申请、内存释放以及释放内存队列的回收。
进一步地,内存申请过程分为以下步骤:步骤a1,查看本线程的申请 内存队列是否有足够的内存,足够则直接分配;步骤a2,如果步骤a1中内 存不足,则将释放内存队列中的内存块放回申请内存队列;步骤a3,检查 释放内存队列中是否有内存块;步骤a4,如果步骤a3中释放内存队列中 有内存块,如果有,则进行队列合并操作。
进一步地,内存释放过程分为以下步骤:步骤b1,确定待释放内存块 是否属于本线程内申请的,是则直接执行合并操作;步骤b2,如果步骤b1 中待释放内存块不属于本线程内申请的,则获取本线程互斥锁;步骤b3, 执行合并操作;步骤b4,释放互斥锁。
进一步地,每个线程的申请内存队列为本线程专用。
进一步地,释放内存队列可以由多个线程使用,所述释放内存队列由 互斥锁提供保护。
本发明所取得的有益效果为:
1.将传统内存管理方法中多个线程申请一个互斥锁变为对多套互斥 锁的申请,大大分散了资源访问的目标,原先对于一个互斥锁的竞争,分 散为对多个互斥锁的请求。从理论上讲,如果有N个线程,则对每个互斥 锁的访问次数只有原先的N分之一,从而有效降低了资源冲突的频率。
2.将内存队列被拆分为申请、释放两个队列。申请内存队列仅由本线 程使用,不存在资源冲突,仅在多个线程访问释放队列时有可能产生冲突, 大大降低了冲突频率。
图1为本发明的多线程内存管理方法的内存管理示意图;
图2为本发明的多线程内存管理方法的内存申请流程图;
图3为本发明的多线程内存管理方法的内存释放流程图。
下面结合附图以及具体实施例,对本发明的内容进行进一步的阐释。
图1所示为本发明的内存管理方式,程序运行时可以包括N个线程, N个线程中的每个都有自己的两个内存队列:一个申请内存队列,一个释 放内存队列并且每个线程都有专属该线程的互斥锁。每个线程仅可以从本 线程的申请内存队列中申请和释放内存。在程序运行过程中,线程1申请 到的内存可以被传递到线程2。当线程2使用完该内存后,必须将此内存 释放回线程1的申请内存队列。否则,就会导致线程1的申请内存队列越 来越小,最终全部用光,线程1无法再继续工作。
此外,每个线程的互斥锁仅用于释放内存队列。当线程申请内存时, 无需检查互斥锁的状态,可以直接从申请内存队列中取用内存块,因为线 程的申请内存队列只专属于本线程使用,不存在资源冲突问题。
当线程释放内存时,如果是其它线程的内存,则必须检查互斥锁,因 为在此同时,别的进程可能也会释放内存到这个释放内存队列。为了防止 资源冲突,每次释放其它线程的内存之前,必须检查相应的互斥锁状态。
在对多线程下的内存进行管理时,先将内存队列进行初始化,在初始 化时,所有内存块都保存在申请内存队列中,释放内存队列为空。
如图2所示,在进行内存申请操作时,首先查看本线程的申请内存队 列状态。检查此队列中使用和剩余的内存块是否还有20%没有分配出去。
如果还有大于20%的内存块可供分配,则直接分配。绝大部分情况下, 都有充足的内存块可供分配,由下文中的分析可知,一旦内存块不足,将 以极快的速度将释放内存队列里的内存块放回申请内存队列中。因此绝大 多数次内存申请操作的流程一旦申请,无需申请互斥锁或其它任何额外操 作,程序执行速度极快。
如果申请内存队列中,剩余内存块的数量已经不足20%,则应当将释 放内存队列中的内存块放回申请内存队列中,以保证申请内存队列中存在 足够内存块,其流程为:首先,检查释放内存队列中是否有内存块;如果 释放内存队列中有内存块,则应当执行队列合并操作,将已经释放的内存 块放回申请内存队列中去,以供分配使用;在合并队列之前,必须先拿到 释放内存队列的互斥锁,因为这一操作将会修改释放内存队列,必须保证 没有其他线程也在使用释放内存队列;拿到互斥锁之后,即进行队列合并 操作。此操作只需将释放内存队列的第一块内存块并入申请内存队列的最 后一块内存块后面即可,可以具体由以下代码实现:
alloc_que->tail->next=free_que->head;
free_que->head->prev=alloc_que->tail;
alloc_que->num+=free_que->num;
free_que->num=0;
alloc_que->tail=free_que->tail;
free_que->head=NULL;
执行完以上代码,即可释放互斥锁。在此过程中程序占用互斥锁的时 间极短。而且,程序仅当申请内存队列中内存块数量很少时才执行合并队 列操作,这个操作的执行次数也极少,合并队列操作对互斥锁的占用对线 程间资源冲突的影响极小。
如果释放内存队列中没有内存块,则意味着释放内存队列为空。此时 检查申请内存队列中是否为空。
如果申请内存队列为空,则所有内存块都已分配出去,没有多余内存 块可供分配,返回失败。
如果申请内存队列不为空,则执行内存分配操作。
如图3所示的内存释放过程中,首先需要获取释放内存队列的互斥锁。 此处可能会产生等待,但由于每次释放操作占用互斥锁的时间极短,因此 即使产生等待,等待时间也非常短。
然后将待释放的内存块放入释放内存队列进行合并操作。同样,此操 作也非常简单,可以通过以下代码实现:
free_que->tail->next=mem_block;
mem_block->prev=free_que->tail;
free_que->tail=mem_block;
mem_block->next=NULL;
free_que->num++;
释放完成后,即可释放互斥锁。
可以看出,线程占用互斥锁的时间极短,这大大降低了资源冲突的可 能性。
以上所述实施例仅表达了本发明的实施方式,其描述较为具体和详 细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对 于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做 出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的 保护范围应以所附权利要求为准。
本文发布于:2023-04-14 23:01:19,感谢您对本站的认可!
本文链接:https://patent.en369.cn/patent/1/87449.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |