论文部分内容阅读
服务器端程序运行于网络环境下,用户对服务器的请求通常是动态生成的,服务器响应用户请求的解释型语言程序也是动态生成的,无法事先采用编译优化方法,只能以解释执行的方式运行,如Python、JavaScript、NodeJs等程序语言。为了减少程序执行的耗时,提高服务器响应速度,可以采用即时编译技术,在程序执行过程中动态地发现程序中执行频度较高的代码片段,并对这些代码片段进行编译优化,以提高程序的解释执行效率。即时编译技术依据编译粒度的粗细,能够分为基于方法的和基于trace的两种。基于方法的即时编译对整个方法进行编译,即使方法中执行次数较少的程序也需要进行编译,粒度较大。基于trace的即时编译只对程序中执行次数较多的代码片段进行编译,粒度较小。对比基于方法的即时编译技术,基于trace的即时编译技术由于识别的热点代码精度高、粒度小,可以进行更加精细的程序优化,并可以减少编译方法中执行次数较少的程序所造成的开销。基于trace的即时编译技术的核心问题是如何识别出一个频繁执行的热点trace。传统的trace探测策略如基于计数的方法,先识别出程序中的锚点(trace的起始基本块),然后记录下后续执行的基本块作为trace,统计每个trace被执行的次数,超过阈值的trace被识别为热点trace。然而,基于计数的trace探测方法中,探测锚点是非常耗时的。同时,传统的trace探测策略都是针对程序单次执行的,忽略了服务端程序并发执行的特点。序列模式挖掘是数据挖掘的一个重要研究方向,在序列数据库中挖掘频繁出现的子序列作为序列模式。程序解释执行的过程中,按顺序执行的基本块便可以看作是序列数据。并发执行的服务器端程序可以看作是多个基本块序列,即基本块序列数据库。本文提出了一种针对服务端程序的基于序列模式挖掘的trace探测方法,针对基本块序列数据库应用序列模式挖掘算法,识别服务端程序中的热点trace。该方法能够利用服务器端程序并发执行的特点,更为高效的识别trace,从而提升程序执行效率。本研究的主要工作包括接收解释器执行的基本块,并生成基本块序列数据库。提出了一种针对基本块序列的序列模式挖掘算法Pisat,通过Pisat算法识别出基本块序列中的热点trace。同时,对识别出的重复trace进行去重与合并,以减少编译开销。与传统的trace探测策略相比,本研究中的方法无需定义锚点,并且更适合服务器端程序。实验结果表明这种trace探测方法,具有较高的可用性,并有效地提高了trace探测效率。