一种面向共享内存式协处理器的堆内存管理方法和装置

阅读: 评论:0

著录项
  • CN202210131446.2
  • 20220214
  • CN114185687A
  • 20220315
  • 中国人民解放军国防科技大学
  • 张昂;廖湘科;崔英博;杨灿;黄春;唐滔;彭林;夏泽宇;郭逸飞
  • G06F9/50
  • G06F9/50 G06F15/167

  • 湖南省长沙市开福区德雅路109号
  • 湖南(43)
  • 长沙国科天河知识产权代理有限公司
  • 李杨
摘要
本申请涉及一种面向共享内存式协处理器的堆内存管理方法和装置。所述方法包括:在执行协处理端程序前,通过第一接口函数申请一片较大的连续堆内存空间,将申请的堆内存空间的虚地址转换为物理地址,并将物理地址传递至协处理器端程序,并将申请的堆内存空间分别组织为可用链表和已分配链表;在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入已分配链表的链表尾;在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入可用链表;在协处理器端程序执行完毕后,通过第四接口函数根据虚地址清理协处理器堆内存空间。
权利要求

1.一种面向共享内存式协处理器的堆内存管理方法,其特征在于,所述方法包括:

获取协处理器要申请的协处理器堆内存空间大小信息,根据所述协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的所述堆内存空间的虚地址转换为物理地址,并将所述物理地址传递至协处理器端程序;

通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表;

在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾;

在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入所述可用链表;

在协处理器端程序执行完毕后,通过第四接口函数根据所述虚地址清理协处理器堆内存空间。

2.根据权利要求1所述的方法,其特征在于,通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表,包括:

通过所述第一接口函数初始化可用链表和已分配链表;所述可用链表和所述已分配链表的每个节点存储的信息包括:当前节点的内存大小,指向下一节点的指针;

将所述可用链表的可用链表头指针指向所述物理地址;

将所述已分配链表的可分配链表头指针赋值为空。

3.根据权利要求2所述的方法,其特征在于,在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾,包括:

在协处理器端程序申请内存使用时,通过第二接口函数将所述可用链表头指针赋值给当前内存块指针;

若当前内存块的大小大于等于申请内存的大小,则将所述当前内存块指针作为分配的物理地址返回;否则,将下一内存块指针作为当前内存块指针,判断所述当前内存块的大小是否满足申请内存的大小,直到到大小合适的内存块,并将其指针作为分配的物理地址返回;

将新分配的内存加入所述已分配链表的链表尾。

4.根据权利要求3所述的方法,其特征在于,若当前内存块的大小大于等于申请内存的大小,则将所述当前内存块指针作为分配的物理地址返回之后还包括:

获取当前内存块的大小;

获取申请内存的大小;

将所述当前内存块的大小减去所述申请内存的大小,作为当前空闲内存块的大小;

将所述当前空闲内存块加入所述可用链表。

5.根据权利要求4所述的方法,其特征在于,在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,包括:

在协处理器端程序执行过程中,通过第三接口函数获取需要释放的内存块的物理地址;

从已分配链表头开始,依次比较所述已分配链表中当前内存块的指针和所述需要释放的内存块的物理地址,若两者相等,将所述已分配链表中当前内存块前一内存块的指向下一节点的指针赋值为当前内存块向后第二块内存的地址。

6.根据权利要求5所述的方法,其特征在于,所述将新释放的内存加入所述可用链表,包括:

若新释放的内存与所述可用链表中的空闲内存块相邻,则将所述新释放的内存与所述可用链表中相邻的内存块合并;

若新释放的内存与所述可用链表中的空闲内存块不相邻,则遍历所述可用链表,按照内存地址的先后顺序将所述新释放的内存块加入所述可用链表中。

7.根据权利要求6所述的方法,其特征在于,若新释放的内存与所述可用链表中的空闲内存块相邻,则将所述新释放的内存与所述可用链表中相邻的内存块合并,包括:

从可用链表头开始,依次比较所述可用链表中当前内存块指针加上当前内存块大小后,是否与所述新释放的内存块的物理地址相等,若相等,将所述可用链表中当前内存块和所述新释放的内存块合并;其中,所述可用链表中当前内存块在前,所述新释放的内存块在后;

若不相等,将所述新释放的内存块指针加上所述新释放的内存块的大小,与所述可用链表中当前内存块指针依次相比,若相等,将所述新释放的内存块和所述可用链表中当前内存块合并;其中,所述新释放的内存块在前,所述可用链表中当前内存块在后。

8.一种面向共享内存式协处理器的堆内存管理装置,其特征在于,所述装置包括:

堆内存空间申请模块,用于获取协处理器要申请的协处理器堆内存空间大小信息,根据所述协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的所述堆内存空间的虚地址转换为物理地址,并将所述物理地址传递至协处理器端程序;

链表组织模块,用于通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表;

堆内存空间分配模块,用于在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾;

堆内存空间释放模块,用于在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入所述可用链表;

堆内存空间清理模块,用于在协处理器端程序执行完毕后,通过第四接口函数根据所述虚地址清理协处理器堆内存空间。

9.根据权利要求8所述的装置,其特征在于,所述链表组织模块还用于:

通过所述第一接口函数初始化可用链表和已分配链表;所述可用链表和所述已分配链表的每个节点存储的信息包括:当前节点的内存大小,指向下一节点的指针next;

将所述可用链表的可用链表头指针指向所述物理地址;

将所述已分配链表的可分配链表头指针赋值为空。

10.根据权利要求9所述的装置,其特征在于,堆内存空间分配模块还用于:

在协处理器端程序申请内存使用时,通过第二接口函数将所述可用链表头指针赋值给当前内存块指针;

若当前内存块的大小大于等于申请内存的大小,则将所述当前内存块指针作为分配的物理地址返回;否则,将下一内存块指针作为当前内存块指针,判断所述当前内存块的大小是否满足申请内存的大小,直到到大小合适的内存块,并将其指针作为分配的物理地址返回;

将新分配的内存加入所述已分配链表的链表尾。

说明书
技术领域

本申请涉及计算机技术领域,特别是涉及一种面向共享内存式协处理器的堆内存管理方法和装置。

异构计算以其高性能、高能效的特点在高性能计算领域得到不断发展,涌现出越来越多的协处理器,如GPU(Graphics Processing Unit,图形处理单元)、FPGA(Field-programmable Gate Array,现场可编程逻辑门阵列)等等。通常协处理器以PCIe(Peripheral Component Interconnect Express,快速外围组件互连)外设的形式连接到主机端CPU(Central Processing Unit,中央处理单元)上,且拥有自身独立的存储单元,无法直接与CPU共享内存,属于分离内存式协处理器。分离内存式协处理器在编程时需要显式地将数据在内存和协处理器的存储空间之间进行搬运,增加了编程的难度和程序执行中的开销。

针对以上问题,共享内存式协处理器直接在片内通过高速总线与CPU连接,能够实现与CPU共享内存,编程时无需进行数据搬运,避免了分离内存式协处理器的显式数据搬运开销,提高了协处理器的可编程性和程序性能。

程序运行过程中的数据主要存储在内存中,其中有的数据占用空间大小能够在程序编译时确定,而有的数据大小要到程序运行时才能确定,需要在运行过程中动态申请和释放内存空间。共享内存式协处理器与CPU都可以直接访问内存,其中CPU端能够独立运行操作系统,具有虚实地址转换和动态堆内存管理的能力,能够实现动态内存申请和释放功能。但是现有的共享内存式协处理器上无法运行操作系统,不具备虚实地址转换的能力,只能识别物理地址。因此,协处理器本身也不具有动态内存管理能力,无法满足对协处理器端使用动态内存的需求。

基于此,有必要针对上述技术问题,提供一种能够实现协处理器动态内存管理能力的面向共享内存式协处理器的堆内存管理方法、装置、计算机设备和存储介质。

一种面向共享内存式协处理器的堆内存管理方法,所述方法包括:

获取协处理器要申请的协处理器堆内存空间大小信息,根据所述协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的所述堆内存空间的虚地址转换为物理地址,并将所述物理地址传递至协处理器端程序;

通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表;

在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾;

在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入所述可用链表;

在协处理器端程序执行完毕后,通过第四接口函数根据所述虚地址清理协处理器堆内存空间。

在其中一个实施例中,还包括:通过所述第一接口函数初始化可用链表和已分配链表;所述可用链表和所述已分配链表的每个节点存储的信息包括:当前节点的内存大小,指向下一节点的指针next;

将所述可用链表的可用链表头指针指向所述物理地址;

将所述已分配链表的可分配链表头指针赋值为空。

在其中一个实施例中,还包括:在协处理器端程序申请内存使用时,通过第二接口函数将所述可用链表头指针赋值给当前内存块指针;

若当前内存块的大小大于等于申请内存的大小,则将所述当前内存块指针作为分配的物理地址返回;否则,将下一内存块指针作为当前内存块指针,判断所述当前内存块的大小是否满足申请内存的大小,直到到大小合适的内存块,并将其指针作为分配的物理地址返回;

将新分配的内存加入所述已分配链表的链表尾。

在其中一个实施例中,还包括:获取当前内存块的大小;

获取申请内存的大小;

将所述当前内存块的大小减去所述申请内存的大小,作为当前空闲内存块的大小;

将所述当前空闲内存块加入所述可用链表。

在其中一个实施例中,还包括:在协处理器端程序执行过程中,通过第三接口函数获取需要释放的内存块的物理地址;

从已分配链表头开始,依次比较所述已分配链表中当前内存块的指针和所述需要释放的内存块的物理地址,若两者相等,将所述已分配链表中当前内存块前一内存块的指向下一节点的指针赋值为当前内存块向后第二块内存的地址。

在其中一个实施例中,还包括:若新释放的内存与所述可用链表中的空闲内存块相邻,则将所述新释放的内存与所述可用链表中相邻的内存块合并;

若新释放的内存与所述可用链表中的空闲内存块不相邻,则遍历所述可用链表,按照内存地址的先后顺序将所述新释放的内存块加入所述可用链表中。

在其中一个实施例中,还包括:从可用链表头开始,依次比较所述可用链表中当前内存块指针加上当前内存块大小后,是否与所述新释放的内存块的物理地址相等,若相等,将所述可用链表中当前内存块和所述新释放的内存块合并;其中,所述可用链表中当前内存块在前,所述新释放的内存块在后;

若不相等,将所述新释放的内存块指针加上所述新释放的内存块的大小,与所述可用链表中当前内存块指针依次相比,若相等,将所述新释放的内存块和所述可用链表中当前内存块合并;其中,所述新释放的内存块在前,所述可用链表中当前内存块在后。

一种面向共享内存式协处理器的堆内存管理装置,所述装置包括:

堆内存空间申请模块,用于获取协处理器要申请的协处理器堆内存空间大小信息,根据所述协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的所述堆内存空间的虚地址转换为物理地址,并将所述物理地址传递至协处理器端程序;

链表组织模块,用于通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表;

堆内存空间分配模块,用于在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾;

堆内存空间释放模块,用于在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入所述可用链表;

堆内存空间清理模块,用于在协处理器端程序执行完毕后,通过第四接口函数根据所述虚地址清理协处理器堆内存空间。

一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:

获取协处理器要申请的协处理器堆内存空间大小信息,根据所述协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的所述堆内存空间的虚地址转换为物理地址,并将所述物理地址传递至协处理器端程序;

通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表;

在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾;

在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入所述可用链表;

在协处理器端程序执行完毕后,通过第四接口函数根据所述虚地址清理协处理器堆内存空间。

一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:

获取协处理器要申请的协处理器堆内存空间大小信息,根据所述协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的所述堆内存空间的虚地址转换为物理地址,并将所述物理地址传递至协处理器端程序;

通过所述第一接口函数将所述申请的堆内存空间分别组织为可用链表和已分配链表;

在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入所述已分配链表的链表尾;

在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入所述可用链表;

在协处理器端程序执行完毕后,通过第四接口函数根据所述虚地址清理协处理器堆内存空间。

上述面向共享内存式协处理器的堆内存管理方法、装置、计算机设备和存储介质,在执行协处理端程序前,通过第一接口函数申请一片较大的连续堆内存空间,将申请的堆内存空间的虚地址转换为物理地址,并将物理地址传递至协处理器端程序,并将申请的堆内存空间分别组织为可用链表和已分配链表;在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入已分配链表的链表尾;在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入可用链表;在协处理器端程序执行完毕后,通过第四接口函数根据虚地址清理协处理器堆内存空间。本发明提出了一种面向共享内存式协处理器的堆内存管理机制,解决了共享内存式协处理器端无法实现动态内存管理的问题,实现了协处理器端程序动态申请和释放内存的能力。

图1为一个实施例中面向共享内存式协处理器的堆内存管理方法的流程示意图;

图2为一个实施例中面向共享内存式协处理器的堆内存管理装置的结构框图;

图3为一个实施例中计算机设备的内部结构图。

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

本申请提供的面向共享内存式协处理器的堆内存管理方法,可以应用于如下应用环境中。共享内存式协处理器在片内通过高速总线与CPU连接,能够实现与CPU共享内存,本发明通过终端执行一种面向共享内存式协处理器的堆内存管理方法,在执行协处理端程序前,事先申请一片较大的连续内存空间,把该空间的物理地址传输给协处理器端程序。在协处理器端,将空闲内存和已分配的内存分别组织为两个链表,链表的每个节点存储的信息包括:当前节点的内存大小,指向下一节点的指针。申请内存时,从空闲内存链表头开始寻第一块大小可用的内存分配;释放内存时,尝试与前后空闲内存块合并。。

在一个实施例中,如图1所示,提供了一种面向共享内存式协处理器的堆内存管理方法,包括以下步骤:

步骤102,获取协处理器要申请的协处理器堆内存空间大小信息,根据协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的堆内存空间的虚地址转换为物理地址,并将物理地址传递至协处理器端程序。

本发明提出了一种面向共享内存式协处理器的堆内存管理机制,并实现了一套协处理器堆内存管理的编程接口,包括初始化协处理器堆内存init_cp_heap()、申请协处理器端堆内存malloc_cp_heap()、释放协处理器端堆内存free_cp_heap()和清理协处理器堆内存destroy_cp_heap()四个接口。本实施例中,将init_cp_heap()称为第一接口函数,malloc_cp_heap()称为第二接口函数,free_cp_heap()称为第三接口函数,destroy_cp_heap()称为第四接口函数。

具体地,初始化协处理器堆内存空间大小为heap_size,heap_size需足够大,保证能够满足协处理器端程序的动态内存使用需求;

申请heap_size大小的内存空间,并获得其虚地址为heap_start_va;

将虚地址heap_start_va转换为物理地址heap_start_pa;

将堆物理地址heap_start_pa传递至协处理器端程序。

步骤104,通过第一接口函数将申请的堆内存空间分别组织为可用链表和已分配链表。

具体地,将可用内存链表头指针free_head赋值为heap_start_pa,将以分配内存链表头指针alloced_head赋值为NULL。

步骤106,在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入已分配链表的链表尾。

先定位可用的内存块,再返回分配的协处理器堆内存空间的物理地址,最后将新申请的内存加入已申请内存的链表尾。

步骤108,在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入可用链表。

先定位需要释放的内存块,接着释放内存,最后合并空闲内存。

步骤110,在协处理器端程序执行完毕后,通过第四接口函数根据虚地址清理协处理器堆内存空间。

协处理器端程序执行完毕,通过heap_start_va释放协处理器堆内存。

上述面向共享内存式协处理器的堆内存管理方法中,在执行协处理端程序前,通过第一接口函数申请一片较大的连续堆内存空间,将申请的堆内存空间的虚地址转换为物理地址,并将物理地址传递至协处理器端程序,并将申请的堆内存空间分别组织为可用链表和已分配链表;在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入已分配链表的链表尾;在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入可用链表;在协处理器端程序执行完毕后,通过第四接口函数根据虚地址清理协处理器堆内存空间。本发明提出了一种面向共享内存式协处理器的堆内存管理机制,解决了共享内存式协处理器端无法实现动态内存管理的问题,实现了协处理器端程序动态申请和释放内存的能力。

在其中一个实施例中,还包括:通过第一接口函数初始化可用链表和已分配链表;可用链表和已分配链表的每个节点存储的信息包括:当前节点的内存大小size,指向下一节点的指针next;将可用链表的可用链表头指针指向物理地址;将已分配链表的可分配链表头指针赋值为空。

在其中一个实施例中,还包括:在协处理器端程序申请内存使用时,通过第二接口函数将可用链表头指针赋值给当前内存块指针;若当前内存块的大小大于等于申请内存的大小,则将当前内存块指针作为分配的物理地址返回;否则,将下一内存块指针作为当前内存块指针,判断当前内存块的大小是否满足申请内存的大小,直到到大小合适的内存块,并将其指针作为分配的物理地址返回;将新分配的内存加入已分配链表的链表尾。

具体地,将可用内存链表头指针free_head赋值给当前块指针current_ptr,将前一内存块指针previous_ptr赋值为NULL;

比较当前空闲内存块大小current_ptr->size与申请内存的大小required_size,如果current_ptr->size小于required_size,说明当前节点没有足够可用内存,则指针后移到下一个内存块继续判断;如果current_ptr->size大于等于required_size,说明当前节点有足够可用内存,则返回分配的协处理器堆内存空间的物理地址。

将新分配的内存加入已分配链表的链表尾的具体操作包括:

将已分配内存链表头指针alloced_head赋值给当前块指针current_ptr;

检查current_ptr->next是否为NULL,如果不是NULL,将指针后移到下一个内存块,继续判断;如果是NULL,将新申请的内存加入已申请内存的链表尾,并把新申请的内存的下一节点的指针赋值为空。

在其中一个实施例中,还包括:获取当前内存块的大小;获取申请内存的大小;将当前内存块的大小减去申请内存的大小,作为当前空闲内存块的大小;将当前空闲内存块加入可用链表。

具体地,将返回地址returned_pa赋值为current_ptr;

将当前空闲内存块大小赋值为current_ptr->size-required_size;

将前一内存块的next指针previous_ptr->next赋值为current_ptr+current_size,将新的空闲内存块加入链表。

在其中一个实施例中,还包括:在协处理器端程序执行过程中,通过第三接口函数获取需要释放的内存块的物理地址;从已分配链表头开始,依次比较已分配链表中当前内存块的指针和需要释放的内存块的物理地址,若两者相等,将所述已分配链表中当前内存块前一内存块的指向下一节点的指针赋值为当前内存块向后第二块内存的地址。

具体地,获得需要释放的内存块物理地址to_free_pa,将已分配的内存链表头指针alloced_head赋值给当前块指针current_ptr,将前一内存块指针previous_ptr赋值为NULL;

比较current_ptr与to_free_pa,如果相等,说明已定位到要释放的内存块,释放内存;若不相等,将当前块指针后移一节继续比较;

在其中一个实施例中,还包括:若新释放的内存与可用链表中的空闲内存块相邻,则将新释放的内存与可用链表中相邻的内存块合并:从可用链表头开始,依次比较可用链表中当前内存块指针加上当前内存块大小后,是否与新释放的内存块的物理地址相等,若相等,将可用链表中当前内存块和新释放的内存块合并;其中,可用链表中当前内存块在前,新释放的内存块在后;若不相等,将新释放的内存块指针加上新释放的内存块的大小,与可用链表中当前内存块指针依次相比,若相等,将新释放的内存块和可用链表中当前内存块合并;其中,新释放的内存块在前,可用链表中当前内存块在后。若新释放的内存与可用链表中的空闲内存块不相邻,则遍历可用链表,按照内存地址的先后顺序将新释放的内存块加入可用链表中。

具体实施步骤为:将空闲内存链表头指针free_head赋值给当前块指针current_ptr,将前一内存块指针previous_ptr赋值为NULL;

比较current_ptr+current_ptr->size与to_free_pa,如果相等,说明当前内存块与释放的内存块相邻,且释放的内存块在后,合并两个内存块,将current_ptr->size赋值为current_ptr->size+to_free_pa->size,完成合并;

如果不相等,比较to_free_pa+to_free_pa->size和current_ptr,如果相等,说明当前内存块与释放的内存块相邻,且释放的内存块在前,合并两个内存块,将current_ptr->size赋值为current_ptr->size+to_free_pa->size,current_ptr赋值为to_free_pa,previous_ptr->next赋值为current_ptr,完成合并;

如果不相等,如果current_ptr->next为NULL,说明释放的内存前后无相邻的空闲内存,再次遍历空闲内存链表,使得current_ptr大于to_free_pa,previous_ptr+previous_ptr->size小于to_free_pa,将previous_ptr->next赋值为to_free_pa,将to_free_pa->next赋值为current_ptr,将释放的内存块加入空闲内存链表中;如果current_ptr->next不为NULL,将当前块指针后移一节,继续判断。

应该理解的是,虽然图1的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。

在一个具体实施例中,提供了一种面向共享内存式协处理器的堆内存管理方法,包括以下步骤:

步骤1:调用init_cp_heap()接口初始化协处理器堆内存空间;

步骤1.1:初始化协处理器堆内存空间大小为heap_size,heap_size需足够大,保证能够满足协处理器端程序的动态内存使用需求;

步骤1.2:申请heap_size大小的内存空间,并获得其虚地址为heap_start_va;

步骤1.3:将虚地址heap_start_va转换为物理地址heap_start_pa;

步骤1.4:将堆物理地址heap_start_pa传递至协处理器端程序;

步骤1.5:将可用内存链表头指针free_head赋值为heap_start_pa,将以分配内存链表头指针alloced_head赋值为NULL;

步骤2:调用malloc_cp_heap()接口申请协处理器端堆内存空间;

步骤2.1:定位可用的内存块;

步骤2.1.1:将可用内存链表头指针free_head赋值给当前块指针current_ptr,将前一内存块指针previous_ptr赋值为NULL;

步骤2.1.2:比较当前空闲内存块大小current_ptr->size与申请内存的大小required_size,如果current_ptr->size小于required_size,说明当前节点没有足够可用内存,则执行步骤2.1.3;如果current_ptr->size大于等于required_size,说明当前节点有足够可用内存,执行步骤2.2;

步骤2.1.3:将前一内存块指针previous_ptr赋值为current_ptr,将current_ptr赋值为下一内存块的地址current_ptr->next,执行步骤2.1.2;

步骤2.2:返回分配的协处理器堆内存空间的物理地址;

步骤2.2.1:将返回地址returned_pa赋值为current_ptr;

步骤2.2.2:将当前空闲内存块大小赋值为current_ptr->size-required_size;

步骤2.2.3:将前一内存块的next指针previous_ptr->next赋值为current_ptr+current_size,将新的空闲内存块加入链表;

步骤2.3:将新申请的内存加入已申请内存的链表尾;

步骤2.3.1:将已分配内存链表头指针alloced_head赋值给当前块指针current_ptr;

步骤2.3.2:检查current_ptr->next是否为NULL,如果不是NULL,执行步骤2.3.3;如果是NULL,执行步骤2.3.4;

步骤2.3.3:将current_ptr赋值为下一内存块的地址current_ptr->next,执行步骤2.3.2;

步骤2.3.4:将current_ptr->next赋值为returned_pa,将新申请的内存加入已申请内存的链表尾;

步骤2.3.5:将current_ptr赋值为下一内存块的地址current_ptr->next,将current_ptr->next赋值为NULL;

步骤3:调用free_cp_heap()接口释放协处理器端堆内存空间;

步骤3.1:定位需要释放的内存块;

步骤3.1.1:获得需要释放的内存块物理地址to_free_pa,将已分配的内存链表头指针alloced_head赋值给当前块指针current_ptr,将前一内存块指针previous_ptr赋值为NULL;

步骤3.1.2:比较current_ptr与to_free_pa,如果相等,说明已定位到要释放的内存块,则执行步骤3.2;如果不相等,执行步骤3.1.3;

步骤3.1.3:将前一内存块指针previous_ptr赋值为current_ptr,将current_ptr赋值为下一内存块的地址current_ptr->next,执行步骤3.1.2;

步骤3.2:释放内存;

步骤3.2.1:如果current_ptr等于alloced_head,执行步骤3.2.2;如果current_ptr不等于alloced_head,执行步骤3.2.3;

步骤3.2.2:将alloced_head指针赋值为current_ptr->next,执行步骤3.2.4;

步骤3.2.3:将前一内存块的next指针previous_ptr->next赋值为向后第二块内存的地址current_ptr->next;

步骤3.3:合并空闲内存;

步骤3.3.1:将空闲内存链表头指针free_head赋值给当前块指针current_ptr,将前一内存块指针previous_ptr赋值为NULL;

步骤3.3.2:比较current_ptr+current_ptr->size与to_free_pa,如果相等,执行步骤3.3.3;如果不相等,执行步骤3.3.4;

步骤3.3.3:说明当前内存块与释放的内存块相邻,且释放的内存块在后,合并两个内存块,将current_ptr->size赋值为current_ptr->size+to_free_pa->size,完成合并;

步骤3.3.4:比较to_free_pa+to_free_pa->size和current_ptr,如果相等,执行步骤3.3.5;如果不相等,执行步骤3.3.6;

步骤3.3.5:说明当前内存块与释放的内存块相邻,且释放的内存块在前,合并两个内存块,将current_ptr->size赋值为current_ptr->size+to_free_pa->size,current_ptr赋值为to_free_pa,previous_ptr->next赋值为current_ptr,完成合并;

步骤3.3.6:如果current_ptr->next为NULL,执行步骤3.3.8;否则,执行步骤3.3.7;

步骤3.3.7:将前一内存块指针previous_ptr赋值为current_ptr,将current_ptr赋值为下一内存块的地址current_ptr->next,执行步骤3.3.2;

步骤3.3.8:说明释放的内存前后无相邻的空闲内存,再次遍历空闲内存链表,使得current_ptr大于to_free_pa,previous_ptr+previous_ptr->size小于to_free_pa,将previous_ptr->next赋值为to_free_pa,将to_free_pa->next赋值为current_ptr,将释放的内存块加入空闲内存链表中;

步骤4:调用destroy_cp_heap()清理协处理器堆内存空间;

步骤4.1:协处理器端程序执行完毕,通过heap_start_va释放协处理器堆内存。

在一个实施例中,如图2所示,提供了一种面向共享内存式协处理器的堆内存管理装置,包括:堆内存空间申请模块202、链表组织模块204、堆内存空间分配模块206、堆内存空间释放模块208和堆内存空间清理模块210,其中:

堆内存空间申请模块202,用于获取协处理器要申请的协处理器堆内存空间大小信息,根据协处理器堆内存空间大小信息通过第一接口函数申请堆内存空间,将申请的堆内存空间的虚地址转换为物理地址,并将物理地址传递至协处理器端程序;

链表组织模块204,用于通过第一接口函数将申请的堆内存空间分别组织为可用链表和已分配链表;

堆内存空间分配模块206,用于在协处理器端程序申请内存使用时,通过第二接口函数从可用链表头开始寻第一块大小可用的内存分配,并将新分配的内存加入已分配链表的链表尾;

堆内存空间释放模块208,用于在协处理器端程序执行过程中,通过第三接口函数释放协处理器端堆内存空间,并将新释放的内存加入可用链表;

堆内存空间清理模块210,用于在协处理器端程序执行完毕后,通过第四接口函数根据虚地址清理协处理器堆内存空间。

链表组织模块204还用于通过第一接口函数初始化可用链表和已分配链表;将可用链表的可用链表头指针指向物理地址;可用链表和已分配链表的每个节点存储的信息包括:当前节点的内存大小,指向下一节点的指针next;将已分配链表的可分配链表头指针赋值为空。

堆内存空间分配模块206还用于在协处理器端程序申请内存使用时,通过第二接口函数将可用链表头指针赋值给当前内存块指针;若当前内存块的大小大于等于申请内存的大小,则将当前内存块指针作为分配的物理地址返回;否则,将下一内存块指针作为当前内存块指针,判断当前内存块的大小是否满足申请内存的大小,直到到大小合适的内存块,并将其指针作为分配的物理地址返回;将新分配的内存加入已分配链表的链表尾。

堆内存空间分配模块206还用于获取当前内存块的大小;获取申请内存的大小;将当前内存块的大小减去申请内存的大小,作为当前空闲内存块的大小;将当前空闲内存块加入可用链表。

堆内存空间释放模块208还用于在协处理器端程序执行过程中,通过第三接口函数获取需要释放的内存块的物理地址;从已分配链表头开始,依次比较已分配链表中当前内存块的指针和需要释放的内存块的物理地址,若两者相等,将所述已分配链表中当前内存块前一内存块的指向下一节点的指针赋值为当前内存块向后第二块内存的地址。

堆内存空间释放模块208还用于若新释放的内存与可用链表中的空闲内存块相邻,则将新释放的内存与可用链表中相邻的内存块合并;若新释放的内存与可用链表中的空闲内存块不相邻,则遍历可用链表,按照内存地址的先后顺序将新释放的内存块加入可用链表中。

堆内存空间释放模块208还用于从可用链表头开始,依次比较可用链表中当前内存块指针加上当前内存块大小后,是否与新释放的内存块的物理地址相等,若相等,将可用链表中当前内存块和新释放的内存块合并;其中,可用链表中当前内存块在前,新释放的内存块在后;若不相等,将新释放的内存块指针加上新释放的内存块的大小,与可用链表中当前内存块指针依次相比,若相等,将新释放的内存块和可用链表中当前内存块合并;其中,新释放的内存块在前,可用链表中当前内存块在后。

关于面向共享内存式协处理器的堆内存管理装置的具体限定可以参见上文中对于面向共享内存式协处理器的堆内存管理方法的限定,在此不再赘述。上述面向共享内存式协处理器的堆内存管理装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。

在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图3所示。该计算机设备包括通过系统总线连接的处理器、存储器、网络接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的网络接口用于与外部的终端通过网络连接通信。该计算机程序被处理器执行时以实现一种面向共享内存式协处理器的堆内存管理方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。

本领域技术人员可以理解,图3中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。

在一个实施例中,提供了一种计算机设备,包括存储器和处理器,该存储器存储有计算机程序,该处理器执行计算机程序时实现上述方法实施例中的步骤。

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现上述方法实施例中的步骤。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink) DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。

以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。

以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。

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

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

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

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