一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

一种基于逃逸分析的安卓活动管理服务同步负载削减方法

2022-12-06 23:58:48 来源:中国专利 TAG:


1.本发明属于安卓系统技术领域,具体地说,是指一种基于逃逸分析的安卓活动管理服务同步负载削减方法。


背景技术:

2.ams(activity manager service,活动管理服务)是android中最核心的服务之一,主要负责系统中四大组件(activity、service、broadcast receiver、content provider)的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在android系统中有非常重要的作用。而不同的应用活动(activity)在申请ams 服务时,都需要进行关键资源的“上锁/解锁”操作,在系统运行过程中将产生较大的负载。
3.逃逸分析(escape analysis)是一种控制流不敏感的跨函数程序静态分析方法。在逃逸分析算法中,逃逸是这样定义的:当一个变量或者对象在某一方法中分配后,该变量的指针或者引用被返回或者被全局引用,这种情况下,该变量或者对象可以被其他方法或者线程内的对象引用,这种现象叫做指针的逃逸。逃逸分析方法是在指针引用的基础上进行的,是一种跨函数的全局数据流分析方法,直接目的是分析变量或对象的生命周期信息。


技术实现要素:

4.本发明针对安卓系统中当不同应用活动申请ams服务将产生较大负载的问题,提供了一种基于逃逸分析的安卓活动管理服务同步负载削减方法。
5.本发明提供的基于逃逸分析的安卓活动管理服务同步负载削减方法,包括如下步骤:
6.步骤1,对待优化的ams源代码进行基于逃逸分析的静态分析,抽取代码中的对象访问信息,确定每一个同步块的代码范围中所有需要同步的对象;
7.步骤2,根据对象访问信息和每个同步块的同步锁的不同,对同步块进行等价类的划分;将访问对象有交集的同步块划分属于同一个等价类,不同等价类的同步块访问对象集合互不相交;
8.步骤3,根据等价类划分结果,对代码中同步块的同步锁进行重新分配,使得不同等价类使用不同的同步锁,然后输出优化后ams代码。
9.所述的步骤1中,同步块被抽象表示为六元组信息,包括:唯一标识同步块的标识符,同步锁,局部变量集合,全局变量集合,局部函数集合,以及全局函数集合。其中,局部变量集合包括同步块代码中所直接访问的局部变量,包括同步块内部定义的局部变量、同步块中读写的同步块所在函数的局部变量和函数参数变量;全局变量集合包括同步块代码中所访问到的同步块所在类的成员变量以及其他静态类的静态成员变量;局部函数集合包括同步块代码中访问到的同步块所在类成员函数以及静态分析范围之内的其他类成员函数;全局函数集合包括同步块代码中访问到的静态类的静态成员函数、超出静态分析范围之外
的其他类成员函数和库函数。
10.所述的步骤1中,确定同步块的访问对象集合,该集合中记录同步块的代码范围中需要同步的对象,包括:首先,对ams源代码进行静态分析,得到每个同步块和成员函数的元组表示;其中,成员函数表示为七元组信息,包括:函数的标识符,函数的函数名,函数的参数集合,局部变量集合,全局变量集合,局部函数集合以及全局函数集合;然后,对每个同步块,去除不需要同步的局部变量和全局变量,根据同步块的访问对象集合和函数调用关系,将成员函数的访问对象集合并入到同步块中,最终确定同步块的访问对象集合。
11.本发明的优点与积极效果在于:1)本发明方法通过同步锁的优化,使得原本不能并行的同步块可以并行执行,从而显著提高系统的执行效率,有初步的实验数据表明,通过同步锁优化,安卓系统启动阶段的运行时间可以提高10%以上。2)本发明方法,可以在系统部署之前,程序静态分析阶段完成,不增加系统运行时的负载。3)本发明方法,遵循的是“保证正确性”的保守优化原则,优化后的代码语义与优化前一致。
附图说明
12.图1是本发明基于逃逸分析的安卓ams活动管理服务模块同步负载优化方法。图2是本发明实施例中同步块对象访问集合最终的计算结果示意图;图3是本发明实施例中同步块等价类划分情况示意图。
具体实施方式
13.下面将结合附图和实施例对本发明作进一步的详细说明。
14.本发明的一种基于逃逸分析的安卓活动管理服务同步负载削减方法,一个实施例如图1 所示,下面进行具体说明。
15.图1中(1)代表待优化的ams源代码。本发明实施例的优化方法是针对java源代码进行的,输入是待优化的java源代码,经本发明方法产生优化后的java源代码,两者在执行结果上是等效的。
16.图1中(2)对代码进行基于逃逸分析的静态分析。经过静态分析,从待优化代码中抽取出 (3)对象访问信息,具体来说就是对于每一个同步块的代码范围中,都访问了哪些需要同步的对象。
17.图1中(4)根据对象访问信息和每个同步块的同步锁的不同,对同步块进行等价类的划分,得到(5)等价类划分结果。
18.根据等价类划分的结果,(6)对代码中同步块的同步锁进行重新分配,使得不同等价类使用不同的同步锁。通过同步锁的优化,使得原本不能并行的同步块可以并行执行,从而提高系统的执行效率。
19.最终输出优化了同步锁的(7)优化后ams代码。
20.本发明对代码进行优化的静态分析方法以逃逸分析的思想为基础,并结合本发明对代码优化的具体需要做出了必要的修改。
21.为了方便叙述,本发明在抽象表示和相关伪代码描述中使用syncblock来代指同步块,可以使用六元组《id,lock,localvarset,globalvarset,localfunset,globalfunset》来表示,其中各项含义解释如下:
22.·
id是同步块的标识符,可以唯一标识一个同步块。在实际实现过程中,可以使用一个整型数字表示。
23.·
lock表示同步锁。在每个同步块中,同步块的开始部分会使用一个同步锁。在java 程序中,同步锁一般是一个类的对象实例或者是基本数据类的变量,可以是局部变量,也可以是全局变量。在同步块开始执行时,程序会首先检查此同步锁是否可用,如果可用,则继续执行同步块的代码,否则会导致此线程阻塞在此同步锁上;同步块代码执行结束,会释放此同步锁,以允许其他线程对此同步锁的请求。此同步锁只允许同时最多一个线程的访问请求。
24.·
localvarset表示局部变量的集合,具体指的是在此同步块代码中所直接访问的局部变量,包括同步块内部定义的局部变量、同步块中读写的同步块所在函数的局部变量和函数参数变量。在这里需要注意的是,在一个类成员函数内部可能有多个同步块,对于函数内的局部变量可能有多个同步块来访问,但是由于方法内部局部变量存储在栈上,实际执行时,多个同步块所访问的局部变量并不是同一个变量,所以方法内的局部变量仍然属于此处的局部变量集合。
25.·
globalvarset表示全局变量集合,具体包括同步块代码中所访问到的同步块所在类的成员变量、ams源代码中其他静态类的静态成员变量。在此处局部和全局的含义是相对于同步块来说的,对于一个类中的数据成员变量,由于此类中所有同步块均可以访问,所以将其划分为全局变量中。
26.·
localfunset表示局部函数集合,具体包括同步块代码中访问到的同步块所在类成员函数、静态分析范围之内的其他类成员函数。
27.·
globalfunset表示全局函数集合,具体包括同步块代码中访问到的静态类的静态成员函数、超出静态分析范围之外的其他类成员函数和库函数。
28.与同步块类似,成员函数function可以使用七元组《id,funname,paramset,localvarset, globalvarset,localfunset,globalfunset》来表示。各项含义如下:
29.·
id表示函数的标识符,唯一标识一个类内部的成员函数,实现时可以使用一个整型数字表示。
30.·
funname表示函数的函数名。函数名与参数列表paramset配合,在分析时可以用来识别函数调用的具体函数是哪一个。
31.·
paramset表示函数的参数集合。此处的参数指的是函数声明时候的形参,主要指参数类型。此处的参数列表主要用来处理函数调用的时候,对于调用的函数的识别,所以可以省略参数名称。为了不影响分析时对象访问信息的错误,每个参数的定义还会在localvarset中添加一项局部变量。
32.·
其余四项localvarset,globalvarset,localfunset,globalfunset的含义与其在同步块中的含义相同,不同在于所针对的是成员函数内的代码进行分析,此处不再重复叙述。
33.与经典逃逸分析不同的是本发明所指的等价类是对代码中同步块进行划分的等价类,而不是对对象进行划分等价类。因为经典逃逸分析的目的是为了确定方法内的对象是否出现了逃逸从而确定其生存周期,而本发明进行的静态分析的目的是为了确定代码中同步块具体访问了哪些对象,从而根据其访问对象的集合来确定其应该使用的同步锁。经
过等价类划分算法后,可以得到如下的等价类集合:
34.等价类集合:{ec0,ec1,
……
,eci,
……
}。其中eci为编号为i的等价类。
35.等价类eci={syncblock0,syncblock1,
……
,syncblocki,
……
}。syncblocki为等价类 eci中编号为i的同步块。最终等价类划分的结果是同步块的集合,其中访问对象有交集的同步块属于同一个等价类,不同等价类的同步块访问对象集合互不相交。
36.下面结合一个示例代码来具体说明本发明方法中基于等价类的同步块集合的划分。
37.示例代码如下:
38.[0039][0040]
上面是一个简单的java示例代码,代码中有一个类sampleclass,其有4个成员变量,分别是append、work、record、another,共有2个成员函数foo1、foo2,有3个同步块。
[0041]
对上面示例代码进行静态分析,得到如表1所示的解析结果,进而可以得到同步块
的元组表示。
[0042]
表1示例代码解析结果
[0043]
同步块或函数名局部变量集合全局变量集合局部函数集合全局函数集合同步块1len1max_size、appendaddappendφ(空集合)同步块2len2max_size、workrecordφ同步块3i、nanotherφsystem.out.printaddappendiappend、workφφrecordjrecord、workφφ
[0044]
根据前文所述,此处的全局与局部是相对于同步块与成员函数而言的,此处类成员变量可以在各同步块和成员函数之间共享,地位上等同于全局变量,所以划分入全局变量集合。对于对象成员函数的访问,比如append.size(),这种情况属于前文所述的对于对象访问的几种情况中的一种,而不是对于局部函数的访问。同步块1的六元组表示是《1,this,{len1},{append, max_size},{addappend},φ》。同步块2的六元组表示是《2,this,{len2},{work,max_size}, {record},φ》,同步块3的六元组表示是《3,this,{n,i},{another},φ,{system.out.print()}》,此处同步块3访问了库函数system.out.print(),可以判断出此函数的访问并不需要额外的同步操作,虚拟机和操作系统已经屏蔽了具体实现的细节,所以此处对于此函数的访问不会对最后需要同步的访问对象集合的计算结果产生影响。
[0045]
根据表1的结果,需要进一步找出和去除不需要同步的局部变量和全局变量,就可以得到每个同步块和成员函数初步的对象访问集合,结果如表2所示。首先局部变量是分配在运行栈中,是线程独有的,所以线程对于局部变量的访问不需要同步操作。对于全局变量 max_size,因为是final修饰的不可变常量,所以对其访问也不需要同步。
[0046]
表2对象访问集合初步结果
[0047]
同步块或函数名对象访问集合同步块1append同步块2work同步块3anotheraddappendappend、workrecordrecord、work
[0048]
在图2中展示了同步块对象访问集合最终的计算结果。根据表2所述的同步块访问对象集合和函数调用关系图,进一步进行跨函数的分析,可以得到最终结果。在本例中,同步块 1访问了addappend方法,需要将addappend方法的对象访问集合并入到同步块1中。同理,也需要将record方法的对象访问集合并入到同步块2中。在图2中,展示了跨函数分析之后的同步块访问对象集合。同步块1访问的对象集合是{append、work},同步块2访问对象集合是{work、record},同步块3访问的对象集合是{another}。
[0049]
根据图2中的同步块访问对象集合的情况,可以对同步块进行等价类的划分。在图3中展示了同步块等价类划分情况,可以将示例代码中的3个同步块划分成为两个等价类的同步块集合,同步块1和同步块2都访问了对象work,访问对象集合有交集,所以划分到相同的等价类中,而同步块3访问的对象集合与他们都没有交集,所以属于另外一个单独的等价
类。
[0050]
经过实验数据表明,通过同步锁优化,安卓系统启动阶段的运行时间可以提高10%以上。因此,可以证明本发明方法通过优化同步锁,使得原本不能并行的同步块可以并行执行,从而显著提高系统的执行效率,并且优化后的代码语义与优化前一致。
再多了解一些

本文用于创业者技术爱好者查询,仅供学习研究,如用于商业用途,请联系技术所有人。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献