
1.本公开涉及计算机技术领域,具体而言,涉及一种内存分配方法、装置、计算机设备及存储介质。
背景技术:2.固态硬盘(solid-state drive,ssd)是一种使用闪存存储芯片来存储数据的非易失性存储设备,与传统的机械硬盘相比,固态硬盘没有移动部件,采用电子存储技术,使得读取和写入更快速和稳定。固态硬盘中通常设置有硬盘内存,通常仅作为硬盘内部的数据中转区。由于硬盘与中央处理器之间的通信速率不及系统内存与硬盘之间的通信速率,通常不会使用硬盘的内存缓冲区为应用提供内存。
技术实现要素:3.本公开实施例至少提供一种内存分配方法、装置、计算机设备及存储介质。
4.第一方面,本公开实施例提供了一种内存分配方法,包括:
5.响应于目标应用发送的针对硬盘内存的分配请求,从系统内存中读取所述硬盘内存的空闲内存信息;
6.基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间;
7.基于所述第一存储空间的起始地址信息,在所述硬盘内存中确定出所述第一存储空间对应的第二存储空间,并在所述第二存储空间中写入所述第一存储空间的尺寸信息;
8.将所述第一存储空间对应的起始地址信息发送至所述目标应用,以使所述目标应用基于所述起始地址信息访问所述第二存储空间,并基于所述第二存储空间内写入的所述尺寸信息,以及所述起始地址信息,使用所述第一存储空间。
9.基于上述实施方式,能够利用硬盘内存的空闲内存信息,以及写入第一存储空间的尺寸信息,实现将硬盘内存分配给目标应用;并且将硬盘内存的空闲内存信息存储在访问速度更快的系统内存中,并在针对硬盘内存的分配时,直接从访问速度更快的系统内存中读取硬盘内存的空闲内存信息,不需要从访问速度较慢的硬盘内存中获取,从而降低内存分配所需要的通信时间,实现内存分配效率的提高。
10.一种可选的实施方式中,所述硬盘内存为硬盘中的读写存储缓冲区。
11.上述实施方式中,通过向目标应用分配硬盘中读写速度更快的读写存储缓冲区,使目标应用不需要访问读写速度较慢的其他存储介质,明显提高内存分配的效率,从而提高目标应用的加载速度和响应速度,改善用户体验。
12.一种可选的实施方式中,所述读写存储缓冲区包括控制器内存缓冲区cmb,和/或,持久内存区域pmr。
13.上述实施方式中,基于不同的请求下,可用向目标应用分配硬盘中控制器内存缓冲区cmb,和/或,持久内存区域pmr,掉电后无需保存的数据可以放在cmb中,掉电后仍需保
存的数据可以放在pmr中,这样不同需求的数据都有对应的存储空间,提升了内存分配的效率。
14.一种可选的实施方式中,所述硬盘内存的空闲内存信息包括多个链表;所述链表指示有一段连续内存空间中,处于空闲状态的各个存储空间的内存信息。
15.基于上述实施方式,通过将硬盘内存的空闲内存信息存放在扩展性更好的链表结构中,比如,可以将cmb中空闲内存的首地址存入链表中,提高了在内存分配时修改硬盘内存的空闲内存信息的速度,提升了内存分配的效率,提高目标应用的响应速度。
16.一种可选的实施方式中,所述基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间,包括:
17.对所述多个链表进行遍历,基于遍历到的各个处于空闲状态的存储空间的内存信息,以及所述分配请求指示的需求信息,从各个处于空闲状态的存储空间中筛选出所述第一存储空间。
18.基于上述实施方式,可以实现根据需求信息快速找到合适的存储空间,例如,可以基于最佳适配原则(best fit),在得到全部处于空闲状态的存储空间的内存信息,从中找到和需求信息申请的内存大小最接近的存储空间。通过上述实施方式,对链表中硬盘内存的空闲内存信息的遍历筛选出存储空间,可以准确地找到符合需求信息的空闲内存,提升内存分配时的效率和准确性。
19.一种可选的实施方式中,在响应于目标应用发送的针对硬盘内存的分配请求之前,所述方法还包括:
20.对所述硬盘内存进行空闲检测,生成所述硬盘内存的空闲内存信息;
21.将所述空闲内存信息存储至所述系统内存中。
22.基于上述实施方式,可以生成硬盘内存中各个存储空间的空闲内存信息,例如,通过对cmb中一大块内存进行空闲检测,得到各个部分的空闲信息,然后可以按照32,64,128等不同的字节大小进行分类,将大小相同或相近的空闲信息,以链表结构存储至系统内存。基于上述方式可以生成遍历速度较快的空闲内存信息,还能够将硬盘内存的空闲内存信息存储在访问速度更快的系统内存中,并在针对硬盘内存的分配时,直接从访问速度更快的系统内存中读取硬盘内存的空闲内存信息,不需要从访问速度较慢的硬盘内存中获取,从而降低内存分配所需要的通信时间,实现内存分配效率的提高。
23.第二方面,本公开实施例还提供一种内存分配方法,包括:
24.向内存分配器发送针对硬盘内存的分配请求;
25.接收所述内存分配器返回的第一存储空间的起始地址信息;所述第一存储空间为所述内存分配器基于从系统内存中读取所述硬盘内存的空闲内存信息确定的;
26.基于所述第一存储空间的起始地址信息,访问与所述第一存储空间对应的第二存储空间,并从所述第二存储空间中读取出所述第一存储空间的尺寸信息;所述第一存储空间的尺寸信息为所述内存分配器写入到所述第二存储空间中的;
27.基于所述起始地址信息以及所述尺寸信息,使用所述第一存储空间。
28.第三方面,本公开实施例还提供一种内存分配装置,包括:
29.读取模块,用于响应于目标应用发送的针对硬盘内存的分配请求,从系统内存中读取所述硬盘内存的空闲内存信息;
30.第一确定模块,用于基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间;
31.写入模块,用于基于所述第一存储空间的起始地址信息,在所述硬盘内存中确定出所述第一存储空间对应的第二存储空间,并在所述第二存储空间中写入所述第一存储空间的尺寸信息;
32.第一发送模块,用于将所述第一存储空间对应的起始地址信息发送至所述目标应用,以使所述目标应用基于所述起始地址信息访问所述第二存储空间,并基于所述第二存储空间内写入的所述尺寸信息,以及所述起始地址信息,使用所述第一存储空间。
33.一种可选的实施方式中,所述装置还包括:
34.空闲检测模块,用于在响应于目标应用发送的针对硬盘内存的分配请求之前,对所述硬盘内存进行空闲检测,生成所述硬盘内存的空闲内存信息;将所述空闲内存信息存储至所述系统内存中。
35.第四方面,本公开实施例还提供另一种内存分配装置,包括:
36.第二发送模块,用于向内存分配器发送针对硬盘内存的分配请求;
37.接收模块,用于接收所述内存分配器返回的第一存储空间的起始地址信息;所述第一存储空间为所述内存分配器基于从系统内存中读取所述硬盘内存的空闲内存信息确定的;
38.读取模块,用于基于所述第一存储空间的起始地址信息,访问与所述第一存储空间对应的第二存储空间,并从所述第二存储空间中读取出所述第一存储空间的尺寸信息;所述第一存储空间的尺寸信息为所述内存分配器写入到所述第二存储空间中的;
39.使用模块,用于基于所述起始地址信息以及所述尺寸信息,使用所述第一存储空间。
40.第五方面,本公开可选实现方式还提供一种电子设备,处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
41.第六方面,本公开可选实现方式还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
42.关于上述内存分配方法、装置、电子设备、及存储介质的效果描述参见上述内存分配方法的说明,这里不再赘述。
43.应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本公开的技术方案。
44.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
45.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出
了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
46.图1示出了本公开实施例所提供的一种内存分配方法的流程图;
47.图2示出了本公开实施例所提供的通过heap内存分配器确定存储空间的示意图;
48.图3示出了本公开实施例所提供的确定存储空间后,cmb/pmr设置header的示意图;
49.图4示出了本公开实施例所提供的spdk内存分配器的示意图;
50.图5示出了本公开实施例所提供的linux kernel下的buddy系统的主要结构示意图;
51.图6示出了本公开实施例所提供的另一种内存分配方法的流程图;
52.图7示出了本公开实施例所提供的一种内存分配装置的示意图;
53.图8示出了本公开实施例所提供的另一种内存分配装置的示意图;
54.图9示出了本公开实施例所提供的一种计算机设备的示意图;
55.图10示出了本公开实施例所提供的另一种计算机设备的示意图。
具体实施方式
56.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
57.另外,本公开实施例中的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。
58.在本文中提及的“多个或者若干个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
59.经研究发现,若要利用硬盘内存为应用分配内存,中央处理器需要从硬盘内存中读取出硬盘内存的空闲内存信息,读取过程中,空闲内存信息需要经过pcie总线传输到中央处理器中,而pcie总线的传输速率较慢,导致硬盘内存分配效率低下。
60.基于上述研究,本公开实施例提供了一种内存分配方法,利用硬盘内存的空闲内存信息,以及写入第一存储空间的尺寸信息,实现将硬盘内存分配给目标应用;并且将硬盘内存的空闲内存信息存储在访问速度更快的系统内存中,并在针对硬盘内存的分配时,直接从访问速度更快的系统内存中读取硬盘内存的空闲内存信息,不需要从访问速度较慢的硬盘内存中获取,从而降低内存分配所需要的通信时间,实现内存分配效率的提高。并且,
通过快速确定出硬盘内存中可用的存储空间,还能够提高目标应用的响应速度,改善用户体验。
61.针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的凯发真人首先娱乐的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
62.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
63.需要说明的是,本公开实施例中所提到的特定名词包括:
64.1、ssd(solid-state drive)固态硬盘,是一种用固态电子存储芯片阵列制成的硬盘。
65.2、nvme(non-volatile memory express)非易失性内存主机控制器接口规范,是一种高性能、非统一内存访问优化的、高度可扩展的存储协议。
66.3、cmb(controller memory buffer)读写存储缓冲区,是指ssd控制器内部的一块读写存储缓冲区,可以用来存放将部分(或全部)nvme队列,从而减少延迟,提高主机性能。
67.4、pmr(persistent memory region)持久性内存区域,是指一块ssd控制器内部的读写存储区,特点是在电源断电,控制器复位以及pmr启用/禁用切换之后,写入pmr的数据也会保留,其由内部的电容保护。
68.5、pcie(peripheral component interconnect express)高速串行计算机扩展总线标准,是一种主要用于扩充计算机系统总线数据吞吐量以及提高设备通信速度的总线标准。
69.6、ddr是ddr sdram(double data rate synchronous dynamic random access memory)双倍速率同步动态随机存储器的简称,是指一种计算机内存,指本实施例中的系统内存。
70.为便于对本实施例进行理解,首先对本公开实施例所公开的一种内存分配方法进行详细介绍,本公开实施例所提供的内存分配方法的执行主体一般为具有一定计算能力的计算机设备,该计算机设备例如包括:终端设备或服务器或其它处理设备。在一些可能的实现方式中,该内存分配方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
71.参见图1所示,为本公开实施例提供的内存分配方法的流程图,所述方法包括步骤s101~s104,该方法的执行主体可以为运行在中央处理上的内存分配器,其中:
72.s101:响应于目标应用发送的针对硬盘内存的分配请求,从系统内存中读取硬盘内存的空闲内存信息。
73.其中,目标应用可以指需要分配内存的应用,目标应用可以调用分配函数。
74.上述分配请求可以由目标应用发送,用于向系统申请内存。分配请求可以为上述分配函数,分配函数可以运行在cpu上。
75.上述系统内存可以是动态随机存取存储器(dynamic random access memory,dram),也即直接与cpu能够通信的内存,空闲内存信息可以指示有硬盘内存中,处于空闲状态的内存空间,能够以空闲链表(free list)的形式存在放系统内存中。
76.该步骤中,cpu收到目标应用发送的针对硬盘内存的分配请求后,可以触发中断,
根据分配请求的指示从系统内存中读取硬盘内存的空闲内存信息。
77.触发终端的时机可以是在接收到分配请求后立即中断,也可以根据当前的任务进度,先完成优先级更高的任务,再进行中断。
78.基于上述实施方式,通过从系统内存中读取硬盘内存的空闲内存信息,可以降低内存分配所需要的通信时间,实现内存分配效率的提高。
79.在本公开实施例中,内存分配针对的是硬盘内存,也即硬盘中一块读写存储缓冲区,硬盘内存的大小可以根据实际情况(如待分配应用所需的内存空间大小)设置。示例性的,为了使更多应用能够使用上述硬盘内存,可以设置较大容量的硬盘内存,比如,存储容量为1tb的固态硬盘,配有1gb硬盘内存,该硬盘内存可以支持ddr4架构,通过访问系统内存为目标应用分配硬盘中的读写存储缓冲区的空闲存储空间,可以实现提高目标应用的响应速度,减少内存分配的通信时间。
80.上述硬盘内存可以为硬盘中的读写存储缓冲区,读写存储缓冲区可以包括控制器内存缓冲区cmb,和/或,持久内存区域pmr。
81.上述cmb与ssd介质设置于硬盘的内部,二者之间的数据交换不需要cpu的参与,使用cmb作为nvme的读写缓冲区,可以保证数据传输只在盘内部,可以提高主机性能。使用pmr作为nvme的读写缓冲区,数据写入pmr后,就可以认为写入成功,然后异步的将pmr数据刷回nvme磁盘,这样可以降低写入延迟。pmr用来存储高频访问的元数据,对于元数据的更新不需要随机写盘,提升系统性能。利用上述cmb和/或pmr作为硬盘内存,可以为需要读写硬盘的应用提供较快的读写效率。
82.为了实现对硬盘内存的分配,需要使用硬盘内存的空闲内存信息,为此,在响应于目标应用发送的针对硬盘内存的分配请求之前,可先对所述硬盘内存进行空闲检测,并根据空闲检测的结果,生成所述硬盘内存的空闲内存信息,再将所述空闲内存信息存储至所述系统内存中,以供分配硬盘内存时使用。
83.具体实施过程中,可以通过不同方式来生成硬盘内存的空闲内存信息,例如,硬盘内存的空闲内存信息可以是先对整块cmb内存按照分别按照32,64,128等不同大小字节分成多个小块内存,以链表的数据结构,在多个不同的链表中记录相同或相近大小的空闲内存信息。再例如,硬盘内存的空闲内存信息也可以是无需提前对硬盘内存进行分割,而是直接所有的空闲内存通过链表的形式组织起来。本公开实施例对此不做限制。
84.通过采用上述实施方式,可以生成遍历速度较快的空闲内存信息,还能够将硬盘内存的空闲内存信息存储在访问速度更快的系统内存中,并在针对硬盘内存的分配时,直接从访问速度更快的系统内存中读取硬盘内存的空闲内存信息,不需要从访问速度较慢的硬盘内存中获取,从而降低内存分配所需要的通信时间,实现内存分配效率的提高。
85.s102:基于硬盘内存的空闲内存信息,从硬盘内存中确定出待分配的第一存储空间。
86.该步骤中,可以根据内存空闲信息,筛选出多个符合需求信息的内存空间,再从符合需求信息的内存空间中,筛选出待分配的第一存储空间。
87.上述需求信息可以由分配请求携带,可以指示有需要的最低内存大小、需要的内存类型(如cmb、pmr)等。
88.通过采用上述实施方式,从硬盘内存的空闲内存信息筛选出存储空间,可以准确
地找到符合需求信息的空闲内存,提升内存分配时的效率和准确性。
89.一种可能的实施方式中,所述硬盘内存的空闲内存信息包括多个链表;所述链表指示有一段连续内存空间中,处于空闲状态的各个存储空间的内存信息。
90.其中,链表是一种数据结构,链表中的数据呈线性排列。在链表中,数据的添加和删除都较为方便,通过将硬盘内存的空闲内存信息存放在动态性能更好的链表结构中,比如,可以将cmb中所有空闲内存的首地址以链表结构存入系统内存中,可以提高在内存分配时修改硬盘内存的空闲内存信息的速度,提升了内存分配的效率,提高目标应用的响应速度。
91.为了进一步提高内存分配的效率和准确性,可以对所述多个链表进行遍历,基于遍历到的各个处于空闲状态的存储空间的内存信息,以及所述分配请求指示的需求信息,从各个处于空闲状态的存储空间中筛选出所述第一存储空间。
92.基于上述实施方式,可以实现根据需求信息快速找到合适的存储空间,例如,可以基于最佳适配原则(best fit)确定合适的存储空间,设立一个指针变量指向链表的第一个节点,访问链表得到第一个处于空闲状态的存储空间的内存信息,然后使指针变量后移一个节点,得到第二个处于空闲状态的存储空间的内存信息,依此类推,直到链表的尾节,这样就得到了全部处于空闲状态的存储空间的内存信息,从中找到和需求信息申请的内存大小最接近的存储空间。例如,参见图2,通过对heap内存分配器中多个链表进行遍历后,筛选出与需求信息申请的内存大小最接近的存储空间的首地址存放在系统内存中heap内存分配器下的freelist2里第一个free element中。
93.再例如,基于最差适配(worst fit)原则,同样是设立一个指针变量指向链表的第一个节点,访问链表得到第一个处于空闲状态的存储空间的内存信息,然后使指针变量后移一个节点,得到第二个处于空闲状态的存储空间的内存信息,依此类推,直到链表的尾节,这样就得到了全部处于空闲状态的存储空间的内存信息,但是在找不到大小与分配需求刚好匹配的存储空间,那么就从最大的空闲内存中分配,基于这种最差适配原则,在内存分配操作之后剩下的空闲内存很可能仍然足够大,以满足未来的分配需求。
94.通过上述实施方式,对链表中硬盘内存的空闲内存信息的遍历筛选出存储空间,可以准确地找到符合需求信息的空闲内存,提升内存分配时的效率和准确性。
95.s103:基于第一存储空间的起始地址信息,在硬盘内存中确定出第一存储空间对应的第二存储空间,并在第二存储空间中写入第一存储空间的尺寸信息。
96.在该步骤中,起始地址信息可以是存储空间的绝对地址信息,也可以是基于某个存储空间的首地址做出一定偏移的相对地址信息,例如,硬盘内存pmr中的第一存储空间的起始地址信息可以为绝对地址0x0023。基于第一存储空间的起始地址信息,在硬盘内存中确定出第一存储空间对应的第二存储空间,例如,基于heap内存分配器下的freelist2里第一个free element所对应的硬盘内存确定出cmb/pmr内存,在第二存储空间中写入第一存储空间的尺寸信息时,参见图3,可以在待分配的cmb/pmr内存的地址信息前面会设置一个header,该header用于表征第一存储空间的尺寸信息。
97.示例性的,上述第一内存空间与第二内存空间在物理内存上可以是连续的,第二内存空间可以在第一内存空间之前,这样,便于目标应用利用第一存储空间的起始地址信息推算第二存储空间的地址。
98.s104:将第一存储空间对应的起始地址信息发送至目标应用,以使目标应用基于起始地址信息访问第二存储空间,并基于第二存储空间内写入的尺寸信息,以及起始地址信息,使用第一存储空间。
99.在将尺寸信息写入至第二存储空间后,即可将第一存储空间对应的起始地址信息发送给目标应用,目标应用可以在得到第一存储空间的起始地址信息后,利用起始地址信息推算出第二存储空间的地址信息,并对第二存储空间进行访问,得到第一存储空间的存储信息,从而利用尺寸信息及起始地址信息,对第一存储空间进行使用。
100.这样,通过设置第二存储空间,并在第二存储空间中写入第一存储空间的尺寸信息,能够在回收硬盘内存时,直接读取第二存储空间,得知第一存储空间的尺寸,而不需要再进行分配日志的查询,效率更高;并且,在硬盘内存分配时,由于需要将内存对齐,实际分配给应用的内存空间通常要大于应用需要的内存空间,这样,能够对实际分配了多少硬盘内存进行记录,防止产生内存碎片。
101.本公开实施例提供的内存分配方法,既可以利用spdk内存分配器实现,也可以采用linux kernel下的buddy系统实现。参见图4及图5所示,分别为本公开实施例所提供的spdk内存分配器的示意图,以及本公开实施例所提供的linux kernel下的buddy系统的主要结构示意图。其中,spdk内存分配器对应的空闲内存信息可以有多个链表(如freelist0、freelist1、freelist2),表示一大段空闲的内存空间,链表中可以包括多个free element元素,表示一大段内存空间中的一小段空闲的内存空间;buddy系统对应的空闲内存信息可以有多个内存区域mem zone,内存区域可以对应多个空闲的页面组free_desc,页面组中包含多个空闲页面free_page。
102.通过采用本公开实施例提供的内存分配方法,能够将硬盘内存的空闲内存信息存储在访问速度更快的系统内存中,并在针对硬盘内存的分配时,直接从访问速度更快的系统内存中读取硬盘内存的空闲内存信息,不需要从访问速度较慢的硬盘内存中获取,从而降低内存分配所需要的通信时间,实现内存分配效率的提高。
103.参见图6所示,为本公开实施例提供的另一种内存分配方法的流程图,所述方法包括步骤s601~s604,该方法的执行主体可以为目标应用,其中:
104.s601:向内存分配器发送针对硬盘内存的分配请求。
105.该步骤中,目标应用可以调用c语言中如malloc/free等指令,向内存分配器发送针对硬盘内存的分配请求。本公开实施例对此并不做限制。
106.s602:接收所述内存分配器返回的第一存储空间的起始地址信息;所述第一存储空间为所述内存分配器基于从系统内存中读取所述硬盘内存的空闲内存信息确定的。
107.目标应用可以接收内存分配器返回的第一存储空间的起始地址信息,该起始地址信息可以由内存分配器确定,内存分配器可以从系统内存中读取出硬盘内存的空闲内存信息,并根据空闲内存信息为目标应用分配内存空间,分配的内存空间即为上述第一存储空间。
108.s603:基于所述第一存储空间的起始地址信息,访问与所述第一存储空间对应的第二存储空间,并从所述第二存储空间中读取出所述第一存储空间的尺寸信息;所述第一存储空间的尺寸信息为所述内存分配器写入到所述第二存储空间中的。
109.在该步骤中,目标应用可以基于所述第一存储空间的起始地址信息,推算出第二
存储空间的地址信息,并利用第二存储空间的地址信息访问第二存储空间。在具体实施过程中,目标应用可以与内存分配器预先约定好确定第二存储空间的方式,如对第一存储空间的起始地址信息进行向前偏移,偏移量可以为预设的偏移量,这样,目标应用即可根据第一存储空间的起始地址信息直接访问第二存储空间。
110.s604:基于所述起始地址信息以及所述尺寸信息,使用所述第一存储空间。
111.在该步骤中,目标应用在得知被分配的内存的起始地址信息,以及被分配的内存的尺寸信息之后,即可正常使用被分配的内存,也即上述第一存储空间。
112.本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
113.基于同一发明构思,本公开实施例中还提供了与内存分配方法对应的内存分配装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述内存分配方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
114.参照图7所示,为本公开实施例提供的一种内存分配装置700的示意图,所述装置包括:读取模块701、第一确定模块702、写入模块703、第一发送模块704;其中,
115.读取模块701,用于响应于目标应用发送的针对硬盘内存的分配请求,从系统内存中读取所述硬盘内存的空闲内存信息;
116.第一确定模块702,用于基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间;
117.写入模块703,用于基于所述第一存储空间的起始地址信息,在所述硬盘内存中确定出所述第一存储空间对应的第二存储空间,并在所述第二存储空间中写入所述第一存储空间的尺寸信息;
118.第一发送模块704,用于将所述第一存储空间对应的起始地址信息发送至所述目标应用,以使所述目标应用基于所述起始地址信息访问所述第二存储空间,并基于所述第二存储空间内写入的所述尺寸信息,以及所述起始地址信息,使用所述第一存储空间。
119.一种可能的实施方式中,读取模块701,用于所述硬盘内存为硬盘中的读写存储缓冲区。
120.一种可能的实施方式中,读取模块701,用于所述读写存储缓冲区包括控制器内存缓冲区cmb,和/或,持久内存区域pmr。
121.一种可能的实施方式中,第一确定模块702,用于所述硬盘内存的空闲内存信息包括多个链表;所述链表指示有一段连续内存空间中,处于空闲状态的各个存储空间的内存信息。
122.一种可能的实施方式中,第一确定模块702,用于所述基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间,包括:
123.对所述多个链表进行遍历,基于遍历到的各个处于空闲状态的存储空间的内存信息,以及所述分配请求指示的需求信息,从各个处于空闲状态的存储空间中筛选出所述第一存储空间。
124.一种可选的实施方式中,所述内存分配装置700还包括:
125.空闲检测模块705,用于在响应于目标应用发送的针对硬盘内存的分配请求之前,
对所述硬盘内存进行空闲检测,生成所述硬盘内存的空闲内存信息;将所述空闲内存信息存储至所述系统内存中.
126.参照图8所示,为本公开实施例提供的另一种内存分配装置的示意图,所述装置包括:第二发送模块801、接收模块802、读取模块803、使用模块804;其中,
127.第二发送模块801,用于向内存分配器发送针对硬盘内存的分配请求;
128.接收模块802,用于接收所述内存分配器返回的第一存储空间的起始地址信息;所述第一存储空间为所述内存分配器基于从系统内存中读取所述硬盘内存的空闲内存信息确定的;
129.读取模块803,用于基于所述第一存储空间的起始地址信息,访问与所述第一存储空间对应的第二存储空间,并从所述第二存储空间中读取出所述第一存储空间的尺寸信息;所述第一存储空间的尺寸信息为所述内存分配器写入到所述第二存储空间中的;
130.使用模块804,用于基于所述起始地址信息以及所述尺寸信息,使用所述第一存储空间。
131.关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
132.本公开实施例还提供了一种计算机设备,如图9所示,为本公开实施例提供的计算机设备的结构示意图,包括:
133.处理器91和存储器92;所述存储器92存储有处理器91可执行的机器可读指令,处理器91用于执行存储器92中存储的机器可读指令,所述机器可读指令被处理器91执行时,处理器91执行下述步骤:
134.响应于目标应用发送的针对硬盘内存的分配请求,从系统内存中读取所述硬盘内存的空闲内存信息;
135.基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间;
136.基于所述第一存储空间的起始地址信息,在所述硬盘内存中确定出所述第一存储空间对应的第二存储空间,并在所述第二存储空间中写入所述第一存储空间的尺寸信息;
137.将所述第一存储空间对应的起始地址信息发送至所述目标应用,以使所述目标应用基于所述起始地址信息访问所述第二存储空间,并基于所述第二存储空间内写入的所述尺寸信息,以及所述起始地址信息,使用所述第一存储空间。
138.一种可能的实施方式中,处理器91执行的指令中,所述硬盘内存为硬盘中的读写存储缓冲区。
139.一种可能的实施方式中,处理器91执行的指令中,所述读写存储缓冲区包括控制器内存缓冲区cmb,和/或,持久内存区域pmr。
140.一种可能的实施方式中,处理器91执行的指令中,所述硬盘内存的空闲内存信息包括多个链表;所述链表指示有一段连续内存空间中,处于空闲状态的各个存储空间的内存信息。
141.一种可能的实施方式中,处理器91执行的指令中,所述基于所述硬盘内存的空闲内存信息,从所述硬盘内存中确定出待分配的第一存储空间,包括:
142.对所述多个链表进行遍历,基于遍历到的各个处于空闲状态的存储空间的内存信
息,以及所述分配请求指示的需求信息,从各个处于空闲状态的存储空间中筛选出所述第一存储空间。
143.一种可能的实施方式中,处理器91还用于执行:
144.在响应于目标应用发送的针对硬盘内存的分配请求之前,对所述硬盘内存进行空闲检测,生成所述硬盘内存的空闲内存信息;
145.将所述空闲内存信息存储至所述系统内存中。
146.上述存储器92包括内存921和外部存储器922;这里的内存921也称内存储器,用于暂时存放处理器91中的运算数据,以及与硬盘等外部存储器922交换的数据,处理器91通过内存921与外部存储器922进行数据交换。
147.本公开实施例还提供了另一种计算机设备,如图10所示,为本公开实施例提供的计算机设备的结构示意图,包括:
148.处理器101和存储器102;所述存储器102存储有处理器101可执行的机器可读指令,处理器101用于执行存储器102中存储的机器可读指令,所述机器可读指令被处理器101执行时,处理器101执行下述步骤:
149.向内存分配器发送针对硬盘内存的分配请求;
150.接收所述内存分配器返回的第一存储空间的起始地址信息;所述第一存储空间为所述内存分配器基于从系统内存中读取所述硬盘内存的空闲内存信息确定的;
151.基于所述第一存储空间的起始地址信息,访问与所述第一存储空间对应的第二存储空间,并从所述第二存储空间中读取出所述第一存储空间的尺寸信息;所述第一存储空间的尺寸信息为所述内存分配器写入到所述第二存储空间中的;
152.基于所述起始地址信息以及所述尺寸信息,使用所述第一存储空间。
153.上述存储器102包括内存1021和外部存储器1022;这里的内存1021也称内存储器,用于暂时存放处理器101中的运算数据,以及与硬盘等外部存储器1022交换的数据,处理器101通过内存1021与外部存储器1022进行数据交换。
154.上述指令的具体执行过程可以参考本公开实施例中所述的内存分配方法的步骤,此处不再赘述。
155.本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的内存分配方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
156.本公开实施例还提供一种计算机程序产品,该计算机程序产品承载有程序代码,所述程序代码包括的指令可用于执行上述方法实施例中所述的内存分配方法的步骤,具体可参见上述方法实施例,在此不再赘述。
157.其中,上述计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
158.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实
现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
159.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
160.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
161.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
162.最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。