发明内容
有鉴于此,本申请的目的在于提供一种堆内存管理方法、装置、设备、介质,能够提高堆内存的申请和释放效率,由此提高系统的性能。其具体方案如下:
第一方面,本申请公开了一种堆内存管理方法,应用于异构设备,包括:
获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存;
为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性;
为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动;
在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息;
如果存在,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。
可选地,所述为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,包括:
为所述堆内存申请请求分配对应的堆内存;
根据获取到的属性信息构建空闲链表的链表头,其中,所述属性信息为内存块大小,同一个空闲链表中的各个所述控制信息对应的所述内存块的大小均相同,不同空闲链表中的所述控制信息对应的所述内存块的大小不相同。
可选地,所述返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除之前,还包括:
更新存储所述目标内存块的控制信息的空闲链表的使用次数。
可选地,所述查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息之后,还包括:
如果不存在,则从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块;
如果是,则从所述堆内存中为所述内存块申请请求分配所述目标内存块,并返回所述目标内存块的地址信息。
可选地,所述从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块之后,还包括:
如果否,则判断所述堆内存对应的空闲链表是否均为空;
如果是,则返回错误提示信息;
如果否,则获取各个所述空闲链表在过去预设时长之内的使用次数信息,并将使用次数最少的非空空闲链表对应的所有内存块释放到所述堆内存中,重新执行所述从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块开始的步骤。
可选地,所述返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除之后,还包括:
当所述目标内存块释放时,判断所述目标内存块是否具有所述空闲链表的链表头中的属性信息对应的属性;
如果是,则将所述目标内存块的控制信息存储到对应的空闲链表中,以将所述目标内存块释放到对应的空闲链表中;
如果否,则将所述目标内存释放到所述堆内存,并判断所述目标内存块的前后内存是否空闲;
如果是,则进行内存碎片合并。
可选地,所述为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动,包括:
在内核态获取所述堆内存对应的页表集合,并为所述页表集合映射对应的内核态虚拟地址,其中,所述内核态虚拟地址对应的内存为所述堆内存对应的内核态内存;
配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存;
将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。
第二方面,本申请公开了一种堆内存管理装置,应用于异构设备,包括:
信息获取模块,用于获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存;
堆内存初始化模块,用于为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性;
所述堆内存初始化模块,用于为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动;
内存块分配模块,用于在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息;
所述内存块分配模块,用于所述空闲链表中存在与所述内存块申请请求匹配的目标内存块的控制信息时,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。
第三方面,本申请公开了一种异构设备,包括:
存储器和处理器;
其中,所述存储器,用于存储计算机程序;
所述处理器,用于执行所述计算机程序,以实现前述公开的堆内存管理方法。
第四方面,本申请公开了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述公开的堆内存管理方法。
可见,本申请获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存。然后为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性。再为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息,如果存在,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。由此可见,本申请在堆内存申请时便建立空闲链表的链表头,以在空闲链表中存储所述堆内存中被申请之后又释放的内存块的控制信息,然后在申请所述堆内存中的内存块时,便先对空闲链表进行遍历,优先从所述空闲链表中分配对应的内存块,由于在使用过程中内存块申请具有一定的周期性,即前面使用的内存块后面大概率需要,所以内存块申请时在所述空闲链表中命中率较高,所以可以提高堆内存的申请和释放效率,且空闲链表为双向链表,可以快速遍历,由此可以进一步提高堆内存的申请和释放效率,由此提高系统的性能。此外,由于申请的堆内存为用户态内存,所以还为堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,使得异构设备中不同的硬件可以共享内存,且将所述内核态内存的内核虚拟地址绑定到硬件设备驱动,由于绑定的内核虚拟地址和用户态的堆内存的地址是同一片物理内存,因此实现了内核态和用户态内存共享的目的,消除了用户态到内核态和内核态到用户态的内存拷贝。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
目前,在软件系统中一般都会有两种内存分配方式:栈和堆。其中,栈具有快速、安全可预测等优点,但是往往大小受限于编译器,内存利用率和灵活性较差。而堆则具有大小不受限,使用灵活,内存资源利用率高的优点。虽然堆内存具有上述多种优点,但是也存以下问题,也即,堆本身固有的缺点,也即,堆内存申请与释放本身效率较低。
参见图1所示,本申请实施例公开了一种堆内存管理方法,应用于异构设备,该方法包括:
步骤S11:获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存。
在具体的实施过程中,需要进行堆内存的申请,也即,需要获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存,也即,堆内存申请和分配在用户态实现。
其中,所述异构设备中所谓的异构,就是CPU、DSP(Digital Signal Process,数字信息处理)、GPU(graphics processing unit,图形处理器)、FPGA(Field ProgrammableGate Array,现场可编程逻辑门阵列)、ASIC(Application Specific IntegratedCircuit,专用集成电路)等各种计算单元、使用不同的类型指令集、不同的体系架构的计算单元,组成一个混合的多种硬件架构的处理器系统,采用这种处理器系统的设备即为异构设备。
步骤S12:为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性。
可以理解的是,在获取到所述堆内存申请请求之后,还需要为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性。
在接收到所述堆内存申请请求之后,需要响应所述堆内存申请请求,也即,为所述堆内存申请请求分配对应的堆内存,还需要构建空闲链表的链表头,所述空闲链表用于之后应用向所述堆内存申请内存块又释放该内存块之后,存储释放的该内存块的控制信息,其中,所述控制信息包括内存块的地址信息、大小及属性等,以便将该内存块释放到所述空闲链表中。在实际实施过程中,所述链表头用于管理空闲链表,所述空闲链表可以包括多个,且每个空闲链表均为双向链表,可以快速遍历到其中的某一个节点,空闲链表中的一个节点可以存储一个内存块的控制信息,同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性。例如,链表头中的属性信息为内存块的大小,则同一个空闲链表中的各个所述控制信息对应的所述内存块的大小均相同,均为链表头中的内存块的大小。
参见图2所示,为空闲链表示意图。图中包括3个空闲链表,每个空闲链表包括n个节点,可以保存n个释放到空闲链表中的内存块的控制信息,且图中的属性x头结点也即链表头。每个空闲链表的实线表示从首节点开始到尾结点的链表方向,虚线表示从尾结点开始到首节点的链表方向。
其中,上述的为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,包括:为所述堆内存申请请求分配对应的堆内存;根据获取到的属性信息构建空闲链表的链表头,其中,所述属性信息为内存块大小,同一个空闲链表中的各个所述控制信息对应的所述内存块的大小均相同,不同空闲链表中的所述控制信息对应的所述内存块的大小不相同。也即,将空闲链表的链表头中的属性信息设置为内存块大小,例如,构建3个空闲链表,第一个空闲链表的链表头中的属性信息为内存块大小为8K,第二个空闲链表的链表头中的属性信息为内存块大小为512K,第三个空闲链表的链表头中的属性信息为内存块大小为1M。则第一个空闲链表中存储的控制信息对应的内存块的大小均为8K,第二个空闲链表中存储的控制信息对应的内存块的大小均为512K,第三个空闲链表中存储的控制信息对应的内存块的大小均为1M。
步骤S13:为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。
在实际应用中,还需要为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,使得所述内存态内存成为硬件一致性内存,还需要将所述内存态内存的内核态虚拟地址绑定到硬件设备驱动上。其中,硬件一致性内存也即异构设备中可以不同硬件共享的内存。
由于前面堆内存申请、分配都是在用户态进行的,为了能够让硬件访问到这些内存,需要在内核态重新为堆内存分配内核态内存,也即分配对应的内核虚拟地址,并配置所述内核态内存的访问属性,使得所述内存态内存成为硬件一致性内存,以使得硬件可以共享这些内存,以及将所述内存态内存的内核态虚拟地址绑定到硬件设备驱动上。
步骤S14:在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息。
在前述的工作完成后,如果接收到申请所述堆内存中的内存块的内存块申请请求时,先查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息。所述目标内存块也即与所述内存块申请请求匹配的内存块。
步骤S15:如果存在,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。
如果所述空闲链表中存在于所述内存块申请请求匹配的目标内存块的控制信息,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。其中,与所述内存块申请请求匹配的目标内存块,包括满足所述内存块申请请求中所需要的大小的内存块,满足所述内存块申请请求中所需要的大小的内存块为大小大于或等于所述内存块申请请求中所需要的大小,相对最不浪费剩余内存的内存块,例如,内存块申请请求中所需要的大小为8K,但是空闲链表中还有16K以及512K的内存块的信息,则将16K的内存块作为目标内存块。
在返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除之前,还包括:更新存储所述目标内存块的控制信息的空闲链表的使用次数。
可见,本申请获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存。然后为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性。再为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息,如果存在,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。由此可见,本申请在堆内存申请时便建立空闲链表的链表头,以在空闲链表中存储所述堆内存中被申请之后又释放的内存块的控制信息,然后在申请所述堆内存中的内存块时,便先对空闲链表进行遍历,优先从所述空闲链表中分配对应的内存块,由于在使用过程中内存块申请具有一定的周期性,即前面使用的内存块后面大概率需要,所以内存块申请时在所述空闲链表中命中率较高,所以可以提高堆内存的申请和释放效率,且空闲链表为双向链表,可以快速遍历,由此可以进一步提高堆内存的申请和释放效率,由此提高系统的性能。此外,由于申请的堆内存为用户态内存,所以还为堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,使得异构设备中不同的硬件可以共享内存,且将所述内核态内存的内核虚拟地址绑定到硬件设备驱动,由于绑定的内核虚拟地址和用户态的堆内存的地址是同一片物理内存,因此实现了内核态和用户态内存共享的目的,消除了用户态到内核态和内核态到用户态的内存拷贝。
参见图3所示,本申请实施例公开了一种具体的堆内存管理方法,应用于异构设备,该方法包括:
步骤S21:在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息。
如果接收到申请所述堆内存中的内存块的内存块申请请求时,先查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息。
步骤S22:如果存在,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。
如果所述空闲链表中存在与所述内存块申请请求匹配的目标内存块的控制信息,则更新存储所述目标内存块的控制信息的空闲链表的使用次数,也即,将所述存储所述目标内存块的控制信息的空闲链表的使用次数加1,并将所述目标内存块的地址信息返回,并将所述空闲链表中的所述目标内存块的控制信息删除。
步骤S23:如果不存在,则从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块。
如果不存在,则从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块,以从所述堆内存中分配所需的内存块。
步骤S24:如果是,则从所述堆内存中为所述内存块申请请求分配所述目标内存块,并返回所述目标内存块的地址信息。
如果所述堆内存中存在未分配的与所述内存块申请请求匹配的目标内存块,则从所述堆内存中为所述内存块申请请求分配所述目标内存块,并返回所述目标内存块的地址信息。
步骤S25:如果否,则判断所述堆内存对应的空闲链表是否均为空。
如果所述堆内存中不存在未分配的与所述内存块申请请求匹配的目标内存块,则需要判断所述堆内存对应的空闲链表是否均为空,以确定所述空闲链表中是否还有空闲的内存块。
步骤S26:如果是,则返回错误提示信息。
如果所述堆内存对应的空闲链表均为空,则表示所述堆内存中已经没有空闲的内存块,返回错误提示信息。
步骤S27:如果否,则获取各个所述空闲链表在过去预设时长之内的使用次数信息,并将使用次数最少的非空空闲链表对应的所有内存块释放到所述堆内存中,重新执行所述从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块的步骤。
如果所述堆内存对应的空闲链表还有的空闲链表中还保存着内存块的控制信息,则获取各个空闲链表在过去预设时长之内的使用次数信息,并将使用次数最少的非空空闲链表对应的所有内存块释放到所述堆内存中,也即,将过去预设时长内使用次数最少的空闲链表中存储的所有的控制信息从空闲链表中删除,以便将相应地内存块释放到所述堆内存中,并重新执行从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块开始的步骤。
参见图4所示,为内存块申请流程图。根据用户输入的内存块申请请求,在空闲链表中匹配需要的内存属性,如果匹配成功,则从对应空闲链表中申请需要的内存块,并根据对应空闲链表的使用次数,返回申请的内存块的地址信息,如果匹配失败,则从堆内存的起始地址开始全局搜索,匹配用户需求,如果搜索匹配成功,则从堆内存的空闲区间申请所需要的内存块,并更新堆内存和堆内存中碎片统计信息,返回申请的内存块的地址信息,如果搜索匹配失败,则判断堆内存对应的空闲链表是否均为空,如果均为空,则返回错误信息,如果不是均为空,则获取堆内存对应的最近N次中使用最少的非空空闲链表,记为A,释放链表A对应的所有内存块,并重新执行从堆内存的起始地址开始全局搜索开始的步骤。
参见图5所示,所述返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除之后,还包括:
步骤S31:当所述目标内存块释放时,判断所述目标内存块是否具有所述空闲链表的链表头中的属性信息对应的属性。
步骤S32:如果是,则将所述目标内存块的控制信息存储到对应的空闲链表中,以将所述目标内存块释放到对应的空闲链表中。
步骤S33:如果否,则将所述目标内存释放到所述堆内存,并判断所述目标内存块的前后内存是否空闲。
步骤S34:如果是,则进行内存碎片合并。
也即,在需要释放所述目标内存块时,优先将所述目标内存块释放到所述空闲链表中,也即,需要先判断所述目标内存块是否具有所述目标链表的链表头中的属性信息对应的属性。例如,所述空闲链表的链表头中的属性信息分别为内存块大小为8K、内存块大小为512K及内存块大小为1M,判断所述目标内存块的大小是否为8K,或512K,或1M。
如果所述目标内存块具有所述空闲链表的链表头中的属性信息对应的属性,则将所述目标内存块的控制信息存储到对应的空闲链表中,以将所述目标内存块释放到对应的空闲链表中。如果目标内存块不具有所述空闲链表的链表头中的属性信息对应的属性,则将所述目标内存释放到所述堆内存,并所述目标内存块的前后内存是否空闲,如果所述目标内存块的前后是空闲的,则进行内存碎片合并,以避免堆内存过度碎片化,以至于降低了堆内存的性能。
参见图6所示,为内存块释放流程图。根据用户输入,也即,用户指定要释放的内存块,在空闲链表中匹配内存属性,如果匹配成功,则将对应的内存块释放到对应的空闲链表中,如果匹配不成功,则将内存块释放到堆内存,判断该内存块的前后是否空闲,如果是,则合并内存碎片,如果否,则该内存块释放结束。
参见图7所示,所述为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动,包括:
步骤S41:在内核态获取所述堆内存对应的页表集合,并为所述页表集合映射对应的内核态虚拟地址,其中,所述内核态虚拟地址对应的内存为所述堆内存对应的内核态内存。
步骤S42:配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存。
步骤S43:将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。
也即,需要在内核态获取所述堆内存对应的页表集合,并为所述页表集合映射对应的内核态虚拟地址,其中,所述内核态虚拟地址对应的内存为所述堆内存对应的内核态内存,然后配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存。以及将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。上述过程可以视为是页表中配置过程。
具体的,参见图8所示,为页表重配置流程图。通过系统调用进入内核态,获取用户态内存(也即所述堆内存)对应的页表数,记为x,申请x个页表描述符缓冲区结构为(structpage),记为内核缓冲区1,获取堆内存对应的页表集合(记为页表集合1),并存储到内核缓冲区1中,为页表集合1映射内核态虚拟地址,记为虚拟地址1,配置虚拟地址1的访问属性,实现内存硬件一致性,将虚拟地址1绑定到硬件设备驱动,返回硬件访问地址,退出内核态,返回硬件访问地址及虚拟地址1,页表重配置结束。
在所述堆内存释放时,需要进行页表去重配置,参见图9所示,为页表去重配置流程图。通过系统调用进入内核态。获取内核缓冲区1、用户态内存(也即所述堆内存)对应的页表数x、硬件访问地址,解除虚拟地址1和硬件设备确定的绑定从内核缓冲区1获取页表集合1(也即图中的用户页表),判断页表集合1是否正在使用,如果是,则标记页表为脏页表,如果否,则从内核缓冲区1释放页表集合1,释放内核缓冲区1,页表去重配置结束。
参见图10所示,本申请实施例公开了一种堆内存管理装置,应用于异构设备,包括:
信息获取模块11,用于获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存;
堆内存初始化模块12,用于为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性;
所述堆内存初始化模块12,用于为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动;
内存块分配模块13,用于在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息;
所述内存块分配模块13,用于所述空闲链表中存在与所述内存块申请请求匹配的目标内存块的控制信息时,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。
可见,本申请获取用户触发的堆内存申请请求,其中,所述堆内存申请请求中包括堆内存的起始地址和大小,所述堆内存为用户态内存。然后为所述堆内存申请请求分配对应的堆内存,并构建空闲链表的链表头,其中,所述空闲链表为双向链表,用于存储所述堆内存中被申请之后释放的内存块的控制信息,且同一个空闲链表中的各个所述控制信息对应的所述内存块均有对应链表头中的属性信息对应的属性。再为所述堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,并将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。在获取到申请所述堆内存中的内存块的内存块申请请求时,查找所述空闲链表中是否存在与所述内存块申请请求匹配的目标内存块的控制信息,如果存在,则返回所述目标内存块的地址信息,并将所述空闲链表中的所述目标内存块的控制信息删除。由此可见,本申请在堆内存申请时便建立空闲链表的链表头,以在空闲链表中存储所述堆内存中被申请之后又释放的内存块的控制信息,然后在申请所述堆内存中的内存块时,便先对空闲链表进行遍历,优先从所述空闲链表中分配对应的内存块,由于在使用过程中内存块申请具有一定的周期性,即前面使用的内存块后面大概率需要,所以内存块申请时在所述空闲链表中命中率较高,所以可以提高堆内存的申请和释放效率,且空闲链表为双向链表,可以快速遍历,由此可以进一步提高堆内存的申请和释放效率,由此提高系统的性能。此外,由于申请的堆内存为用户态内存,所以还为堆内存映射对应的内核态内存,配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存,使得异构设备中不同的硬件可以共享内存,且将所述内核态内存的内核虚拟地址绑定到硬件设备驱动,由于绑定的内核虚拟地址和用户态的堆内存的地址是同一片物理内存,因此实现了内核态和用户态内存共享的目的,消除了用户态到内核态和内核态到用户态的内存拷贝。
在实际实施过程中,所述堆内存初始化模块12,用于:
为所述堆内存申请请求分配对应的堆内存;
根据获取到的属性信息构建空闲链表的链表头,其中,所述属性信息为内存块大小,同一个空闲链表中的各个所述控制信息对应的所述内存块的大小均相同,不同空闲链表中的所述控制信息对应的所述内存块的大小不相同。
在实际实施过程中,所述内存块分配模块13,还用于:
更新存储所述目标内存块的控制信息的空闲链表的使用次数。
在实际实施过程中,所述内存块分配模块13,还用于:
在所述空闲链表中不存在与所述内存块申请请求匹配的目标内存块的控制信息时,则从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块;
在所述堆内存中存在未分配的与所述内存块申请请求匹配的目标内存块时,则从所述堆内存中为所述内存块申请请求分配所述目标内存块,并返回所述目标内存块的地址信息。
在实际实施过程中,所述内存块分配模块13,还用于:
在所述堆内存中不存在未分配的与所述内存块申请请求匹配的目标内存块时,则判断所述堆内存对应的空闲链表是否均为空;
在所述堆内存对应的空闲链表均为空时,则返回错误提示信息;
在所述堆内存对应的空闲链表不是均为空时,则获取各个所述空闲链表在过去预设时长之内的使用次数信息,并将使用次数最少的非空空闲链表对应的所有内存块释放到所述堆内存中,重新执行所述从所述堆内存的起始地址开始进行全局搜索,以确定所述堆内存中是否存在未分配的与所述内存块申请请求匹配的目标内存块开始的步骤。
在实际实施过程中,所述堆内存管理装置,还包括:
内存块释放模块,用于在所述目标内存块释放时,判断所述目标内存块是否具有所述空闲链表的链表头中的属性信息对应的属性;如果是,则将所述目标内存块的控制信息存储到对应的空闲链表中,以将所述目标内存块释放到对应的空闲链表中;如果否,则将所述目标内存释放到所述堆内存,并判断所述目标内存块的前后内存是否空闲;如果是,则进行内存碎片合并。
在实际实施过程中,所述堆内存初始化模块12,用于:
在内核态获取所述堆内存对应的页表集合,并为所述页表集合映射对应的内核态虚拟地址,其中,所述内核态虚拟地址对应的内存为所述堆内存对应的内核态内存;
配置所述内核态内存的访问属性,以便将所述内核态内存作为硬件一致性内存;
将所述内核态内存的内核虚拟地址绑定到硬件设备驱动。
进一步的,参见图11所示,本申请实施例还公开了一种异构设备,包括:处理器21和存储器22。
其中,所述存储器22,用于存储计算机程序;所述处理器21,用于执行所述计算机程序,以实现前述实施例中公开的堆内存管理方法。
其中,关于上述堆内存管理方法的具体过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
进一步的,本申请实施例还公开了一种计算机可读存储介质,用于保存计算机程序,其中,所述计算机程序被处理器执行时实现前述任一实施例中公开的堆内存管理方法。
其中,关于上述堆内存管理方法的具体过程可以参考前述实施例中公开的相应内容,在此不再进行赘述。
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其它实施例的不同之处,各个实施例之间相同或相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
结合本文中所公开的实施例描述的方法或算法的步骤可以直接用硬件、处理器执行的软件模块,或者二者的结合来实施。软件模块可以置于随机存储器(RAM)、内存、只读存储器(ROM)、电可编程ROM、电可擦除可编程ROM、寄存器、硬盘、可移动磁盘、CD-ROM、或技术领域内所公知的任意其它形式的存储介质中。
最后,还需要说明的是,在本文中,诸如第一和第二之类的关系术语仅仅用来将一个实体或者操作与另一个实体或者操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得一系列包含其他要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种堆内存管理方法、装置、设备、介质进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。