CN104881324A - 一种多线程下的内存管理方法 - Google Patents
一种多线程下的内存管理方法 Download PDFInfo
- Publication number
- CN104881324A CN104881324A CN201410508410.7A CN201410508410A CN104881324A CN 104881324 A CN104881324 A CN 104881324A CN 201410508410 A CN201410508410 A CN 201410508410A CN 104881324 A CN104881324 A CN 104881324A
- Authority
- CN
- China
- Prior art keywords
- memory
- queue
- thread
- application
- releasing
- 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.)
- Pending
Links
Landscapes
- Multi Processors (AREA)
Abstract
本发明提供了一种多线程下的内存管理方法,该方法向每个线程分配独立内存池,内存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、内存申请、内存释放以及释放内存队列的回收。
Description
技术领域
本发明涉及计算机技术领域,尤其涉及一种多线程下的内存管理方法。
背景技术
出于对安全和效率的考虑,许多应用程序并不使用操作系统提供的内存管理,而是使用自身所具有的内存管理功能。对于多线程的应用程序,当多个线程同时访问同一资源时,必须采用合理的机制,例如互斥锁、信号量等,来避免线程之间发生冲突。
在多线程运行状况下进行内存管理时,程序经常面临一种矛盾,即当多个线程通过互斥锁访问内存队列时,经常会有线程处于暂停状态,一直要等待其它线程释放互斥锁,该线程拿到内存队列的访问权,才能继续运行。
从实践经验中看,当程序新开始处理一个事务时,多个线程都会申请新的内存。当事务处理完成时,各个线程又都在释放使用完成的内存。此时对于内存分配、释放的资源冲突将会频繁发生,常常会有线程被迫暂停,大大降低了程序的运行效率。
发明内容
本发明的目的是为了解决多线程下的内存管理中,多个线程通过同一套互斥锁访问内存队列而存在的效率低下问题。
为了解决此问题并实现发明目的,本发明提供了一种多线程下的内存管理方法,其技术方案如下:
一种多线程下的内存管理方法,向每个线程分配独立内存池,所述内存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、内存申请、内存释放以及释放内存队列的回收。
进一步地,内存申请过程分为以下步骤:步骤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++;
释放完成后,即可释放互斥锁。
可以看出,线程占用互斥锁的时间极短,这大大降低了资源冲突的可能性。
以上所述实施例仅表达了本发明的实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。
Claims (5)
1.一种多线程下的内存管理方法,其特征在于,向每个线程分配独立内存池,所述内存池分配包括三个部分:申请内存队列、释放内存队列以及该队列的互斥锁,每块内存内嵌内存池标识,所述内存管理方法包括内存队列初始化、内存申请、内存释放以及释放内存队列的回收。
2.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述内存申请过程分为以下步骤:
步骤a1:查看本线程的申请内存队列是否有足够的内存,足够则直接分配;
步骤a2:如果步骤a1中内存不足,则将释放内存队列中的内存块放回申请内存队列;
步骤a3:检查释放内存队列中是否有内存块;
步骤a4:如果步骤a3中释放内存队列中有内存块,如果有,则进行队列合并操作。
3.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述内存释放过程分为以下步骤:
步骤b1:确定待释放内存块是否属于本线程内申请的,是则直接执行合并操作;
步骤b2:如果步骤b1中待释放内存块不属于本线程内申请的,则获取本线程互斥锁;
步骤b3:执行合并操作;
步骤b4:释放互斥锁。
4.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述每个线程的申请内存队列为本线程专用。
5.如权利要求1所述的多线程下的内存管理方法,其特征在于,所述释放内存队列可以由多个线程使用,所述释放内存队列由互斥锁提供保护。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410508410.7A CN104881324A (zh) | 2014-09-28 | 2014-09-28 | 一种多线程下的内存管理方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410508410.7A CN104881324A (zh) | 2014-09-28 | 2014-09-28 | 一种多线程下的内存管理方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN104881324A true CN104881324A (zh) | 2015-09-02 |
Family
ID=53948830
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410508410.7A Pending CN104881324A (zh) | 2014-09-28 | 2014-09-28 | 一种多线程下的内存管理方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104881324A (zh) |
Cited By (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107133103A (zh) * | 2017-05-05 | 2017-09-05 | 第四范式(北京)技术有限公司 | 用于数据流式计算的内存管理系统及其方法 |
CN107391253A (zh) * | 2017-06-08 | 2017-11-24 | 珠海金山网络游戏科技有限公司 | 一种降低系统内存分配释放冲突的方法 |
CN107515788A (zh) * | 2017-08-31 | 2017-12-26 | 郑州云海信息技术有限公司 | 一种内存分配的方法及装置 |
CN107818017A (zh) * | 2016-09-14 | 2018-03-20 | 北京京东尚科信息技术有限公司 | 多线程计算系统及其数据处理方法 |
CN108111522A (zh) * | 2017-12-28 | 2018-06-01 | 武汉长光科技有限公司 | 一种在onu上实现稳定安全普遍服务协议框架的方法 |
WO2018157278A1 (zh) * | 2017-02-28 | 2018-09-07 | 华为技术有限公司 | 缓存管理方法、缓存管理器、共享缓存和终端 |
CN108595259A (zh) * | 2017-03-16 | 2018-09-28 | 哈尔滨英赛克信息技术有限公司 | 一种基于全局管理的内存池管理方法 |
CN109388497A (zh) * | 2018-11-05 | 2019-02-26 | 郑州云海信息技术有限公司 | 一种内存池的管理方法、装置、设备及可读存储介质 |
CN109857566A (zh) * | 2019-01-25 | 2019-06-07 | 天翼爱动漫文化传媒有限公司 | 一种内存读写过程的资源锁定算法 |
CN113032156A (zh) * | 2021-05-25 | 2021-06-25 | 北京金山云网络技术有限公司 | 内存分配方法和装置、电子设备和存储介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050216691A1 (en) * | 2004-03-29 | 2005-09-29 | International Business Machines Corporation | Method for completely lock-free user-level dynamic memory |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
CN103399825A (zh) * | 2013-08-05 | 2013-11-20 | 武汉邮电科学研究院 | 一种无锁化内存申请释放方法 |
CN103942150A (zh) * | 2014-04-01 | 2014-07-23 | 上海网达软件股份有限公司 | 一种用于实时流媒体传输系统的内存管理方法 |
-
2014
- 2014-09-28 CN CN201410508410.7A patent/CN104881324A/zh active Pending
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20050216691A1 (en) * | 2004-03-29 | 2005-09-29 | International Business Machines Corporation | Method for completely lock-free user-level dynamic memory |
CN102915276A (zh) * | 2012-09-25 | 2013-02-06 | 武汉邮电科学研究院 | 一种用于嵌入式系统的内存控制方法 |
CN103399825A (zh) * | 2013-08-05 | 2013-11-20 | 武汉邮电科学研究院 | 一种无锁化内存申请释放方法 |
CN103942150A (zh) * | 2014-04-01 | 2014-07-23 | 上海网达软件股份有限公司 | 一种用于实时流媒体传输系统的内存管理方法 |
Non-Patent Citations (1)
Title |
---|
王东滨等: "面向网络数据实时监测的多线程内存管理技术", 《高技术通讯》 * |
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107818017B (zh) * | 2016-09-14 | 2021-09-03 | 北京京东尚科信息技术有限公司 | 多线程计算系统及其数据处理方法、装置和计算机可读存储介质 |
CN107818017A (zh) * | 2016-09-14 | 2018-03-20 | 北京京东尚科信息技术有限公司 | 多线程计算系统及其数据处理方法 |
WO2018157278A1 (zh) * | 2017-02-28 | 2018-09-07 | 华为技术有限公司 | 缓存管理方法、缓存管理器、共享缓存和终端 |
CN109196473A (zh) * | 2017-02-28 | 2019-01-11 | 华为技术有限公司 | 缓存管理方法、缓存管理器、共享缓存和终端 |
CN109196473B (zh) * | 2017-02-28 | 2021-10-01 | 华为技术有限公司 | 缓存管理方法、缓存管理器、共享缓存和终端 |
CN108595259A (zh) * | 2017-03-16 | 2018-09-28 | 哈尔滨英赛克信息技术有限公司 | 一种基于全局管理的内存池管理方法 |
CN107133103A (zh) * | 2017-05-05 | 2017-09-05 | 第四范式(北京)技术有限公司 | 用于数据流式计算的内存管理系统及其方法 |
CN107133103B (zh) * | 2017-05-05 | 2019-01-01 | 第四范式(北京)技术有限公司 | 用于数据流式计算的内存管理系统及其方法 |
CN107391253A (zh) * | 2017-06-08 | 2017-11-24 | 珠海金山网络游戏科技有限公司 | 一种降低系统内存分配释放冲突的方法 |
CN107515788A (zh) * | 2017-08-31 | 2017-12-26 | 郑州云海信息技术有限公司 | 一种内存分配的方法及装置 |
CN108111522A (zh) * | 2017-12-28 | 2018-06-01 | 武汉长光科技有限公司 | 一种在onu上实现稳定安全普遍服务协议框架的方法 |
CN109388497B (zh) * | 2018-11-05 | 2021-08-31 | 郑州云海信息技术有限公司 | 一种内存池的管理方法、装置、设备及可读存储介质 |
CN109388497A (zh) * | 2018-11-05 | 2019-02-26 | 郑州云海信息技术有限公司 | 一种内存池的管理方法、装置、设备及可读存储介质 |
CN109857566B (zh) * | 2019-01-25 | 2020-09-29 | 天翼爱动漫文化传媒有限公司 | 一种内存读写过程的资源锁定方法 |
CN109857566A (zh) * | 2019-01-25 | 2019-06-07 | 天翼爱动漫文化传媒有限公司 | 一种内存读写过程的资源锁定算法 |
CN113032156A (zh) * | 2021-05-25 | 2021-06-25 | 北京金山云网络技术有限公司 | 内存分配方法和装置、电子设备和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104881324A (zh) | 一种多线程下的内存管理方法 | |
CN100530107C (zh) | 基于io事件通知机制的单进程内容服务器装置及方法 | |
CN101799773B (zh) | 并行计算的内存访问方法 | |
US9411650B2 (en) | Ledger-based resource tracking | |
US20100217868A1 (en) | Microprocessor with software control over allocation of shared resources among multiple virtual servers | |
CN109840877B (zh) | 一种图形处理器及其资源调度方法、装置 | |
US11436048B2 (en) | Method of managing task dependencies at runtime in a parallel computing system of a hardware processing system and a hardware acceleration processor | |
EP3060992A1 (en) | Input/output memory map unit and northbridge | |
CN101366004A (zh) | 用于带有专用线程管理的多核处理的方法和设备 | |
WO2015136283A1 (en) | Exception handling in microprocessor systems | |
US20170344398A1 (en) | Accelerator control device, accelerator control method, and program storage medium | |
CN106547612A (zh) | 一种多任务处理方法及装置 | |
US9792142B2 (en) | Information processing device and resource allocation method | |
US20140351825A1 (en) | Systems and methods for direct memory access coherency among multiple processing cores | |
CN103399825A (zh) | 一种无锁化内存申请释放方法 | |
KR102338849B1 (ko) | 실시간 운영 체제에서 스택 메모리 관리를 제공하는 방법 및 시스템 | |
CN106537329B (zh) | 用于为多线程执行锁保护处理操作的数据处理装置及方法 | |
CN101566977A (zh) | 处理器访问共享数据的方法、装置及系统 | |
CN113467884A (zh) | 资源配置方法和装置、电子设备及计算机可读存储介质 | |
CN102214147A (zh) | 一种检测内存访问越界的方法及装置 | |
JP2014528609A (ja) | トランザクショナルミドルウェアマシン環境においてセルフチューニングロックメカニズムをサポートするためのシステムおよび方法 | |
CN111104218B (zh) | 存储系统数据同步方法、装置、设备及可读存储介质 | |
CN116048824B (zh) | 一种多核处理器信号量系统 | |
KR20130046459A (ko) | 메모리압축 스왑도구를 이용하는 가상화 임베디드 시스템 및 방법 | |
CN104008062A (zh) | 内存管理方法及内存管理装置 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination |