一种峰值检测方法、装置、计算机设备和存储介质与流程

allin2023-09-06  125



1.本公开涉及计算机技术领域,具体而言,涉及一种峰值检测方法、装置、计算机设备和存储介质。


背景技术:

2.在大型应用中,通常需要采用大量的应用线程以实现复杂的应用逻辑。每个应用线程的运行都需要为其分配一定大小的内存空间。而针对为每个应用线程分配内存空间的操作,通常采用为每个应用线程分配默认大小的内存空间的方式,例如,为每个线程分配1mb的内存空间。
3.但在实际情况下,存在一定数量的应用线程,只需要小于(甚至远小于)默认大小的内存空间即可正常运行。这样,为每个应用线程均分配默认大小的内存空间的方式,造成了内存空间的浪费。因此,亟需一种检测出每个应用线程在运行所需使用的内存空间的峰值的方法,以提高内存分配的合理性,避免内存空间的浪费。


技术实现要素:

4.本公开实施例至少提供一种峰值检测方法、装置、计算机设备和存储介质。
5.第一方面,本公开实施例提供了一种峰值检测方法,包括:
6.获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从所述堆栈结束地址起,在所述内存空间中设置第一预设大小的可读写空间;所述可读写空间对应的最高地址低于所述堆栈起始地址;
7.在所述线程的执行过程中,确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间;
8.若是,则生成异常信号,基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,并将所述目标空间作为新增加的可读写空间;
9.返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值。
10.在一种可能的实施方式中,在确定所述峰值之后,还包括:
11.将所述峰值反馈给所述应用对应的开发端,以在所述开发端基于接收到的至少一个所述峰值,针对所述线程设置新的内存空间分配程序,所述新的内容空间分配程序用于在新创建所述线程的情况下,为新创建的所述线程分配与至少一个所述峰值相匹配的内存空间。
12.在一种可能的实施方式中,在确定所述峰值之后,还包括:
13.基于所述峰值,更新针对所述线程的内存空间分配程序,并在新创建所述线程的情况下,基于更新后的内存空间分配程序为新创建的所述线程分配与所述峰值相匹配的内存空间。
14.在一种可能的实施方式中,所述基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,包括:
15.利用所述检测机制对所述异常信号中携带的堆栈指针地址进行检测,确定所述堆栈指针地址是否处于所述最高地址和所述堆栈起始地址之间;
16.若是,则基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间。
17.在一种可能的实施方式中,所述方法还包括:
18.在确定所述堆栈指针地址未处于所述最高地址和所述堆栈起始地址之间的情况下,返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,将当前确定的可读写空间作为所述线程所使用的内存空间的峰值。
19.在一种可能的实施方式中,所述基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间,包括:
20.确定位于所述堆栈指针地址和所述最高地址之间的第一内存空间的空间大小;
21.在确定所述第一内存空间的空间大小为第二预设大小的整数倍的情况下,将所述不可读空间中的第一内存空间作为所述目标空间;所述第二预设大小为默认的一个内存页空间的空间大小。
22.在一种可能的实施方式中,所述方法还包括:
23.在确定所述第一内存空间的空间大小与所述第二预设大小的整数倍不匹配的情况下,从所述最高地址起,在所述不可读空间中分割出空间大小大于所述第二预设大小且为所述第二预设大小的最小整数倍的第二内存空间;
24.将所述第二内存空间作为所述目标空间;其中,所述堆栈指针地址指向的堆栈指针地址位于所述目标空间。
25.在一种可能的实施方式中,所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值,包括:
26.在所述当前确定的可读写空间的空间大小大于所述第一预设大小的情况下,将所述当前确定的可读写空间的空间大小作为所述峰值。
27.在一种可能的实施方式中,所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值,包括:
28.在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,将具有所述第一预设大小的可读写空间的空间大小作为所述峰值;或
29.在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,确定所述线程执行完毕时,所述线程的堆栈指针指向的目标堆栈指针地址;
30.将位于所述堆栈结束地址和所述目标堆栈指针地址之间的内存空间的空间大小作为所述峰值。
31.第二方面,本公开实施例还提供一种峰值检测装置,包括:
32.获取模块,用于获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从所述堆栈结束地址起,在所述内存空间中设置第一预设大小的可读写空间;所述可读写空间对应的最高地址低于所述堆栈起始地址;
33.判断模块,用于在所述线程的执行过程中,确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间;
34.分割模块,用于若是,则生成异常信号,基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,并将所述目标空间作为新增加的可读写空间;
35.循环模块,用于返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值。
36.在一种可能的实施方式中,所述装置还包括:
37.反馈模块,用于在确定所述峰值之后,将所述峰值反馈给所述应用对应的开发端,以在所述开发端基于接收到的至少一个所述峰值,针对所述线程设置新的内存空间分配程序,所述新的内容空间分配程序用于在新创建所述线程的情况下,为新创建的所述线程分配与至少一个所述峰值相匹配的内存空间。
38.在一种可能的实施方式中,所述还包括:
39.更新模块,用于在确定所述峰值之后,基于所述峰值,更新针对所述线程的内存空间分配程序,并在新创建所述线程的情况下,基于更新后的内存空间分配程序为新创建的所述线程分配与所述峰值相匹配的内存空间。
40.在一种可能的实施方式中,所述分割模块在所述基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间时,用于利用所述检测机制对所述异常信号中携带的堆栈指针地址进行检测,确定所述堆栈指针地址是否处于所述最高地址和所述堆栈起始地址之间;
41.若是,则基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间。
42.在一种可能的实施方式中,所述分割模块,还用于在确定所述堆栈指针地址未处于所述最高地址和所述堆栈起始地址之间的情况下,返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,将当前确定的可读写空间作为所述线程所使用的内存空间的峰值。
43.在一种可能的实施方式中,所述分割模块,在所述基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间时,用于确定位于所述堆栈指针地址和所述最高地址之间的第一内存空间的空间大小;
44.在确定所述第一内存空间的空间大小为第二预设大小的整数倍的情况下,将所述不可读空间中的第一内存空间作为所述目标空间;所述第二预设大小为默认的一个内存页空间的空间大小。
45.在一种可能的实施方式中,所述分割模块,还用于在确定所述第一内存空间的空间大小与所述第二预设大小的整数倍不匹配的情况下,从所述最高地址起,在所述不可读空间中分割出空间大小大于所述第二预设大小且为所述第二预设大小的最小整数倍的第二内存空间;
46.将所述第二内存空间作为所述目标空间;其中,所述堆栈指针地址指向的堆栈指针地址位于所述目标空间。
47.在一种可能的实施方式中,所述循环模块,在所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值时,用于在所述当前确定的可读写空间的空间大小大于所述第一预设大小的情况下,将所述当前确定的可读写空间的空间大小作为所述峰值。
48.在一种可能的实施方式中,所述循环模块,在所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值时,用于在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,将具有所述第一预设大小的可读写空间的空间大小作为所述峰值;或
49.在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,确定所述线程执行完毕时,所述线程的堆栈指针指向的目标堆栈指针地址;
50.将位于所述堆栈结束地址和所述目标堆栈指针地址之间的内存空间的空间大小作为所述峰值。
51.第三方面,本公开可选实现方式还提供一种计算机设备,处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
52.第四方面,本公开可选实现方式还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
53.关于上述峰值检测装置、计算机设备、及计算机可读存储介质的效果描述参见上述峰值检测方法的说明,这里不再赘述。
54.本公开实施例提供的峰值检测方法、装置、计算机设备和存储介质,通过在为线程所分配的内存空间中设置可读写空间,并在确定线程在执行过程中,堆栈指针指向内存空间中可读写空间以外的不可读写空间时,在不可读空间中新分割出目标空间,作为增加的可读写空间以供线程使用的方式,既不影响线程的正常使用,还可以在线程执行完毕时,基于当前确定的可读写空间,准确地确定出线程所使用的内存空间的峰值。进而,可以在重新运行线程时,基于确定出的峰值为线程分配与峰值相匹配的内存空间,既保证了线程的正常运行,还提高了内存空间分配的合理性,避免因分配过大的内存空间而造成内存空间浪费的问题。
55.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
56.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
57.图1示出了本公开实施例所提供的一种峰值检测方法的流程图;
58.图2示出了本公开实施例所提供的一种为线程所分配的内存空间的示意图;
59.图3示出了本公开实施例所提供的一种线程对应的堆栈指针在内存空间中的移动方向示意图;
60.图4示出了本公开实施例所提供的一种标识有可读写空间的内存空间示意图;
61.图5示出了本公开实施例所提供的一种触发异常检测机制的示意图;
62.图6示出了本公开实施例所提供的一种目标空间的示意图;
63.图7示出了本公开实施例所提供的一种峰值检测装置的示意图;
64.图8示出了本公开实施例所提供的一种计算机设备的结构示意图。
具体实施方式
65.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
66.另外,本公开实施例中的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。
67.在本文中提及的“多个或者若干个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
68.经研究发现,在为大型应用中的应用线程分配内存空间时,通常采用为每个应用线程分配默认大小的内存空间的方式,而在实际情况下,存在一定数量的应用线程,只需要小于默认大小的内存空间即可正常运行。这样,不仅造成了内存空间的使用率较低、以及内存分配的合理性较低的问题,还会造成内存空间的浪费。并且,内存分配的不合理,还将导致在同时运行大量应用线程时,内存空间不够使用的问题,继而将引发应用崩溃定的问题,严重影响了应用的使用。因此,亟需一种检测出每个应用线程在运行所需使用的内存空间的峰值的方法,以提高内存分配的合理性,从而避免上述问题。
69.基于上述研究,本公开提供了一种峰值检测方法、装置、计算机设备和存储介质,通过在为线程所分配的内存空间中设置可读写空间,并在确定线程在执行过程中,堆栈指针指向内存空间中可读写空间以外的不可读写空间时,在不可读空间中新分割出目标空间,作为增加的可读写空间以供线程使用的方式,既不影响线程的正常使用,还可以在线程执行完毕时,基于当前确定的可读写空间,准确地确定出线程所使用的内存空间的峰值。进而,可以在重新运行线程时,基于确定出的峰值为线程分配与峰值相匹配的内存空间,既保证了线程的正常运行,还提高了内存空间分配的合理性,避免因分配过大的内存空间而造成内存空间浪费的问题。
70.针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,
因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
71.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
72.为便于对本实施例进行理解,首先对本公开实施例所公开的一种峰值检测方法进行详细介绍,本公开实施例所提供的峰值检测方法的执行主体一般为具有一定计算能力的终端设备或其他处理设备,其中终端设备可以为用户设备(user equipment,ue)、移动设备、用户终端、终端、个人数字处理设备(personal digital assistant,pda)、手持设备、计算机设备等;在一些可能的实现方式中,该峰值检测方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
73.下面以执行主体为应用运行的系统为例对本公开实施例提供的峰值检测方法加以说明。
74.如图1所示,为本公开实施例提供的一种峰值检测方法的流程图,可以包括以下步骤:
75.s101:获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从堆栈结束地址起,在内存空间中设置第一预设大小的可读写空间;可读写空间对应的最高地址低于堆栈起始地址。
76.这里,应用运行的系统例如可以为安卓android系统或ios系统。
77.上述线程为应用中运行的任一线程,一个应用中可以包括大量的线程,用于实现应用中复杂的业务逻辑。应用中包括的各个线程可以并发运行。
78.为应用中运行的线程所分配的内存空间可以为应用对应的总内存空间中的默认大小的内存空间,例如,为应用中运行的线程所分配的内存空间可以应用对应的4g空间中的1mb内存空间、2mb内存空间等等。内存空间可以用于线程的运行,具体的,内存空间也即线程对应的线程栈空间,用于存储线程在运行过程中所调用的栈信息。
79.为线程所分配的内存空间可以用堆栈结束地址(stack_end)和堆栈起始地址(stack_begin)来标识,具体的,位于堆栈结束地址和堆栈起始地址之间的空间即为为线程所分配的内存空间。如图2所示,为本公开实施例所提供的一种为线程所分配的内存空间的示意图,其中,a为应用对应的总内存空间,b位于堆栈结束地址和堆栈起始地址之间,为线程所分配的默认大小的内存空间,b位于a中。其中,堆栈结束地址作为该内存空间的最低地址,堆栈起始地址作为该内存空间的最高地址。
80.由于线程在运行过程中,所调用的各个函数使用的内存空间是从堆栈结束地址开始,向堆栈起始地址进行增长,如此,线程对应的堆栈指针(stack_pointer)指向的地址也可以随着线程的运行,其指向的地址也是从堆栈结束地址开始,向堆栈起始地址移动。如图3所示,为本公开实施例提供的一种线程对应的堆栈指针在内存空间中的移动方向示意图,其中,堆栈指针在为线程所分配的内存空间中的移动方向,即为图3中的目标箭头指示的方向。
81.为与堆栈指针移动方向相匹配,所以可以在具体实施时,从堆栈结束地址起,在内存空间中设置第一预设大小的可读写空间。其中,可读写空间即为内存空间中访问属性为可读写属性的空间。第一预设大小可以为开发人员基于经验设定的空间大小,第一预设大
小小于为线程所分配的内存空间的大小。例如,在为线程所分配的内存空间的空间大小为1mb的情况下,第一预设大小可以为200kb。由于第一预设大小小于为线程所分配的内存空间的大小,所以分配出的可读写空间的对应的最高地址会低于堆栈起始地址。在分配出可读写空间之后,可以将内存空间中除可读写空间以外的空间作为不可读空间,并将不可读空间对应的访问属性设置为不可读写属性。如图4所示,为本公开实施例提供的一种标识有可读写空间的内存空间示意图。其中,白色区域为可读写空间,黑色区域为不可读写空间。
82.示例性的,针对应用中开始运行的任一线程,可以先在应用对应的总内存空间为该线程分配默认大小的内存空间,并确定该默认大小的内存空间对应的堆栈结束地址和堆栈起始地址。之后,可以从该堆栈结束地址开始,按照堆栈指针的移动方向,从内存空间中设置第一预设大小的可读写空间,并将内存空间中除可读写空间以外的空间对应的访问属性设置为不可不可读写属性。
83.s102:在线程的执行过程中,确定线程的堆栈指针是否指向内存空间中的不可读写空间。
84.具体实施时,在线程的执行过程中,将不断调用函数,所调用的各个函数需要使用的内存空间也将增加。具体的,所调用的各个函数使用的内存空间将会按照图3所示的移动方向开始增长。而堆栈指针用于指示线程所调用的函数所使用的内存空间的地址,因此,在线程执行过程中不断调用函数的情况下,堆栈指针指向的地址也将变化。具体的,堆栈指针也将按照图3所示的移动方向进行移动,堆栈指针指向的地址也根据该移动方向将进行增长。
85.进一步的,随着线程的执行,堆栈指针可能会指向不可读写空间,也即表征线程调用的函数需要使用不可读写空间。基于此,可以在线程的执行过程中,持续确定线程的堆栈指针是否指向内存空间中的不可读写空间。
86.如果否,则说明堆栈指针一直指向可读写空间,线程也可以利用可读写空间继续正常运行。
87.s103:若是,则生成异常信号,基于异常信号、预先设置的检测机制和堆栈指针地址,在不可读写空间中分割出目标空间,并将目标空间作为新增加的可读写空间。
88.这里,异常信号用于指示线程存在异常。具体的,异常信号可以为sigsegv信号,其中,sigsegv信号是当一个进程执行了一个无效的内存引用,或发生段错误时发送的信号。
89.预设的异常检测机制用于进行异常检测。具体的,预设的异常检测机制可以为预先注册成功的信号处理函数,其中,信号处理函数用于接受异常信号,并对异常信息进行检测。示例性的,信号处理函数可以为linux中的handle_signal函数。
90.上述堆栈指针地址即为线程对应的堆栈指针所指向的地址,该指向的地址为不可读写空间中的位置对应的堆栈地址。目标空间为从不可读写空间中分割出的内存空间,可作为新增加的可读写空间。
91.具体实施时,在堆栈指针指向不可读写空间的情况下,系统可以生成携带堆栈指针地址的sigsegv信号,并利用sigsegv信号触发handle_signal函数。如图5所示,为本公开实施例提供的一种触发异常检测机制的示意图。在sigsegv信号触发handle_signal函数的情况下,可以利用handle_signal函数,对sigsegv信号中的堆栈指针地址进行检测。在确定检测通过的情况下,可以从可读写空间对应的最高地址起,按照堆栈指针的移动方向,从不
可读写空间中分割出目标空间。
92.示例性的,可以预设每次分割的目标空间的空间大小。例如,可以设置每次分割与可读写空间对应的空间大小一致的目标空间,又例如,可以设置每次分割出100kb的目标空间等。其中,上述堆栈指针地址对应的位置,位于分割出的目标空间中。
93.进一步的,在分割出目标空间之后,可以将目标空间对应的访问属性设置为可读写属性,从而实现将目标空间作为新增加的可读写空间,也即实现了对可读写空间的更新。这里,更新后的可读写空间对应的最高地址即为目标空间对应的最高地址。如图6所示,为本公开实施例提供的一种目标空间的示意图,其中,c对应的内存空间为目标空间,d对应的内存空间为可读写空间,c对应的内存空间加上d对应的内存空间,即为更新后的可读写空间。
94.s104:返回执行确定线程的堆栈指针是否指向内存空间中的不可读写空间的步骤,直至线程执行完毕,基于当前确定的可读写空间确定线程所使用的内存空间的峰值。
95.这里,峰值即检测出的、线程在运行过程中所使用的内存空间的最大值。在利用目标空间得到更新后的可读写空间后,由于线程还可以继续执行,其对应的堆栈指针也将继续移动,因此,可以返回执行上述s102,直至线程执行完毕。
96.在线程执行完毕的情况下,线程将会不再调用函数,线程对应的堆栈指针也将不再移动。此时,可以确定当前最新的可读写空间,并将该最新的可读写空间对应的空间大小,作为检测出的线程所使用的内存空间的峰值。
97.这样,通过在为线程所分配的内存空间中设置可读写空间,并在确定线程在执行过程中,堆栈指针指向内存空间中可读写空间以外的不可读写空间时,在不可读空间中新分割出目标空间,作为增加的可读写空间以供线程使用的方式,既不影响线程的正常使用,还可以在线程执行完毕时,基于当前确定的可读写空间,准确地确定出线程所使用的内存空间的峰值。进而,可以在重新运行线程时,基于确定出的峰值为线程分配与峰值相匹配的内存空间,既保证了线程的正常运行,还提高了内存空间分配的合理性,避免因分配过大的内存空间而造成内存空间浪费的问题。
98.在一种实施例中,针对s103中的基于异常信号、预先设置的检测机制和堆栈指针地址,在不可读写空间中分割出目标空间的步骤,可以按照以下步骤实施:
99.s103-1:利用检测机制对异常信号中携带的堆栈指针地址进行检测,确定堆栈指针地址是否处于最高地址和堆栈起始地址之间。
100.这里,由于系统中可以触发生成异常信号的异常可以包括多种,因此,在利用异常信号触发检测机制后,还需要确定该异常信号是否为指示线程的堆栈指针指向不可读写空间的信号。
101.具体实施时,可以利用检测机制对异常信号中携带的堆栈指针地址进行检测,确定堆栈指针地址是否处于当前可读写空间对应的最高地址和堆栈起始地址之间,也即确定该异常信号是否为指示堆栈指针指向内存空间中的不可读写空间的信号。
102.s103-2:若是,则基于堆栈指针地址和最高地址,在不可读写空间中分割出目标空间。
103.示例性的,在确定堆栈指针地址处于当前可读写空间对应的最高地址和堆栈起始地址之间的情况下,可以在位于当前可读写空间对应的最高地址和堆栈指针地址之间的不
可读写空间中分割出目标空间。
104.在一种实施例中,针对s103-2,可以按照以下步骤实施:
105.s103-2-1:确定位于堆栈指针地址和最高地址之间的第一内存空间的空间大小。
106.具体实施时,可以将堆栈指针地址和当前可读写空间对应最高地址之间的不可读写空间作为第一内存空间。然后,可以确定出第一内存空间对应的空间大小。
107.s103-2-2:在确定第一内存空间的空间大小为第二预设大小的整数倍的情况下,将不可读空间中的第一内存空间作为目标空间;第二预设大小为默认的一个内存页空间的空间大小。
108.这里,内存页空间为利用预设分页机制确定出一个具有默认空间大小的内存空间。第二预设大小为一个内存页空间的空间大小。具体的,第二预设大小可以为4kb。在具体实施时,分割出的目标空间对应的空间大小需要为第二预设大小的整数倍,分割出的最小目标空间对应的空间大小可以为第二预设大小。
109.示例性的,在第二预设大小为4kb,第一内存空间的空间大小为16kb的情况下,可以将4kb的第一内存空间作为目标空间。
110.在另一种实施例中,在确定第一内存空间的空间大小与第二预设大小的整数倍不匹配的情况下,从最高地址起,在不可读空间中分割出空间大小大于第二预设大小且为第二预设大小的最小整数倍的第二内存空间。
111.具体实施时,在第一内存空间的空间大小与第二预设大小的整数倍不匹配的情况下,则可以从当前可读写空间对应的最高地址开始,按照堆栈指针的移动方向,从不可读写空间中分割出空间大小大于第二预设大小且为第二预设大小的最小整数倍的第二内存空间。例如,在第二预设大小为4kb,第一内存空间的空间大小为13kb的情况下,可以从当前可读写空间对应的最高地址开始,按照堆栈指针的移动方向,从不可读写空间中分割出16kb的第二内存空间。其中,16kb的第二内存空间中包括13kb的第一内存空间。
112.进一步的,可以将第二内存空间对应的访问属性设置为可读写属性,也即实现将第二内存空间作为目标空间;此时,堆栈指针指向的堆栈指针地址位于目标空间内。
113.在另一种实施例,在确定堆栈指针地址未处于最高地址和堆栈起始地址之间的情况下,可以确定当前触发检测机制的信号非指示堆栈指针指向不可读写空间的信号,继而,也可以确定堆栈指针未指向不可读写空间,线程可以继续运行。因此,可以忽略该异常信号,然后返回执行确定线程的堆栈指针是否指向内存空间中的不可读写空间的步骤,直至线程执行完毕,将当前确定的可读写空间作为线程所使用的内存空间的峰值。
114.在一种实施例中,在确定峰值之后,还可以将峰值反馈给应用对应的开发端,以在开发端基于接收到的至少一个峰值,针对线程设置新的内存空间分配程序,新的内容空间分配程序用于在新创建线程的情况下,为新创建的线程分配与至少一个峰值相匹配的内存空间。
115.示例性的,在对线程对应的峰值进行多次检测之后,可以将每次得到的峰值均反馈给应用对应的开发端。其中,多次检测到的峰值可以相同,可以不同。之后,开发端用户可以根据开发端获取的多个峰值,确定出最终需要为线程分配的内存空间的目标空间大小。例如,可以将将多个峰值中的最大峰值作为需要为线程分配的内存空间的目标空间大小。之后,开发人员可以在开发端,设置用于为线程分配目标空间大小的内存空间的新的内存
空间分配程序。
116.进一步的,在后续新创建该线程时,可以利用新的内存空间分配程序,为新创建的该线程分配目标空间大小的内存空间,而不是分配默认大小的内存空间(如1mb),从而既可以保证线程的正常运行,还可以提高内存空间分配的合理性,避免因分配过大的内存空间而造成内存空间浪费的问题。
117.在另一种实施例中,在确定线程对应的峰值之后,系统还可以基于峰值,直接更新针对线程的内存空间分配程序。其中,更新后的内存空间分配程序用于为新创建的该线程分配峰值大小内存空间。如此,在后续新创建的该线程时,可以基于更新后的内存空间分配程序为新创建的该线程分配与峰值相匹配的内存空间。或者,系统也可以记录检测出的多个峰值,之后,根据多个峰值确定出最合理的目标空间大小,并基于该目标空间大小更新线程对应的内存空间分配程序。之后,可以利用更新后的内存空间分配程序为新创建的该线程分配具有目标空间大小的内存空间。
118.这样,系统直接基于确定出的峰值动态更新内存空间分配程序,提高了更新内存空间分配程序的效率。
119.在一种实施例中,针对s104中的步骤:基于当前确定的可读写空间确定线程所使用的内存空间的峰值,还可以确定当前确定的可读写空间的空间大小是否大于第一预设大小。如果是,则可以直接将当前确定的可读写空间的空间大小作为线程对应的峰值。
120.也即,在线程执行完毕时,判断当前确定出的可读写空间是否为第一预设大小的可读写空间,如果否,则可以直接将当前确定出的可读写空间的空间大小作为线程对应的峰值。
121.在另一种实施例中,在当前确定的可读写空间的空间大小等于第一预设大小的情况下,将具有第一预设大小的可读写空间的空间大小作为峰值。示例性的,若线程执行完毕时,当前确定的可读写空间的空间大小为200kb,则可以确定最初划分的200kb的可读写空间即可供线程正常运行,因此,可以直接将200kb作为线程对应的峰值。
122.或者,在另一种实施方式中,在当前确定的可读写空间的空间大小等于第一预设大小的情况下,可以确定线程执行完毕时,线程的堆栈指针指向的目标堆栈指针地址。进而,可以将位于堆栈结束地址和目标堆栈指针地址之间的内存空间的空间大小作为线程对应的峰值。
123.示例性的,在目标堆栈指针地址对应于最初划分的200kb的可读写空间中的160kb处的位置时,则可以将160kb作为线程对应的峰值。
124.本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
125.基于同一发明构思,本公开实施例中还提供了与峰值检测方法对应的峰值检测装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述峰值检测方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
126.如图7所示,为本公开实施例提供的一种峰值检测装置的示意图,包括:
127.获取模块701,用于获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从所述堆栈结束地址起,在所述内存空间中设置第一预设大小的
可读写空间;所述可读写空间对应的最高地址低于所述堆栈起始地址;
128.判断模块702,用于在所述线程的执行过程中,确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间;
129.分割模块703,用于若是,则生成异常信号,基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,并将所述目标空间作为新增加的可读写空间;
130.循环模块704,用于返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值。
131.在一种可能的实施方式中,所述装置还包括:
132.反馈模块705,用于在确定所述峰值之后,将所述峰值反馈给所述应用对应的开发端,以在所述开发端基于接收到的至少一个所述峰值,针对所述线程设置新的内存空间分配程序,所述新的内容空间分配程序用于在新创建所述线程的情况下,为新创建的所述线程分配与至少一个所述峰值相匹配的内存空间。
133.在一种可能的实施方式中,所述还包括:
134.更新模块706,用于在确定所述峰值之后,基于所述峰值,更新针对所述线程的内存空间分配程序,并在新创建所述线程的情况下,基于更新后的内存空间分配程序为新创建的所述线程分配与所述峰值相匹配的内存空间。
135.在一种可能的实施方式中,所述分割模块703在所述基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间时,用于利用所述检测机制对所述异常信号中携带的堆栈指针地址进行检测,确定所述堆栈指针地址是否处于所述最高地址和所述堆栈起始地址之间;
136.若是,则基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间。
137.在一种可能的实施方式中,所述分割模块703,还用于在确定所述堆栈指针地址未处于所述最高地址和所述堆栈起始地址之间的情况下,返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,将当前确定的可读写空间作为所述线程所使用的内存空间的峰值。
138.在一种可能的实施方式中,所述分割模块703,在所述基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间时,用于确定位于所述堆栈指针地址和所述最高地址之间的第一内存空间的空间大小;
139.在确定所述第一内存空间的空间大小为第二预设大小的整数倍的情况下,将所述不可读空间中的第一内存空间作为所述目标空间;所述第二预设大小为默认的一个内存页空间的空间大小。
140.在一种可能的实施方式中,所述分割模块703,还用于在确定所述第一内存空间的空间大小与所述第二预设大小的整数倍不匹配的情况下,从所述最高地址起,在所述不可读空间中分割出空间大小大于所述第二预设大小且为所述第二预设大小的最小整数倍的第二内存空间;
141.将所述第二内存空间作为所述目标空间;其中,所述堆栈指针地址指向的堆栈指
针地址位于所述目标空间。
142.在一种可能的实施方式中,所述循环模块704,在所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值时,用于在所述当前确定的可读写空间的空间大小大于所述第一预设大小的情况下,将所述当前确定的可读写空间的空间大小作为所述峰值。
143.在一种可能的实施方式中,所述循环模块704,在所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值时,用于在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,将具有所述第一预设大小的可读写空间的空间大小作为所述峰值;或
144.在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,确定所述线程执行完毕时,所述线程的堆栈指针指向的目标堆栈指针地址;
145.将位于所述堆栈结束地址和所述目标堆栈指针地址之间的内存空间的空间大小作为所述峰值。
146.关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上述方法实施例中的相关说明,这里不再详述。
147.基于同一技术构思,本技术实施例还提供了一种计算机设备。参照图8所示,为本技术实施例提供的一种计算机设备的结构示意图,包括:
148.处理器81、存储器82和总线83。其中,存储器82存储有处理器81可执行的机器可读指令,处理器81用于执行存储器82中存储的机器可读指令,所述机器可读指令被处理器81执行时,处理器81执行下述步骤:s101:获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从堆栈结束地址起,在内存空间中设置第一预设大小的可读写空间;可读写空间对应的最高地址低于堆栈起始地址;s102:在线程的执行过程中,确定线程的堆栈指针是否指向内存空间中的不可读写空间;s103:若是,则生成异常信号,基于异常信号、预先设置的检测机制和堆栈指针地址,在不可读写空间中分割出目标空间,并将目标空间作为新增加的可读写空间以及s104:返回执行确定线程的堆栈指针是否指向内存空间中的不可读写空间的步骤,直至线程执行完毕,基于当前确定的可读写空间确定线程所使用的内存空间的峰值。
149.上述存储器82包括内存821和外部存储器822;这里的内存821也称内存储器,用于暂时存放处理器81中的运算数据,以及与硬盘等外部存储器822交换的数据,处理器81通过内存821与外部存储器822进行数据交换,当计算机设备运行时,处理器81与存储器82之间通过总线83通信,使得处理器81在执行上述方法实施例中所提及的执行指令。
150.本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的峰值检测方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
151.本公开实施例所提供的峰值检测方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的峰值检测方法的步骤,具体可参见上述方法实施例,在此不再赘述。
152.该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机
程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
153.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统和装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
154.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
155.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
156.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
157.若本技术技术方案涉及个人信息,应用本技术技术方案的产品在处理个人信息前,已明确告知个人信息处理规则,并取得个人自主同意。若本技术技术方案涉及敏感个人信息,应用本技术技术方案的产品在处理敏感个人信息前,已取得个人单独同意,并且同时满足“明示同意”的要求。例如,在摄像头等个人信息采集装置处,设置明确显著的标识告知已进入个人信息采集范围,将会对个人信息进行采集,若个人自愿进入采集范围即视为同意对其个人信息进行采集;或者在个人信息处理的装置上,利用明显的标识/信息告知个人信息处理规则的情况下,通过弹窗信息或请个人自行上传其个人信息等方式获得个人授权;其中,个人信息处理规则可包括个人信息处理者、个人信息处理目的、处理方式、处理的个人信息种类等信息。
158.最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。

技术特征:
1.一种峰值检测方法,其特征在于,包括:获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从所述堆栈结束地址起,在所述内存空间中设置第一预设大小的可读写空间;所述可读写空间对应的最高地址低于所述堆栈起始地址;在所述线程的执行过程中,确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间;若是,则生成异常信号,基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,并将所述目标空间作为新增加的可读写空间;返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值。2.根据权利要求1所述的方法,其特征在于,在确定所述峰值之后,还包括:将所述峰值反馈给所述应用对应的开发端,以在所述开发端基于接收到的至少一个所述峰值,针对所述线程设置新的内存空间分配程序,所述新的内容空间分配程序用于在新创建所述线程的情况下,为新创建的所述线程分配与至少一个所述峰值相匹配的内存空间。3.根据权利要求1所述的方法,其特征在于,在确定所述峰值之后,还包括:基于所述峰值,更新针对所述线程的内存空间分配程序,并在新创建所述线程的情况下,基于更新后的内存空间分配程序为新创建的所述线程分配与所述峰值相匹配的内存空间。4.根据权利要求1所述的方法,其特征在于,所述基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,包括:利用所述检测机制对所述异常信号中携带的堆栈指针地址进行检测,确定所述堆栈指针地址是否处于所述最高地址和所述堆栈起始地址之间;若是,则基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间。5.根据权利要求4所述的方法,其特征在于,所述方法还包括:在确定所述堆栈指针地址未处于所述最高地址和所述堆栈起始地址之间的情况下,返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,将当前确定的可读写空间作为所述线程所使用的内存空间的峰值。6.根据权利要求4所述的方法,其特征在于,所述基于所述堆栈指针地址和所述最高地址,在所述不可读写空间中分割出所述目标空间,包括:确定位于所述堆栈指针地址和所述最高地址之间的第一内存空间的空间大小;在确定所述第一内存空间的空间大小为第二预设大小的整数倍的情况下,将所述不可读空间中的第一内存空间作为所述目标空间;所述第二预设大小为默认的一个内存页空间的空间大小。7.根据权利要求6所述的方法,其特征在于,所述方法还包括:在确定所述第一内存空间的空间大小与所述第二预设大小的整数倍不匹配的情况下,从所述最高地址起,在所述不可读空间中分割出空间大小大于所述第二预设大小且为所述
第二预设大小的最小整数倍的第二内存空间;将所述第二内存空间作为所述目标空间;其中,所述堆栈指针地址指向的堆栈指针地址位于所述目标空间。8.根据权利要求1所述的方法,其特征在于,所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值,包括:在所述当前确定的可读写空间的空间大小大于所述第一预设大小的情况下,将所述当前确定的可读写空间的空间大小作为所述峰值。9.根据权利要求1所述的方法,其特征在于,所述基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值,包括:在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,将具有所述第一预设大小的可读写空间的空间大小作为所述峰值;或在所述当前确定的可读写空间的空间大小等于所述第一预设大小的情况下,确定所述线程执行完毕时,所述线程的堆栈指针指向的目标堆栈指针地址;将位于所述堆栈结束地址和所述目标堆栈指针地址之间的内存空间的空间大小作为所述峰值。10.一种峰值检测装置,其特征在于,包括:获取模块,用于获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从所述堆栈结束地址起,在所述内存空间中设置第一预设大小的可读写空间;所述可读写空间对应的最高地址低于所述堆栈起始地址;判断模块,用于在所述线程的执行过程中,确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间;分割模块,用于若是,则生成异常信号,基于所述异常信号、预先设置的检测机制和堆栈指针地址,在所述不可读写空间中分割出目标空间,并将所述目标空间作为新增加的可读写空间;循环模块,用于返回执行确定所述线程的堆栈指针是否指向所述内存空间中的不可读写空间的步骤,直至所述线程执行完毕,基于当前确定的可读写空间确定所述线程所使用的内存空间的峰值。11.一种计算机设备,其特征在于,包括:处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述处理器执行如权利要求1至9任意一项所述的峰值检测方法的步骤。12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被计算机设备运行时,所述计算机设备执行如权利要求1至9任意一项所述的峰值检测方法的步骤。

技术总结
本公开提供了一种峰值检测方法、装置、计算机设备和存储介质,其中,该方法包括:获取为应用中运行的线程所分配的内存空间对应的堆栈结束地址和堆栈起始地址,并从堆栈结束地址起,在内存空间中设置第一预设大小的可读写空间;在线程的执行过程中,确定线程的堆栈指针是否指向内存空间中的不可读写空间;若是,则生成异常信号,基于异常信号、预先设置的检测机制和堆栈指针地址,在不可读写空间中分割出目标空间,并将目标空间作为新增加的可读写空间;返回执行确定线程的堆栈指针是否指向内存空间中的不可读写空间的步骤,直至线程执行完毕,基于当前确定的可读写空间确定线程所使用的内存空间的峰值。的内存空间的峰值。的内存空间的峰值。


技术研发人员:朴英敏
受保护的技术使用者:北京字节跳动网络技术有限公司
技术研发日:2022.04.08
技术公布日:2022/7/5
转载请注明原文地址: https://www.8miu.com/read-12027.html

最新回复(0)