内存尺寸处理方法、装置、电子设备及存储介质转让专利

申请号 : CN202310784239.1

文献号 : CN116501511B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 庄铭宇张慧海

申请人 : 恒生电子股份有限公司

摘要 :

本申请实施例涉及内存分配技术领域,提供一种内存尺寸处理方法、装置、电子设备及存储介质,对于任意一个待处理内存尺寸,利用为内存尺寸分组所设定的模对该内存尺寸进行分组,来得到该内存尺寸对应的尺寸分组号,由于模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,即,分组后的内存尺寸整体上满足非线性分布,局部细节上又满足线性分布,对内存尺寸的恰当分组;同时,设置内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理,从而可以将内存尺寸转换为尺寸分组号融入内存地址中传递,节省了函数传参消耗,提高了内存分配性能。

权利要求 :

1.一种内存尺寸处理方法,其特征在于,所述方法包括:

获取为内存尺寸分组所设定的模,所述模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,相邻两个标定内存尺寸之间按照模线性平分为若干个特定内存尺寸,所有标定内存尺寸和所有特定内存尺寸形成数列;

针对每个待处理内存尺寸,基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号,其中,所述待处理内存尺寸对应的尺寸分组号为目标内存尺寸在所述数列中的数列下标,所述目标内存尺寸为所述数列中能容纳所述待处理内存尺寸的数据且最小化内存占用的内存尺寸;

设置每个内存地址中的设定位域用来表征不同的尺寸分组号,并对所述设定位域表征同一尺寸分组号的所有内存地址进行统一管理。

2.如权利要求1所述的方法,其特征在于,所述基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号的步骤,包括:根据所述模,计算所述待处理内存尺寸对应的浮点数尾数的位数;

计算所述待处理内存尺寸的二进制位宽;

根据所述浮点数尾数的位数和所述二进制位宽,得到所述待处理内存尺寸对应的浮点数尾数;

根据所述二进制位宽、所述浮点数尾数的位数和所述待处理内存尺寸对应的浮点数尾数,计算对所述待处理内存尺寸进行分组的未取整结果;

对所述未取整结果进行调整,得到所述尺寸分组号。

3.如权利要求2所述的方法,其特征在于,所述根据所述浮点数尾数的位数和所述二进制位宽,得到所述待处理内存尺寸对应的所述浮点数尾数的步骤,包括:根据所述浮点数尾数的位数和所述二进制位宽,按照公式tail= (S>>(W‑T‑1))–m计算出所述待处理内存尺寸对应的浮点数尾数;

其中,tail为所述待处理内存尺寸对应的浮点数尾数,S为所述待处理内存尺寸,>>为右移运算符,W为所述二进制位宽,T为所述浮点数尾数的位数,m为所述模,(S>>(W‑T‑1))表示将所述待处理内存尺寸向右移(W‑T‑1)位。

4.如权利要求2所述的方法,其特征在于,所述根据所述二进制位宽、所述浮点数尾数的位数和所述待处理内存尺寸对应的浮点数尾数,计算对所述待处理内存尺寸进行分组的未取整结果的步骤,包括:根据所述二进制位宽、所述浮点数尾数的位数和所述待处理内存尺寸对应的浮点数尾数,按照公式r= (W‑T‑2)×m+tail计算出对所述待处理内存尺寸进行分组的未取整结果;

其中,r为所述未取整结果,W为所述二进制位宽,T为所述浮点数尾数的位数,m为所述模,tail为所述待处理内存尺寸的浮点数尾数。

5.如权利要求2所述的方法,其特征在于,所述对所述未取整结果进行调整,得到所述尺寸分组号的步骤,包括:计算所述待处理内存尺寸在其对应的浮点数尾数后的小数;

若所述小数为非0,则对所述未取整结果进行加1,得到所述尺寸分组号;

若所述小数为0,则将所述未取整结果作为所述尺寸分组号。

6.如权利要求1所述的方法,其特征在于,所述基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号的步骤,包括:将所述待处理内存尺寸转换为浮点数形式,得到浮点数内存尺寸;

从所述浮点数内存尺寸中获取内部编码值,得到浮点整数;

对所述浮点整数中超出尾数后的小数进行非0进位,得到参考浮点整数;

按照所述模截取所述参考浮点整数中的阶码和尾码,并重组所述阶码和所述尾码得到所述尺寸分组号。

7.如权利要求6所述的方法,其特征在于,所述重组所述阶码和所述尾码得到所述尺寸分组号的步骤,包括:按照公式R=(阶码‑J)×m+尾码高T位,对所述阶码和所述尾码进行重组,得到所述尺寸分组号;

其中,R为所述尺寸分组号,m为所述模,T为所述待处理内存尺寸对应的浮点数尾数的位数,J为转换系数。

8.如权利要求1所述的方法,其特征在于,所述对所述设定位域表征同一尺寸分组号的所有内存地址进行统一管理的步骤,包括:针对一个待分配内存的目标内存数据,获取所述目标内存数据的内存尺寸对应的目标尺寸分组号;

从全部内存地址中,获取所述特定位域表征所述目标尺寸分组号的内存地址组;

从所述内存地址组中获取目标内存地址,并将所述目标内存数据存储至所述目标内存地址对应的内存区域处;

其中,所述目标内存地址是所述内存地址组中与所述目标内存数据的内存尺寸相匹配且未申请的内存地址,或者,所述目标内存地址是所述内存地址组中与所述目标内存数据的内存尺寸相匹配且已释放的内存地址。

9.如权利要求8所述的方法,其特征在于,所述对所述设定位域表征同一尺寸分组号的所有内存地址进行统一管理的步骤,还包括:当需要所述目标内存数据的内存尺寸时,通过所述目标内存地址中所述设定位域所表征的尺寸分组号,反推所述目标内存数据的参考尺寸。

10.如权利要求9所述的方法,其特征在于,所述通过所述目标内存地址中所述设定位域所表征的尺寸分组号,反推所述目标内存数据的参考尺寸的步骤,包括:获取所述目标内存地址中所述设定位域所表征的尺寸分组号;

i+1

按照公式F'=(m+tail)×2 反推所述目标内存数据的参考尺寸;

其中,F'为所述目标内存数据的参考尺寸,m为所述模;tail为所述参考尺寸对应的浮点数尾数,i为所述参考尺寸的二进制阶数,且tail=R mod m, ,R为所述尺寸分组号。

11.一种内存尺寸处理装置,其特征在于,所述装置包括:

获取模块,用于获取为内存尺寸分组所设定的模,所述模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,相邻两个标定内存尺寸之间按照模线性平分为若干个特定内存尺寸,所有标定内存尺寸和所有特定内存尺寸形成数列;

分组模块,用于针对每个待处理内存尺寸,基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号,其中,所述待处理内存尺寸对应的尺寸分组号为目标内存尺寸在所述数列中的数列下标,所述目标内存尺寸为所述数列中能容纳所述待处理内存尺寸的数据且最小化内存占用的内存尺寸;

管理模块,用于设置每个内存地址中的设定位域用来表达不同的所述尺寸分组号,并对所述设定位域为同一所述尺寸分组号的所有内存地址进行统一管理。

12.一种电子设备,其特征在于,包括处理器和存储器,所述存储器用于存储程序,所述处理器用于在执行所述程序时,实现权利要求1‑10中任一项所述的内存尺寸处理方法。

13.一种计算机可读存储介质,其特征在于,其上存储有计算机程序,该计算机程序被处理器执行时实现如权利要求1‑10中任一项所述的内存尺寸处理方法。

说明书 :

内存尺寸处理方法、装置、电子设备及存储介质

技术领域

[0001] 本申请实施例涉及内存分配技术领域,具体而言,涉及一种内存尺寸处理方法、装置、电子设备及存储介质。

背景技术

[0002] 目前,为了提高内存分配效率,会对内存数据所占的内存尺寸进行分组后供给内存分配器(Memory Allocator)算法使用,也就是将尺寸相同或相近的内存分为一组。例如,申请63字节的内存和申请64字节的内存都划分到64字节的组,组内内存规格相同都实际占用64字节空间,因此回收以后可以等价替换。
[0003] 现有技术中,通常采用线性分组或者对数分组的方式对内存尺寸进行分组,其中,线性分组是指按照等差数列进行分组,例如,16×i,会导致分组数量过大内存分配效率低;对数分组是指按照等比数列进行分组,例如,16,32,64,128……,会导致分组数量过小内存浪费多。

发明内容

[0004] 本申请实施例的目的在于提供一种内存尺寸处理方法、装置、电子设备及存储介质,能够对内存尺寸进行恰当分组,提高内存分配性能。
[0005] 为了实现上述目的,本申请实施例采用的技术方案如下:
[0006] 第一方面,本申请实施例提供了一种内存尺寸处理方法,所述方法包括:
[0007] 获取为内存尺寸分组所设定的模,所述模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布;
[0008] 针对每个待处理内存尺寸,基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号;
[0009] 设置每个内存地址中的设定位域用来表征不同的尺寸分组号,并对所述设定位域表征同一尺寸分组号的所有内存地址进行统一管理。
[0010] 可选地,所述基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号的步骤,包括:
[0011] 根据所述模,计算所述待处理内存尺寸对应的浮点数尾数的位数;
[0012] 计算所述待处理内存尺寸的二进制位宽;
[0013] 根据所述浮点数尾数的位数和所述二进制位宽,得到所述待处理内存尺寸对应的浮点数尾数;
[0014] 根据所述二进制位宽、所述浮点数尾数的位数和所述待处理内存尺寸对应的浮点数尾数,计算对所述待处理内存尺寸进行分组的未取整结果;
[0015] 对所述未取整结果进行调整,得到所述尺寸分组号。
[0016] 可选地,所述根据所述浮点数尾数的位数和所述二进制位宽,得到所述待处理内存尺寸对应的所述浮点数尾数的步骤,包括:
[0017] 根据所述浮点数尾数的位数和所述二进制位宽,按照公式tail= (S>>(W‑T‑1))–m计算出所述待处理内存尺寸对应的浮点数尾数;
[0018] 其中,tail为所述待处理内存尺寸对应的浮点数尾数,S为所述待处理内存尺寸,>>为右移运算符,W为所述二进制位宽,T为所述浮点数尾数的位数,m为所述模,(S>>(W‑T‑1))表示将所述待处理内存尺寸向右移(W‑T‑1)位。
[0019] 可选地,所述根据所述二进制位宽、所述浮点数尾数的位数和所述待处理内存尺寸对应的浮点数尾数,计算对所述待处理内存尺寸进行分组的未取整结果的步骤,包括:
[0020] 根据所述二进制位宽、所述浮点数尾数的位数和所述待处理内存尺寸对应的浮点数尾数,按照公式r= (W‑T‑2)×m+tail计算出对所述待处理内存尺寸进行分组的未取整结果;
[0021] 其中,r为所述未取整结果,W为所述二进制位宽,T为所述浮点数尾数的位数,m为所述模,tail为所述待处理内存尺寸的浮点数尾数。
[0022] 可选地,所述对所述未取整结果进行调整,得到所述尺寸分组号的步骤,包括:
[0023] 计算所述待处理内存尺寸在其对应的浮点数尾数后的小数;
[0024] 若所述小数为非0,则对所述未取整结果进行加1,得到所述尺寸分组号;
[0025] 若所述小数为0,则将所述未取整结果作为所述尺寸分组号。
[0026] 可选地,所述基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号的步骤,包括:
[0027] 将所述待处理内存尺寸转换为浮点数形式,得到浮点数内存尺寸;
[0028] 从所述浮点数内存尺寸中获取内部编码值,得到浮点整数;
[0029] 对所述浮点整数中超出尾数后的小数进行非0进位,得到参考浮点整数;
[0030] 按照所述模截取所述参考浮点整数中的阶码和尾码,并重组所述阶码和所述尾码得到所述尺寸分组号。
[0031] 可选地,所述重组所述阶码和所述尾码得到所述尺寸分组号的步骤,包括:
[0032] 按照公式R=(阶码‑J)×m+尾码高T位,对所述阶码和所述尾码进行重组,得到所述尺寸分组号;
[0033] 其中,R为所述尺寸分组号,m为所述模,T为所述待处理内存尺寸对应的浮点数尾数的位数,J为转换系数。
[0034] 可选地,所述对所述设定位域表征同一尺寸分组号的所有内存地址进行统一管理的步骤,包括:
[0035] 针对一个待分配内存的目标内存数据,获取所述目标内存数据的内存尺寸对应的目标尺寸分组号;
[0036] 从全部内存地址中,获取所述特定位域表征所述目标尺寸分组号的内存地址组;
[0037] 从所述内存地址组中获取目标内存地址,并将所述目标内存数据存储至所述目标内存地址对应的内存区域处;
[0038] 其中,所述目标内存地址是所述内存地址组中与所述目标内存数据的内存尺寸相匹配且未申请的内存地址,或者,所述目标内存地址是所述内存地址组中与所述目标内存数据的内存尺寸相匹配且已释放的内存地址。
[0039] 可选地,所述对所述设定位域表征同一尺寸分组号的所有内存地址进行统一管理的步骤,还包括:
[0040] 当需要所述目标内存数据的内存尺寸时,通过所述目标内存地址中所述设定位域所表征的尺寸分组号,反推所述目标内存数据的参考尺寸。
[0041] 可选地,所述通过所述目标内存地址中所述设定位域所表征的尺寸分组号,反推所述目标内存数据的参考尺寸的步骤,包括:
[0042] 获取所述目标内存地址中所述设定位域所表征的尺寸分组号;
[0043] 按照公式F'=(m+tail)×2i+1反推所述目标内存数据的参考尺寸;
[0044] 其中,F'为所述目标内存数据的参考尺寸,m为所述模;tail为所述参考尺寸对应的浮点数尾数,i为所述参考尺寸的二进制阶数,且tail=R mod m, ,R为所述尺寸分组号。
[0045] 第二方面,本申请实施例还提供了一种内存尺寸处理装置,所述装置包括:
[0046] 获取模块,用于获取为内存尺寸分组所设定的模,所述模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布;
[0047] 分组模块,用于针对每个待处理内存尺寸,基于所述模对所述待处理内存尺寸进行分组,得到所述待处理内存尺寸对应的尺寸分组号;
[0048] 管理模块,用于设置每个内存地址中的设定位域用来表达不同的所述尺寸分组号,并对所述设定位域为同一所述尺寸分组号的所有内存地址进行统一管理。
[0049] 第三方面,本申请实施例还提供了一种电子设备,包括处理器和存储器,所述存储器用于存储程序,所述处理器用于在执行所述程序时实现上述第一方面中的内存尺寸处理方法。
[0050] 第四方面,本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述第一方面中的内存尺寸处理方法。
[0051] 相对现有技术,本申请实施例提供的一种内存尺寸处理方法、装置、电子设备及存储介质,对于任意一个待处理内存尺寸,利用为内存尺寸分组所设定的模对该内存尺寸进行分组,来得到该内存尺寸对应的尺寸分组号,由于模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,即,分组后的内存尺寸整体上满足非线性分布,局部细节上又满足线性分布,融合了非线性分组和线性分组的特性,可以保证分组数量既不会过大又不会过小,实现了对内存尺寸的恰当分组;同时,设置内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理,从而可以将内存尺寸转换为尺寸分组号融入内存地址中传递,节省了函数传参消耗,提高了内存分配性能。

附图说明

[0052] 图1示出了本申请实施例提供的一种内存尺寸处理方法的流程示意图。
[0053] 图2为图1所示的内存尺寸处理方法中步骤S102的一种流程示意图。
[0054] 图3为图1所示的内存尺寸处理方法中步骤S102的另一种流程示意图。
[0055] 图4示出了本申请实施例提供的48位内存地址的示例图。
[0056] 图5为图1所示的内存尺寸处理方法中步骤S103的流程示意图。
[0057] 图6示出了本申请实施例提供的一种内存尺寸处理装置的方框示意图。
[0058] 图7示出了本申请实施例提供的一种电子设备的方框示意图。
[0059] 图标:100‑内存尺寸处理装置;101‑获取模块;102‑分组模块;103‑管理模块;10‑电子设备;11‑处理器;12‑存储器;13‑总线。

具体实施方式

[0060] 下面将结合本申请实施例中附图,对本申请实施例中的技术方案进行清楚、完整地描述。
[0061] 现有技术中,对内存尺寸进行分组时,通常采用线性分组或者对数分组。但是,线性分组会导致分组数量过大内存分配效率低,例如,按16字节进行线性分组,则从16字节~128MB,共计约128M/16=8M=800万多的分组数量,就算按64字节进行线性分组,也会有200万多的分组数量,显然分组数量过大。对数分组会导致分组数量过小内存浪费多,例如,按16 
32 64 128 256 512 1K 2K 4K 8K 16K……1M 2M 4M 8M……64M 128M进行对数分组,如果申请64M+1字节的内存,由于分组数量过小,实际给到的是128M的内存,浪费了接近50%。因此,不管是线性分组还是对数分组,都会影响内存分配的性能。
[0062] 针对这一问题,本申请实施例通过为内存尺寸分组设定模,并利用模对内存尺寸进行分组得到对应的尺寸分组号,由于模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,即,分组后的内存尺寸整体上满足非线性分布,局部细节上又满足线性分布,融合了非线性分组和线性分组的特性,可以保证分组数量既不会过大又不会过小,实现了对内存尺寸的恰当分组,同时,设置内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理,从而可以将内存尺寸转换为尺寸分组号融入内存地址中传递,节省了函数传参消耗,提高了内存分配性能。下面进行详细介绍。
[0063] 请参照图1,图1示出了本申请实施例提供的内存尺寸处理方法的流程示意图。该内存尺寸处理方法应用于电子设备,可以包括以下步骤:
[0064] S101,获取为内存尺寸分组所设定的模,模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布。
[0065] 在本实施例中,定义模为相邻两个标定内存尺寸(例如,2N和2N+1,N=0,1,2……)之N间进行线性平行的刻度数量,通常可取模为4或8。标定内存尺寸是指满足2 ,N=0,1,2的内存尺寸。
[0066] 下面通过举例对模进行详细说明。
[0067] 假设模为4时,可以将内存尺寸的数值向上规整到S={8、……、·32、32+8、32+16、32+24、·64、64+16、64+32、64+48、·128、128+32、128+64、128+96、·256、……、·1G、1G+
0.25G、1G+0.5G、1G+0.75G、·2G、……、28G}这个数列中。
[0068] 即,S4i+j(j=0,1,2,3)=(4+j)×2i+1,其中,i为阶数,j为余数,4i+j(j=0,1,2,3)为数列i+1下标,(4+j)×2 为内存尺寸的数值。
[0069] 并且,每个带有着重号的数值之间(即当j=0)是呈翻倍上涨的,带有着重号的即为标定内存尺寸,例如,8、32、64等,显然,所有标定内存尺寸满足非线性分布,也即对数分布。而着重号之间平分为4份(即,模),即,相邻两个标定内存尺寸之间的内存尺寸满足线性分布,例如,32、32+8、32+16、32+24,且按照模进行平分。以上数列也可以用{S0~S127~S180}={8~
28G 256T}表示,数列中每增加4个值则可以使表达的内存尺寸继续翻倍。
~
[0070] 假设模为8时,可以将内存尺寸的数值向上规整到R={16、……、·64、64+8、64+16、64+24、64+32、64+40、64+48、64+56、·128、128+16、……、·256、……、·1G、1G+0.125G、1G+
0.25G、1G+0.375G、1G+0.5G、1G+0.625G、1G+0.75G、1G+0.875G、2G、……·32G、52G、56G、
60G}这个数列中。其中,带着重号的即为标定内存尺寸,例如,16、64、128等,所有标定内存尺寸满足非线性分布/对数分布。相邻两个标定内存尺寸之间的内存尺寸满足线性分布,例如,64、64+8、64+16、64+24、64+32、64+40、64+48、64+56满足线性分布,且按照模(即,8)进行平分。
[0071] 即,R8i+j(j=0,1,2,3,4,5,6,7)=(8+j)×2i+1,其中,i为阶数,j为余数,8i+j(j=0,1,2,3,4,i+15,6,7)为数列下标,(8+j)×2 为内存尺寸的数值,也可以用{R0~R127~R255}={16~960K~
60G}表示。
[0072] 显然,针对任意一个内存尺寸,只要给定为内存尺寸分组所用到的模,通过求解和保存内存尺寸对应的数列下标,即,内存尺寸对应的尺寸分组号,就能实现对内存尺寸的恰当分组。
[0073] 实际中,可以根据分组粒度需求,设定模为4或8,模决定了每当尺寸翻倍所经过的刻度数量,即,相邻两个标定内存尺寸之间进行线性平分的刻度数量。例如,针对[128,256)的内存尺寸区间,如果设定模为4,则[128,256)内有4个刻度128、160、192、224;如果设定模为8,则[128,256)内有8个刻度128、144、160、176、192、208、224、240。
[0074] 从以上内容可知,模越大,代表精度越细。但是,由于尺寸分组号=4i+j,模越大,余数的最大值也会越大,即,余数占的位数越多,尺寸分组号的位数越多。为了使尺寸分组号占恰当的位数(例如,8位),模通常会取4或8。
[0075] S102,针对每个待处理内存尺寸,基于模对待处理内存尺寸进行分组,得到待处理内存尺寸对应的尺寸分组号。
[0076] 在本实施例中,获取为内存尺寸分组所设定的模之后,针对每个待处理内存尺寸,都可以基于模对待处理内存尺寸进行分组,来得到该待处理内存尺寸对应的尺寸分组号。
[0077] 下面以一个待处理内存尺寸为例,对步骤S102进行详细介绍。
[0078] 在一种可能的实现方式中,在图1的基础上,请参照图2,步骤S102中基于模对待处理内存尺寸进行分组,得到待处理内存尺寸对应的尺寸分组号的过程,可以包括S1021 ~S1025。
[0079] S1021,根据模,计算待处理内存尺寸对应的浮点数尾数的位数。
[0080] 在本实施例中,可以按照公式T=log2m计算待处理内存尺寸对应的浮点数尾数的位数,其中,T为浮点数尾数的位数,m为模。例如,m=4或8,则T=2或3。
[0081] S1022,计算待处理内存尺寸的二进制位宽。
[0082] 在本实施例中,可以采用W=bit_width(S)或者W=⌈Log2S⌉的方式,来计算待处理内存尺寸的二进制位宽,其中,S表示待处理内存尺寸,W表示二进制位宽。
[0083] 例如,假设S=127,则W=bit_width(S) =bit_width(127)=7,或者,W=⌈Log2S⌉=⌈Log2127⌉=7。
[0084] S1023,根据浮点数尾数的位数和二进制位宽,得到待处理内存尺寸对应的浮点数尾数。
[0085] 在本实施例中,可以根据浮点数尾数的位数和二进制位宽,按照公式tail= (S>>(W‑T‑1))–m计算出待处理内存尺寸对应的浮点数尾数;
[0086] 其中,tail为待处理内存尺寸对应的浮点数尾数,S为内存尺寸,>>为右移运算符,W为二进制位宽,T为浮点数尾数的位数,m为模,(S>>(W‑T‑1))表示将待处理内存尺寸向右移(W‑T‑1)位。
[0087] 例如,假设S=127,W=7,m=4,T=2,则tail= (S>>(W‑T‑1))–m=(127>>4)–4=7‑4=3。
[0088] S1024,根据二进制位宽、浮点数尾数的位数和待处理内存尺寸对应的浮点数尾数,计算对待处理内存尺寸进行分组的未取整结果。
[0089] 在本实施例中,可以根据二进制位宽、浮点数尾数的位数和待处理内存尺寸对应的浮点数尾数,按照公式r= (W‑T‑2)×m+tail计算出对待处理内存尺寸进行分组的未取整结果;
[0090] 其中,r为未取整结果,W为二进制位宽,T为浮点数尾数的位数,m为模,tail为待处理内存尺寸的浮点数尾数。
[0091] 例如,假设W=7,m=4,T=2,tail=3,则r= (W‑T‑2)×m+tail=(7‑2‑2)×4+3=15。
[0092] S1025,对未取整结果进行调整,得到尺寸分组号。
[0093] 在本实施例中,S1025中对未取整结果进行调整,得到尺寸分组号的过程,可以包括:
[0094] 计算待处理内存尺寸在其对应的浮点数尾数后的小数;
[0095] 若小数为非0,则对未取整结果进行加1,得到尺寸分组号;
[0096] 若小数为0,则将未取整结果作为尺寸分组号。
[0097] 可选地,可以按照公式x=S mod 2W‑T计算待处理内存尺寸在其对应的浮点数尾数W‑T后的小数。例如,假设S=127,W=7,T=2,则x=S mod 2 =(127 MOD 32) = 31。
[0098] 由于小数31非0,则对未取整结果进行加1,得到尺寸分组号R=r+1=16。
[0099] 以下通过一个举例说明以上计算过程。
[0100] 假设模取4,针对一个待处理内存尺寸59,59的二进制是11 1011,预期放在内存尺寸为64的分组,即S12。
[0101] 59=111011(2进制)=1.11011(2进制)×32(10进制)=111.011(2进制)×8(10进制),忽略0.11,即111(2)×8(10)。111去掉最高位得11(2进制),即tail=3。
[0102] 1.00(2进制)×32=100(2进制)×8,在数列S中对应S8 S11,(100+11)(2进制)×8~对应S(8+3)=S11=56。
[0103] 显然,56的内存尺寸装不下59,59比56多的就是之前忽略的0.11(2进制),所以要用下一个分组S(11+1)来装59,11是未取整结果(即“不考虑59需要向上调整到64的结果”),未取整结果可能装不下目标大小所以可能需要+1(即,当忽略的0.11>0时),所以,12就是59的取整结果。即,待处理内存尺寸59对应的尺寸分组号为12。
[0104] 在另一种可能的实现方式中,在图1的基础上,请参照图3,步骤S102中基于模对内存尺寸进行分组,得到待处理内存尺寸对应的尺寸分组号的过程,可以包括S102a S102d。~
[0105] S102a,将待处理内存尺寸转换为浮点数形式,得到浮点数内存尺寸。
[0106] 在本实施例中,将待处理内存尺寸转换为浮点数形式,即,float或double格式(IEEE753或IEEE754标准),得到浮点数内存尺寸。
[0107] S102b,从浮点数内存尺寸中获取内部编码值,得到浮点整数。
[0108] 在本实施例中,用union技术,或指针强制转换技术,或C++20的bit_cast,从浮点数内存尺寸中获取内部编码值,得到浮点整数。
[0109] 例如,假设S=127,则浮点整数为B=(uint64_t)&(const double&)double(S)= 0x405fc00000000000。根据IEEE754此值可解为阶码:0x405,尾码二进制:0b1111'
11000000'00000000'00000000'00000000'00000000'00000000。
[0110] S102c,对浮点整数中超出尾数后的小数进行非0进位,得到参考浮点整数。
[0111] 在本实施例中,按照公式B'=B+(1<<(52‑T))‑1对浮点整数中超出尾数后的小数进行非0进位,得到参考浮点整数B'。
[0112] 例如,B'=B+0x3ffffffffffff=0x4063bfffffffffff,此值可理解为阶码0x406,尾码二进制: 0b0011'10111111'11111111'11111111'11111111'11111111'11111111,尾码高2位为0。
[0113] S102d,按照模截取参考浮点整数中的阶码和尾码,并重组阶码和尾码得到尺寸分组号。
[0114] 在本实施例中,可以按照公式R=(阶码‑J)×m+尾码高T位,对阶码和尾码进行重组,得到尺寸分组号;
[0115] 其中,R为尺寸分组号,m为模,T为待处理内存尺寸对应的浮点数尾数的位数,J为转换系数。
[0116] 例如,假设阶码为0x406,m为4,T为2,尾码高2位为0;同时,由于IEEE规定浮点数128的阶码存储值是0x406,为了换算到S16对应的i=4,需要凑一个0x402,即转换系数J为
0x402,则R=(阶码‑J)×m+尾码高T位=(0x406‑0x402)×4+0=16+0=16。
[0117] S103,设置每个内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理。
[0118] 在本实施例中,为了将内存尺寸转换为尺寸分组号随内存地址传递,可以设置内存地址的设定位域(例如32 38位共7位)用来表征不同的尺寸分组号,并对设定位域表征同~一尺寸分组号的所有内存地址进行统一管理。
[0119] 例如,请参照图4,设置48位地址值中的第10 16共7位来表征尺寸分组号,如此,即~可将内存尺寸转换为尺寸分组号融入内存地址中传递。
[0120] 现有的软件编程技术中,为了将内存数据所占的内存尺寸进行跨越函数和事件的传递,往往需要将内存尺寸存储在内存指针变量附近,或者,将内存尺寸存储在内存数据附近。
[0121] 但是,如果将内存尺寸存储在内存指针变量附近,即,携带内存尺寸的内存指针,这在64位环境中通常需要双倍地址长度,即16字节,导致可能降低函数调用的性能。如果将内存尺寸存储在内存数据附近,则会影响到内存数据的布局或对齐性质,并且获取内存尺寸时还需要读取内存数据。
[0122] 而本申请实施例中,通过设置内存地址中的设定位域用来表征不同的尺寸分组号,从而可以将内存尺寸转换为尺寸分组号融入内存地址中传递,节省了函数传参消耗,提高了内存分配性能。
[0123] 下面对步骤S103进行详细介绍。
[0124] 在一种可能的实现方式中,在图1的基础上,请参照图5,步骤S103中对设定位域表征同一尺寸分组号的所有内存地址进行统一管理的过程,可以包括S1031 S1033。~
[0125] S1031,针对一个待分配内存的目标内存数据,获取目标内存数据的内存尺寸对应的目标尺寸分组号。
[0126] S1032,从全部内存地址中,获取特定位域表征目标尺寸分组号的内存地址组。
[0127] S1033,从内存地址组中获取目标内存地址,并将目标内存数据存储至目标内存地址对应的内存区域处;其中,目标内存地址是内存地址组中与目标内存数据的内存尺寸相匹配且未申请的内存地址,或者,目标内存地址是内存地址组中与目标内存数据的内存尺寸相匹配且已释放的内存地址。
[0128] 例如,假设目标内存数据的内存尺寸对应的目标尺寸分组号为16,从全部内存地址中,获取到P=0x03160000 0x0316FFFF、0x04160000 0x0416FFFF、……均表征16的内存地~ ~址组,之后,从所获取的内存地址组中,获取与目标内存数据的内存尺寸相匹配且未申请的内存地址,或者,获取与目标内存数据的内存尺寸相匹配且已释放的内存地址,并按照该内存地址存储目标内存数据。
[0129] 也就是,可以从内存地址组中,获取未申请的内存地址,也可以获取申请后释放的内存地址。
[0130] 在另一种可能的实现方式中,请继续参照图5,步骤S103中对设定位域表征同一尺寸分组号的所有内存地址进行统一管理的过程,还可以包括S1034。
[0131] S1034,当需要目标内存数据的内存尺寸时,通过目标内存地址中设定位域所表征的尺寸分组号,反推目标内存数据的参考尺寸。
[0132] 通过前述内容可知,可以将目标内存数据的内存尺寸转换为尺寸分组号融入内存地址中传递,当需要目标内存数据的内存尺寸时,可以通过目标内存地址中设定位域所表征的尺寸分组号,反推目标内存数据的参考尺寸。
[0133] 在本实施例中,S1034中通过目标内存地址中设定位域所表征的尺寸分组号,反推目标内存数据的参考尺寸的过程,可以包括S10341 S10342。~
[0134] S10341,获取目标内存地址中设定位域所表征的尺寸分组号。
[0135] S10342,按照公式F'=(m+tail)×2i+1反推目标内存数据的参考尺寸;
[0136] 其中,F'为目标内存数据的参考尺寸,m为模;tail为参考尺寸对应的浮点数尾数,i为参考尺寸的二进制阶数,且tail=R mod m, ,R为尺寸分组号。
[0137] 例如,尺寸分组号16的参考尺寸=F'(16)=(4+(16 Mod 4))× =4×32=128字节,尺寸分组号15的参考尺寸=F'(15)=(4+(15 Mod 4))× =7×16=112字节,所以,尺寸分组号16所对应的区域存储的内存数据,其内存尺寸介于(112,128]字节。
[0138] 与现有技术相比,本申请实施例具有以下有益效果:
[0139] 首先,通过为内存尺寸分组设定模,并利用模对待处理内存尺寸进行分组得到对应的尺寸分组号,由于模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,即,分组后的内存尺寸整体上满足非线性分布,局部细节上又满足线性分布,融合了非线性分组和线性分组的特性,可以保证分组数量既不会过大又不会过小,实现了对内存尺寸的恰当分组,同时,设置内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理,从而可以将内存尺寸转换为尺寸分组号融入内存地址中传递,节省了函数传参消耗,提高了内存分配性能。
[0140] 其次,当需要目标内存数据的内存尺寸时,可以通过目标内存地址中设定位域所表征的尺寸分组号,反推目标内存数据的参考尺寸,从而无需读取数据内存即可获取到内存尺寸。
[0141] 为了执行上述方法实施例及各个可能的实施方式中的相应步骤,下面给出一种内存尺寸处理装置的实现方式。
[0142] 请参照图6,图6示出了本申请实施例提供的内存尺寸处理装置100的方框示意图。内存尺寸处理装置100应用于电子设备10,包括:获取模块101、分组模块102及管理模块
103。
[0143] 获取模块101,用于获取为内存尺寸分组所设定的模模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布。
[0144] 分组模块102,用于针对每个待处理内存尺寸,基于模对待处理内存尺寸进行分组,得到待处理内存尺寸对应的尺寸分组号。
[0145] 管理模块103,用于设置每个内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理。
[0146] 在一种可能的实现方式中,分组模块102执行基于模对待处理内存尺寸进行分组,得到待处理内存尺寸对应的尺寸分组号的方式,包括:
[0147] 根据模,计算待处理内存尺寸对应的浮点数尾数的位数;
[0148] 计算待处理内存尺寸的二进制位宽;
[0149] 根据浮点数尾数的位数和二进制位宽,得到待处理内存尺寸对应的浮点数尾数;
[0150] 根据二进制位宽、浮点数尾数的位数和待处理内存尺寸对应的浮点数尾数,计算对待处理内存尺寸进行分组的未取整结果;
[0151] 对未取整结果进行调整,得到尺寸分组号。
[0152] 可选地,分组模块102执行根据浮点数尾数的位数和二进制位宽,得到待处理内存尺寸对应的浮点数尾数的方式,包括:
[0153] 根据浮点数尾数的位数和二进制位宽,按照公式tail= (S>>(W‑T‑1))–m计算出待处理内存尺寸对应的浮点数尾数;
[0154] 其中,tail为待处理内存尺寸对应的浮点数尾数,S为待处理内存尺寸,>>为右移运算符,W为二进制位宽,T为浮点数尾数的位数,m为模,(S>>(W‑T‑1))表示将待处理内存尺寸向右移(W‑T‑1)位。
[0155] 可选地,分组模块102执行根据二进制位宽、浮点数尾数的位数和待处理内存尺寸对应的浮点数尾数,计算对内存尺寸进行分组的未取整结果的方式,包括:
[0156] 根据二进制位宽、浮点数尾数的位数和待处理内存尺寸对应的浮点数尾数,按照公式r= (W‑T‑2)×m+tail计算出对待处理内存尺寸进行分组的未取整结果;
[0157] 其中,r为未取整结果,W为二进制位宽,T为浮点数尾数的位数,m为模,tail为待处理内存尺寸的浮点数尾数。
[0158] 可选地,分组模块102执行对未取整结果进行调整,得到尺寸分组号的方式,包括:
[0159] 计算待处理内存尺寸在其对应的浮点数尾数后的小数;
[0160] 若小数为非0,则对未取整结果进行加1,得到尺寸分组号;
[0161] 若小数为0,则将未取整结果作为尺寸分组号。
[0162] 在另一种可能的实现方式中,分组模块102执行基于模对待处理内存尺寸进行分组,得到待处理内存尺寸对应的尺寸分组号的方式,包括:
[0163] 将待处理内存尺寸转换为浮点数形式,得到浮点数内存尺寸;
[0164] 从浮点数内存尺寸中获取内部编码值,得到浮点整数;
[0165] 对浮点整数中超出尾数后的小数进行非0进位,得到参考浮点整数;
[0166] 按照模截取参考浮点整数中的阶码和尾码,并重组阶码和尾码得到尺寸分组号。
[0167] 可选地,分组模块102执行重组阶码和尾码得到尺寸分组号的方式,包括:
[0168] 按照公式R=(阶码‑J)×m+尾码高T位,对阶码和尾码进行重组,得到尺寸分组号;
[0169] 其中,R为尺寸分组号,m为模,T为待处理内存尺寸对应的浮点数尾数的位数,J为转换系数。
[0170] 可选地,管理模块103执行对设定位域表征同一尺寸分组号的所有内存地址进行统一管理的方式,包括:
[0171] 针对一个待分配内存的目标内存数据,获取目标内存数据的内存尺寸对应的目标尺寸分组号;
[0172] 从全部内存地址中,获取特定位域表征目标尺寸分组号的内存地址组;
[0173] 从内存地址组中获取目标内存地址,并将目标内存数据存储至目标内存地址对应的内存区域处;其中,目标内存地址是内存地址组中与目标内存数据的内存尺寸相匹配且未申请的内存地址,或者,目标内存地址是内存地址组中与目标内存数据的内存尺寸相匹配且已释放的内存地址。
[0174] 可选地,管理模块103执行对设定位域表征同一尺寸分组号的所有内存地址进行统一管理的方式,还包括:
[0175] 当需要目标内存数据的内存尺寸时,通过目标内存地址中设定位域所表征的尺寸分组号,反推目标内存数据的参考尺寸。
[0176] 可选地,管理模块103执行通过目标内存地址中设定位域所表征的尺寸分组号,反推目标内存数据的参考尺寸的方式,包括:
[0177] 获取目标内存地址中设定位域所表征的尺寸分组号;
[0178] 按照公式F'=(m+tail)×2i+1反推目标内存数据的参考尺寸;
[0179] 其中,F'为目标内存数据的参考尺寸,m为模;tail为参考尺寸对应的浮点数尾数,i为参考尺寸的二进制阶数,且tail=R mod m, ,R为尺寸分组号。
[0180] 所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的内存尺寸处理装置100的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0181] 请参照图7,图7示出了本申请实施例提供的电子设备10的方框示意图。电子设备10包括处理器11、存储器12及总线13,处理器11通过总线13与存储器12连接。
[0182] 存储器12用于存储程序,处理器11在接收到执行指令后,执行所述程序以实现上述实施例揭示的内存尺寸处理方法。
[0183] 存储器12可能包括高速随机存取存储器(Random Access Memory,RAM),也可能还包括非易失存储器(non‑volatile memory,NVM)。
[0184] 处理器11可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器11中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器11可以是通用处理器,包括中央处理器(Central Processing Unit,CPU)、微控制单元(Microcontroller Unit,MCU)、复杂可编程逻辑器件(Complex Programmable Logic Device,CPLD)、现场可编程门阵列(Field Programmable Gate Array,FPGA)、嵌入式ARM等芯片。
[0185] 本申请实施例还提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器11执行时实现上述实施例揭示的内存尺寸处理方法。
[0186] 综上所述,本申请实施例提供的一种内存尺寸处理方法、装置、电子设备及存储介质,对于任意一个待处理内存尺寸,利用为内存尺寸分组所设定的模对该待处理内存尺寸进行分组,来得到该待处理内存尺寸对应的尺寸分组号,由于模表征相邻两个标定内存尺寸之间进行线性平分的刻度,且所有标定内存尺寸满足非线性分布,即,分组后的内存尺寸整体上满足非线性分布,局部细节上又满足线性分布,融合了非线性分组和线性分组的特性,可以保证分组数量既不会过大又不会过小,实现了对内存尺寸的恰当分组;同时,设置内存地址中的设定位域用来表征不同的尺寸分组号,并对设定位域表征同一尺寸分组号的所有内存地址进行统一管理,从而可以将内存尺寸转换为尺寸分组号融入内存地址中传递,节省了函数传参消耗,提高了内存分配性能。
[0187] 以上所述仅为本申请的优选实施例而已,并不用于限制本申请,对于本领域的技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。