程序运行方法、装置及设备与流程

文档序号:25543392发布日期:2021-06-18 20:40
程序运行方法、装置及设备与流程

本申请涉及计算机技术领域,尤其涉及一种程序运行方法、装置及设备。



背景技术:

目前,x86-64架构下,指针大小(也即指针长度)为8字节。程序需要通过指针对内存对象进行访问。在企业级存储和大数据领域,内存对象的数量往往非常庞大,保存这些对象的指针所占用的内存也会非常庞大。以10亿个内存对象来计算,指针的内存占用就可以达到8gb之多。

现有技术中,java虚拟机(javavirtualmachine,简称jvm)使用固定字节对齐压缩的方法来压缩指针。其方案为:开启指针压缩时,jvm会按照8字节对齐分配内存,按照8字节为单位寻址,指针长度为4字节,最多可以寻址32gb的内存范围。可见,这种指针压缩方法具有局限性,当jvm的堆内存设置超过32gb时,指针压缩会失效。



技术实现要素:

鉴于上述问题,提出了本申请以提供一种解决上述问题或至少部分地解决上述问题的程序运行方法、装置及设备。

于是,在本申请的一个实施例中,提供了一种程序运行方法。该方法包括:

根据所述程序管理的预设对象数量,确定指针长度;

从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块;

根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量,为所述对象生成所述指针长度的对象指针;所述第二内存块用于分配给其他对象;所述第一内存块以及每一个所述第二内存块的大小均为预设对象大小;所述连续内存空间中已划分出的任意两个相邻的内存块地址连续;

当需要访问所述对象时,根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,获得所述对象的内存地址,以便对所述对象进行访问。

在本申请的另一实施例中,提供了一种程序运行装置。该程序运行装置,包括:

确定模块,用于根据所述程序管理的预设对象数量,确定指针长度;

划分模块,用于从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块;

指针生成模块,用于根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量,为所述对象生成所述指针长度的对象指针;所述第二内存块用于分配给其他对象;所述第一内存块以及每一个所述第二内存块的大小均为预设对象大小;所述连续内存空间中已划分出的任意两个相邻的内存块地址连续;

获取模块,用于当需要访问所述对象时,根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,获得所述对象的内存地址,以便对所述对象进行访问。

在本申请的另一实施例中,提供了一种电子设备。该电子设备,包括:存储器和处理器,其中,

所述存储器,用于存储程序;

所述处理器,与所述存储器耦合,用于执行所述存储器中存储的所述程序,以用于:

根据所述程序管理的预设对象数量,确定指针长度;

从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块;

根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量,为所述对象生成所述指针长度的对象指针;所述第二内存块用于分配给其他对象;所述第一内存块以及每一个所述第二内存块的大小均为预设对象大小;所述连续内存空间中已划分出的任意两个相邻的内存块地址连续;

当需要访问所述对象时,根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,获得所述对象的内存地址,以便对所述对象进行访问。

本申请实施例提供的技术方案中,对象指针经过计算能够得到对象的内存地址,根据对象的内存地址即可对对象进行正常访问。对象指针的指针长度由程序管理的预设对象数量决定,而并非由中央处理器cpu的寻址位数决定,有效压缩了对象指针的指针长度,降低了对象指针所占用的内存量;并且,对象指针的指针长度由程序管理的预设对象数量决定,使得程序管理的所有对象都能够对应上不同的对象指针,有效避免了现有指针压缩方案中因内存设置过大导致的指针压缩失效的情况,具有较好的适用性。

附图说明

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

图1为本申请一实施例提供的程序运行方法的流程示意图;

图2为本申请一实施例提供的对象指针的结构示例图;

图3为本申请一实施例提供的内存划分实例图;

图4为本申请一实施例提供的程序运行装置的结构框图;

图5为本申请另一实施例提供的电子设备的结构框图。

具体实施方式

为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述。显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。

此外,在本申请的说明书、权利要求书及上述附图中描述的一些流程中,包含了按照特定顺序出现的多个操作,这些操作可以不按照其在本文中出现的顺序来执行或并行执行。操作的序号如101、102等,仅仅是用于区分各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。

图1示出了本申请一实施例提供的程序运行方法的流程示意图。如图1所示,该方法包括:

101、根据所述程序管理的预设对象数量,确定指针长度。

102、从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块。

103、根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量,为所述对象生成所述指针长度的对象指针。

其中,所述第二内存块用于分配给其他对象;所述第一内存块以及每一个所述第二内存块的大小均为预设对象大小;所述连续内存空间中已划分出的任意两个相邻的内存块地址连续。

104、当需要访问所述对象时,根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,获得所述对象的内存地址,以便对所述对象进行访问。

上述101中,所述程序具体可包括驱动程序或应用程序。程序管理的预设对象数量可以理解为该程序管理的最大对象数量。实际应用时,预设对象数量可以是由用户事先配置的;或者是根据计算机分配给该程序的内存容量以及预设对象大小计算得到的。内存容量可理解为该程序所能使用的最大内存大小。预设对象大小也即该程序管理的对象大小。通常,对象在内存中包括对象头和实例数据,也即对象大小为其对象头和实例数据大小的总和。在性能有要求的场景中,对象在内存中还可包括对齐填充字节,也即对象大小为其对象头、实例数据以及对齐填充字节大小的总和。

举例来说,程序管理的对象为路由表项。通常,路由设备上会存储路由表;路由表中的每一个表项在本申请中都可以视为一个对象。

在本申请中,指针长度指的是指针的比特位数,指针长度越长,指针的比特位数就越多。指针长度取决于所述程序管理的预设对象数量。这样,程序管理的不同的对象能够对应上不同的对象指针,不存在压缩失效的情况。注:这里的不同的对象指针指的是对象指针的内容不同,以指针长度为3为例,对象指针p1=001;对象指针p2=010;001即为对象指针p1的内容;010即为对象指针p2的内容,这两者内容不同。

具体地,预设对象数量大于2n-1且小于或等于2n时,可将指针长度设置为大于或等于n比特位。这样,即可避免压缩失效。由于指针长度越大,对象指针所占用内存就越大。为了降低内存消耗,在一种可实现的方案中,可将指针长度设置为n比特位。在本实施例中,对象指针的n比特位全部用来表示第二内存块数量。

举例来说:预设对象数量为232(约21.5亿),则可将对象指针长度设置为32比特位,也即4字节,相对于现有技术中8字节的指针减少了一半;再例如:预设对象数量为216,则可将对象指针长度设置为16比特位,也即2字节,相对于现有技术中8字节的指针减少了6字节。

上述102中,上述连续内存空间可以是所述程序在初始化阶段向操作系统申请得到的。在一种可实现的方案中,可根据所述程序管理的预设对象数量以及所述预设对象大小,确定需申请的总内存大小;向操作系统申请大小为所述总内存大小的所述连续内存空间。申请到上述连续内存空间后,记录该连续内存空间的起始地址。

根据对象的对象大小,从连续内存空间中划分出用于分配给对象的第一内存块。也即第一内存块的大小等于对象的对象大小。在实例应用时,对象的对象大小也可以为上述预设对象大小。

上述103中,所述第一内存块以及每一个所述第二内存块的大小均为预设对象大小。所述连续内存空间中已划分出的任意两个相邻的内存块地址连续。两个相邻的内存块地址连续指的是两个相邻的内存块中前一内存块的结束地址与后一内存块的起始地址连续。

在一实例中,连续内存空间中最靠前的第二内存块的起始地址可以为连续内存空间的起始地址。需要补充的是,若第二内存块数量为0,则说明上述第一内存块是上述连续内存中划分出来的第一个内存块,此时,第一内存块的起始地址可以是连续内存空间的起始地址。

根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量,为所述对象生成所述指针长度的对象指针。在一实例中,可将第二内存块数量转换成所述指针长度的二进制数,以作为所述对象的对象指针。

在实际应用时,为对象生成所述指针长度的对象指针后,需要在内存中对其进行保存,以便于后续使用。

104、当需要访问所述对象时,根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,即可计算得到所述对象的内存地址;后续即可根据对象的内存地址对所述对象进行访问。其中,对象的内存地址也即是第一内存块的首地址。

本申请实施例提供的技术方案中,对象指针经过计算能够得到对象的内存地址,根据对象的内存地址即可对对象进行正常访问。对象指针的指针长度由程序管理的预设对象数量决定,而并非由中央处理器cpu的寻址位数决定,有效压缩了对象指针的指针长度,降低了对象指针所占用的内存量;并且,由于对象指针的指针长度由程序管理的预设对象数量决定,使得程序管理的所有对象都能够对应上不同的对象指针,有效避免了现有指针压缩方案中因内存设置过大导致的指针压缩失效的情况,具有较好的适用性。

实际应用时,上述连续内存空间可以为连续虚拟内存空间;上述对象的内存地址可以为对象的虚拟内存地址;可根据对象的虚拟内存地址,通过映射得到对象的物理内存地址,进而进行访问。具体映射原理和过程可参见现有技术,在此不再赘述。并且,在本实施例中,使用虚拟内存技术,还可以减少物理内存的浪费。这是因为:只有虚拟内存地址被首次访问(可理解为首次向申请的内存块写入数据)时,操作系统才会为其分配实际的物理内存空间。

此外,与现有技术中对象的内存地址必须8字节对齐的方案相比,本申请实施例提供的对象指针不要求对象的内存地址固定对齐,所以不会造成内存浪费。并且,与现有技术中的指针压缩方案相比,本申请实施例提供的对象指针不受限于计算机的内存大小的限制,在计算机内存大于32gb时,压缩指针依然有效;并且,现有技术中的指针压缩方案只适用于jvm运行环境,而本申请实施例提供的指针压缩方案适应于任何运行环境,适用性强。

在一种可实现的方案中,上述104中“根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,获得所述对象的内存地址”,可采用如下步骤来实现:

1041、根据所述对象指针,确定所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量。

1042、根据所述第二内存块数量以及所述预设对象大小,确定所述对象在所述连续内存空间中的地址偏移量。

1043、根据所述地址偏移量以及所述连续内存空间的起始地址,获得所述对象的内存地址。

上述1041中,当需要对对象进行访问时,程序可从内存中获取到对象的对象指针。由于对象指针是根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量生成的;故根据对象指针,即可确定出所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量。

上述1042中,所述第二内存块数量与所述预设对象大小的乘积,也即是对象在所述连续内存空间中的地址偏移量。

上述1043中,在连续内存空间的起始地址上加上该地址偏移量,即可得到所述对象的内存地址,也即第一内存块的首地址。

在某些场景中,程序通过计算得到对象的内存地址后,会将内存中存储的对象的对象指针进行删除以便完成相应任务处理,在相应任务处理完成后,又需要对对象的对象指针进行恢复。因此,上述方法,还包括:

105、当所述对象的对象指针被删除后需要恢复时,根据所述对象的内存地址、所述连续内存空间的起始地址以及所述预设对象大小,生成所述对象的对象指针。

具体地,可将对象的内存地址减去连续内存空间的起始地址,得到对象在连续内存空间中的地址偏移量;将地址偏移量除以预设对象大小,得到所述连续内存空间中已划分出的且位于上述第一内存块之前的第二内存块数量;根据第二内存块数量,生成并保存对象指针。在本实施例中,通过反向计算得到了对象的对象指针。

通常,程序运行时,需要设置空指针。对象指针的内容为空指针值时,表示它当时处于闲置状态,没有指向任何有意义的东西。空指针的作用可参考现有技术的空指针,在此不再详述。例如:在定义一个对象指针时,如果先不用就要将其赋值为空指针,不然有可能会随意指向内存对象造成程序崩溃。

因此,上述方法,还包括:

106、定义空指针。

其中,空指针的指针长度与对象指针的指针长度相同。所述空指针中最高比特位与所述对象指针中最高比特位的值不同。且所述对象指针中除最高比特位以外的比特位用于表示所述第二内存块数量。

在一实例中,所述对象指针中最高比特位的值为非零;所述空指针中最高比特位的值为零。

在另一种可实现的方案中,预设对象数量大于2n-1且小于或等于2n时,可将指针长度设置为n+1比特位。在本实施例中,对象指针的低n比特位用来表示第二内存块数量;其中,最高比特位用来表示是否为空指针。

举例来说:预设对象数量为231(约21.5亿),则可将对象指针长度设置为32比特位。在实际应用时,在程序运行的初始化阶段,可以完成所有对象的内存分配,并在物理内存中对所有对象的对象指针进行保存。当然,本申请实施例并不局限于在初始化阶段就完成所有对象的内存分配,也可以在初始化阶段针对部分对象进行内存分配,后续当且仅当没有空闲内存块时,才需要从连续内存空间中继续分配内存。这样,在初始化阶段存储部分对象指针即可,无需存储大量的对象指针,可以减少物理内存的浪费,使得本方案适用性更强。具体地,上述方法,还可包括:

107、判断当前所述连续内存空间中是否存在已划分出的且暂未使用的空闲内存块。

108、当不存在空闲内存块时,执行所述从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块的步骤。

上述107中,暂未使用的空闲内存块可理解为该空间内存块暂未被访问或者为该空间内存块对应的对象暂未被访问。

上述108中,当不存在空闲内存块时,说明划分出来的内存块均被访问了,需要从所述程序申请到的连续内存空间中划分出新的内存块以分配给新的对象。

在性能有要求的场景中,比如cpu需按照缓存行(cacheline)对齐访问对象以提高性能时,可以在对象中填充保留字段以让对象大小对齐于期望大小,以确保所述第一内存块与所述第二内存块的内存地址按照指定字节对齐。一般缓存行大小为64字节,因此,上述指定字节可以为64字节。

在一实例中,上述对象指针可以应用于链表等包含指针型数据的数据结构。

需要说明的是,本方案并不局限于64位操作系统,在64位系统下压缩效果会更明显,在32位系统下也可以按照本申请提供的技术方案进行指针压缩。此外,对象指针适用于对象预分配的场景,即需要从一块连续的内存中连续分配对象的内存的场景。

下面将对本申请实施例提供的程序运行方法进行举例介绍:

假设程序管理的预设对象数量为231,每个对象的大小均为预设对象大小,预设对象大小为64字节。

步骤300、根据程序管理的预设对象数量231确定对象指针的指针长度为32比特,即4字节。

步骤301、根据预设对象数量231以及预设对象大小64字节,申请一片128gb大小的连续虚拟地址空间,以用于分配对象。

步骤302、按照预设对象大小对连续虚拟地址空间进行连续划分,得到多个内存块;并为每个内存块对应的对象生成4字节的对象指针并保存。

为了方便,可将多个内存块从0开始连续编号,每个内存块的编号用于表明连续虚拟内存空间中位于其之前的内存块数量。如图3所示的连续内存空间被划分成用于分别分配给多个对象(object)的多个内存块,箭头401所指的是连续虚拟内存空间的起始地址。

对象指针的结构如图2所示,对象指针长度为32比特,即4字节,相对于8字节的内存地址减少了一半。其中,最高比特位为0时表示是空指针;最高比特位为非0时,低31比特位保存内存块编号(由于一个对象对应一个内存块,故也可称为对象编号)。

步骤303,需要访问对象时,将对象的对象指针中的内存块编号乘以预设对象大小,得到对象的内存块在连续虚拟内存空间中的地址偏移量,将地址偏移量加上401起始地址得到对象的内存地址。

步骤304、在需要反向计算时,将对象的内存地址减去箭头401指向的起始地址,可以得到对象在连续虚拟内存空间中的地址偏移量,地址偏移量除以预设对象大小得到对象的内存块编号,从而生成对象的对象指针。

图4示出了本申请又一实施例提供的程序运行装置的结构框图。如图4所示,该装置包括:

确定模块501,用于根据所述程序管理的预设对象数量,确定指针长度;

划分模块502,用于从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块;

指针生成模块503,用于根据所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量,为所述对象生成所述指针长度的对象指针;所述第二内存块用于分配给其他对象;所述第一内存块以及每一个所述第二内存块的大小均为预设对象大小;所述连续内存空间中已划分出的任意两个相邻的内存块地址连续;

获取模块504,用于当需要访问所述对象时,根据所述连续内存空间的起始地址、所述预设对象大小以及所述对象指针,获得所述对象的内存地址,以便对所述对象进行访问。

可选的,获取模块504,具体用于:

根据所述对象指针,确定所述连续内存空间中已划分出的且位于所述第一内存块之前的第二内存块数量;

根据所述第二内存块数量以及所述预设对象大小,确定所述对象在所述连续内存空间中的地址偏移量;

根据所述地址偏移量以及所述连续内存空间的起始地址,获得所述对象的内存地址。

可选的,指针生成模块503,还用于:

当所述对象的对象指针被删除后需要恢复时,根据所述对象的内存地址、所述连续内存空间的起始地址以及所述预设对象大小,生成所述对象的对象指针。

可选的,所述对象指针中除最高比特位以外的比特位用于表示所述第二内存块数量;

上述装置,还包括:

定义模块,用于定义空指针;其中,所述空指针中最高比特位与所述对象指针中最高比特位的值不同。

可选的,所述对象指针中最高比特位的值为非零;所述空指针中最高比特位的值为零。

可选的,上述装置,还包括:

判断模块,用于判断当前所述连续内存空间中是否存在已划分出的且暂未使用的空闲内存块;

执行模块,用于当不存在空闲内存块时,执行所述从所述程序申请到的连续内存空间中划分出用于分配给对象的第一内存块的步骤。

可选的,所述第一内存块与所述第二内存块的内存地址按照指定字节对齐。

可选的,上述确定模块501,还用于根据所述程序管理的预设对象数量以及所述预设对象大小,确定需申请的总内存大小;

上述装置,还包括:

申请模块,用于向操作系统申请大小为所述总内存大小的所述连续内存空间。

这里需要说明的是:上述实施例提供的程序运行装置可实现上述各方法实施例中描述的技术方案,上述各模块或单元具体实现的原理以及技术效果可参见上述各方法实施例中的相应内容,此处不再赘述。

图5示出了本申请一实施例提供的电子设备的结构示意图。如图5所示,所述电子设备包括存储器1101以及处理器1102。存储器1101可被配置为存储其它各种数据以支持在电子设备上的操作。这些数据的示例包括用于在电子设备上操作的任何应用程序或方法的指令。存储器1101可以由任何类型的易失性或非易失性存储设备或者它们的组合实现,如静态随机存取存储器(sram),电可擦除可编程只读存储器(eeprom),可擦除可编程只读存储器(eprom),可编程只读存储器(prom),只读存储器(rom),磁存储器,快闪存储器,磁盘或光盘。

所述存储器1101,用于存储程序;

所述处理器1102,与所述存储器1101耦合,用于执行所述存储器1101中存储的所述程序,以实现上述各方法实施例提供的程序运行方法。

进一步,如图5所示,电子设备还包括:通信组件1103、显示器1104、电源组件1105、音频组件1106等其它组件。图5中仅示意性给出部分组件,并不意味着电子设备只包括图5所示组件。

相应地,本申请实施例还提供一种存储有计算机程序的计算机可读存储介质,所述计算机程序被计算机执行时能够实现上述各方法实施例提供的程序运行方法的步骤或功能。

以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。

最后应说明的是:以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

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