一种面向多核系统的内存管理装置及方法与流程

文档序号:15615159发布日期:2018-10-09 21:11阅读:143来源:国知局

本发明涉及多核处理器内存管理技术领域,尤其涉及一种面向多核系统的内存管理装置及方法。



背景技术:

多核处理器可以看作是将多个通用的cpu以及一些功能部件集成在一块芯片中形成的一个片上系统。内存管理子系统是保证整个系统正常工作的基础,为其他模块的正常工作提供了基础保障。在单核系统内存管理中,需要关注内存碎片,分配效率等问题,而在多核内存管理中,还涉及到一些不同于单核内存管理的问题,如共享缓存失效、互斥访问、核间碎片等。

现有的成熟内存管理方法,如jemalloc、ptmalloc、tcmalloc,他们所考虑的更多是通用性。在多核多任务系统中使用这些管理方法时,随着任务数的增多,管理方法的效率就会相应降低。虽然tcmalloc在这方面有所改进,但不可避免的会出现另一个问题:多任务之间争夺资源的公平性。现有的内存管理装置都可以用图1所示的简化形式来表示。内存作为公共资源,为了保证资源访问的正确性,多个任务对资源的访问应该互斥的进行,无论是ptmalloc还是tcmalloc,最后都要保证互斥操作。由于阻塞任务的唤醒具有随机性,在极端情况下,如果某个任务频繁的进行内存操作,而操作系统只对这个任务进行响应,那其他等待内存分配的任务就会一直阻塞。这就形成了一种“饥饿”现象,多任务工作演变成单任务工作,多核系统的效率就降低了。



技术实现要素:

本发明的目的还在于提供一种面向多核系统的高效内存分配以及核间内存公平竞争的内存管理方法。

为解决上述技术问题,本发明提供了一种面向多核系统的内存管理装置,包括私有内存管理模块、公平同步控制模块和全局内存管理模块;

所述的私有内存管理模块,管理私有内存区,主要用于小块内存的申请,每个核对应一个私有内存区,采用无锁化设计,避免锁的开销;

所述的公平同步控制模块,保证多个核在向全局内存管理模块索取内存时,能够做到公平同步;

所述的全局内存管理模块,管理全局内存区,为私有内存管理模块服务,负责大块内存的申请,在内存不够时,向系统进行内存获取。

本发明所述的一种面向多核系统的内存管理方法,包括如下步骤:

s1、每个核上分配一个私有内存区,核上任务分配内存时,先从私有内存分配内存,如果需要的内存块大于2k或私有内存区的空闲块不够,则转向全局内存管理区申请内存分配,否则,到步骤s4;

s2、所有核共用一个全局内存区,在全局内存区上加入公平同步保护,保证任务竞争资源公平;

s3、如果全局内存区内存足够,则将合适的内存空间批发给私有内存区,否则,向系统进行内存空间索取;

s4、返回申请到的内存地址;

内存释放过程:

在每块内存上都会加入相应的tag标记,表示当前内存的来源,如果来自私有内存区,则将内存块返还到私有内存区,否则,归还到全局内存区,交由全局内存区的内存空间,再决定其是否归还到系统中。

本申请实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

在多核内存管理方法上,提高内存访问效率,是众多内存管理方法共同追求的一个目标。目前主要从三个方面对多核系统内存管理方案进行优化:第一,尽量采用私有化设计,减少处理器各个核心的共享数据量或减少共享数据的访问;第二,在对共享数据进行操作时,尽量避免使用锁,这样可以降低锁对系统性能的影响;第三,从改善多核系统整体性能的角度出发,要提高整体性能,就需要对每个处理器核心的单核性能进行优化,对于单核而言,应该尽量提高对自己私有数据的访问能力。通过私有无锁化设计,可以降低内存竞争开销,再加上一定的内存块缓存策略,可以使锁的竞争开销降低。

本发明对内存进行分级管理,采用私有无锁化以及内存块缓冲技术,配合使用公平同步互斥算法,保证内存访问的效率以及资源争夺的公平性。在小内存申请时,尽量避免锁的使用;在大内存申请时,以低粒度锁进行同步控制,同时加入公平同步机制,避免了核之间内存资源竞争的不公,同时保证内存访问效率。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1为面向多核系统的内存管理装置模型图。

图2是全局内存区组织结构图。

图3是公平同步互斥算法流程图。

图4是私有内存区组织结构图。

具体实施方式

为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。

如图1-图4所示,本实施例所述的一种面向多核系统的内存管理装置,包括私有内存管理模块、公平同步控制模块和全局内存管理模块;

所述的私有内存管理模块,管理私有内存区,主要用于小块内存的申请,每个核对应一个私有内存区,采用无锁化设计,避免锁的开销;

所述的公平同步控制模块,保证多个核在向全局内存管理模块索取内存时,能够做到公平同步;

所述的全局内存管理模块,管理全局内存区,为私有内存管理模块服务,负责大块内存的申请,在内存不够时,向系统进行内存获取。

本实施例所述的一种面向多核系统的内存管理方法,包括如下步骤:

s1、每个核上分配一个私有内存区,核上任务分配内存时,先从私有内存分配内存,如果需要的内存块大于2k或私有内存区的空闲块不够,则转向全局内存管理区申请内存分配,否则,到步骤s4;

s2、所有核共用一个全局内存区,在全局内存区上加入公平同步保护,保证任务竞争资源公平;

s3、如果全局内存区内存足够,则将合适的内存空间批发给私有内存区,否则,向系统进行内存空间索取;

s4、返回申请到的内存地址;

内存释放过程:

在每块内存上都会加入相应的tag标记,表示当前内存的来源,如果来自私有内存区,则将内存块返还到私有内存区,否则,归还到全局内存区,交由全局内存区的内存空间,再决定其是否归还到系统中。

更为具体的:

(1)全局内存管理模块

全局内存管理模块主要用于管理全局内存区,附图3是全局内存区的组织结构图。全局内存区以伙伴算法为基础,每次分配和释放内存块都以2的幂次为单位,可以加快内存的合并和分离速度。单个区段的可用伙伴内存块可能无法满足用户当前申请需要,因此在全局内存区设置多个区段,同时设立一个区段范围标志range,代表当前可分配内存的最大区段索引下标。在内存分配时按照如下步骤进行多次尝试分配,只有都尝试失败后,才调用系统接口,减少与系统交互的开销,内存分配步骤如下:

1)先从range指示的区段进行内存分配,分配成功,返回内存地址,不成功,执行步骤2)。

2)从[0,range)的区段中查找是否有可用的内存块,查找到,返回内存地址,否则,执行步骤3)。

3)扩展一个新的区段,range加一,从新的区段中进行内存分配,如果分配不成功,则到步骤4)。

4)调用系统接口,进行内存分配。

全局内存区内存分配算法的具体实现如下:

全局内存区在回收内存时,主要从内存块标记tag中获取相关释放信息,根据这些信息,决定内存块归还给系统还是释放到对应区段中,如果将内存块归还到对应区段中,主要采用伙伴算法的释放过程,如回收大小为的空闲块时,若阶次记录链表中存在的伙伴空闲块,则应将其与伙伴块合并为大小为的空闲块,若阶次记录链表中还存在的伙伴空闲块,又继续与其伙伴块合并为的空闲块,依此类推,直到不能合并为止。内存回收的算法实现如下所示。

(2)公平同步控制模块

由于私有内存区和全局内存区在交互的过程存在互斥访问,全局内存区对于私有内存区而言,是一种临界资源,在任务数过多的情况下,可能出现“饥饿”现象。因此,为了保证任务流程的正确性,以及多任务之间争夺临界资源的公平性,需要有正确的公平同步互斥算法。公平同步控制模块的作用就是保证多任务对临界资源的公平互斥访问,而不会出现一个任务始终占有临界资源,其他任务一直阻塞等待唤醒的情况。在公平互斥算法中,主要通过一个优先权组group和任务状态标记变量state来控制对临界资源访问的公平性,算法的执行流程如下:

1)当前任务进入公平同步区后,首先将自己切换到2状态,表示进入起始段,然后读取当前group值。

2)如果任务想要进入临界区,那么任务的state需要与group不等,或者当前任务与其他所有任务的state相同,以保证每个任务的state是同步的。

3)对临界区的访问需要互斥进行,访问之前加锁,访问之后解锁。

4)访问临界区后,需要修改当前group的值,使其他属于group的任务能够获得执行权限。

5)将当前任务的状态置为3状态,以表示不再需要访问临界资源。

公平互斥算法的具体实现如下所示。

(3)私有内存管理模块

私有内存管理模块主要管理私有内存区。如果当前的任务数过多,同时去全局内存区竞争资源必定会增加互斥开销。为了降低互斥所带来的影响,采用私有无锁化思想,为每个核设立自己的私有内存区。在私有内存区中会对空闲内存块进行缓存以提高分配效率,但为了避免太多的内存被占用,将最大块大小设置为2kb,这也能满足大部分应用的内存申请需要。如果需要更大内存块,可以通过全局内存区进行申请。附图4是私有内存区组织结构图。

具体分配步骤如下:

1)在用户申请内存时,如果内存大小大于2kb,则直接向全局内存区进行申请,此时,内存块的tag会被标记为全局内存区,如果内存内存大小小于2kb,执行步骤2)。

2)计算内存块对应的区块数组索引下标,查看当前区块的空闲链是否为空。如果为空,则执行步骤4),否则到步骤3)。

3)从该空闲链指向的内存空间中取出一个空闲单元给用户使用,并在空闲单元中标记tag为私有内存区,记录当前分配的区块数组下标以及内存块所在位置,修改对应结构体的字段信息,将bulkarray中的被占用空闲块总量chunk_used加一,head中的空闲块占用计数held加一,第一个空闲块指针free指向下一个空闲内存单元,如果没有空闲单元,则置为null,并将当前空闲链指向的内存空间挂接到已满链中。

4)从全局内存区获取一块地址空间,将这块空间切割成大小相同的内存单元,默认有32个内存单元,但从全局内存区分配的空间可能会有大量内碎片,将这些多余的碎片空间也一并划分成内存单元,进一步降低内存内碎片问题。单元与单元之间通过静态链表进行组织,并修改head中的单元总量计数hold,在bulkarray的空闲块总量chunk_total上加上当前单元总量计数,最后从当前的空闲块中分配一个给用户,并将tag标记为私有内存区,记录当前分配的区块数组下标以及内存块所在位置。

内存分配的具体实现如下。

私有内存区内存释放步骤如下:

1)从释放的内存中获取到标记信息,由标记信息来判断内存是否来自私有内存区,如果不是私有内存区分配,则到步骤5),否则到步骤2)。

2)由分配时记录的区块数组下标和内存块位置,定位当前内存所属区块以及头部位置,如果头部空闲指针free为null,则说明当前内存空间的内存块被全部占用,现在释放内存块后,需要将整个内存空间从已满链挂接到空闲链上。

3)调整相应结构体字段信息,将head的空闲块占用计数held减一,bulkarray的被占用空闲块总量chunk_used减一。

4)如果当前内存空间的内存块全部空闲,且剩余空闲内存块总数超过收缩阈值chunk_thresd,则将当前head指向的内存空间归还给全局内存区。

5)归还address指向的内存块到全局内存区。

以上所述,仅是本发明的较佳实施例而已,并非对本发明作任何形式上的限制,虽然本发明已以较佳实施例揭露如上,然而并非用以限定本发明,任何熟悉本专业的技术人员,在不脱离本发明技术方案范围内,当可利用上述揭示的技术内容作出些许更动或修饰为等同变化的等效实施例,但凡是未脱离本发明技术方案的内容,依据本发明的技术实质对以上实施例所作的任何简单修改、等同变化与修饰,均仍属于本发明技术方案的范围内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1