首页 / 专利库 / 软件 / 软件回归测试 / 一种面向细粒度读写锁的软件自动重构方法及装置

一种面向细粒度读写软件自动重构方法及装置

阅读:305发布:2020-05-15

专利汇可以提供一种面向细粒度读写软件自动重构方法及装置专利检索,专利查询,专利分析的服务。并且本 发明 公开一种面向细粒度读写 锁 的 软件 自动重构方法,特别涉及升级锁、降级锁、写锁、读锁、优化读锁的自动重构方法,其包括:采用 别名 分析、 访问 者模式分析和可重入分析等程序分析技术对重构前置条件进行检验;采用负面效应分析对代码 块 中的读写操作进行分析,形成读写操作序列串;定义用于识别读写操作序列串的有限自动机,并对代码块使用哪一种锁进行推断;在源代码抽象语法树上完成锁的重构,通过一致性检验确保重构前后程序行为的一致性;本发明实现了从粗粒度同步锁向细粒度读写锁的转换,达到节省程序开发者的工作量、加快程序转换效率的目的,进而帮助开发者了解程序使用哪一种锁的性能较好,本发明主要用于并发程序的同步管理中。,下面是一种面向细粒度读写软件自动重构方法及装置专利的具体信息内容。

1.一种面向细粒度读写软件自动重构方法,其特征在于,包括:
在重构之前进行前置条件检查,检查并分析是否满足重构的条件;
进行锁推断,推断代码使用读锁、写锁、升级锁、降级锁或优化读锁;
在抽象语法树上完成锁的重构转换,对重构前后的程序进行程序行为的一致性检验。
2.根据权利要求1所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,所述重构的条件包括锁是否具有可重入性、是否包含影响转换的线程通信操作,当锁具有可重入性或者包含线程通信操作时,则不满足重构的条件,否则可以进行重构。
3.根据权利要求2所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,所述锁是否具有可重入性的分析方法为分别对同步方法和同步块进行操作,具体包括:
分别对同步方法和同步块进行操作:在对同步方法分析时,对同步方法中包含的同步块也进行重入性分析;在对同步块进行分析时,对同步块中对同步方法的调用进行重入性分析。
4.根据权利要求1所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,进行锁推断的方法包括:采用负面效应分析方法对代码块中每个语句进行读写操作分析,先生成读写操作序列串,再采用有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断。
5.根据权利要求4所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,所述读写操作序列串的生成方法包括:
通过负面效应分析方法,分析代码块中每一条语句的读写操作,每一个对静态属性、实例属性和堆内存的写入语句都在操作序列串的结尾加上写操作标志w,每一个对属性或变量进行读操作的语句都在操作序列串的结尾加上读操作标志r,当代码块中还有对其他方法调用的语句时,则需对这些方法进行负面效应分析。
6.根据权利要求4所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,所述有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断的方法包括:
针对升级锁、降级锁、写锁、读锁和优化读锁分别定义了相应的有限自动机,即对于写锁,至少包含一个写操作;对于读锁,至少包含一个读操作,后面可跟若干个读操作;对于降级锁,指写锁降级为读锁,对应的自动机为写操作后面跟若干个读操作;对于升级锁,首先判断是否为读操作,然后判断是否存在if语句操作,以及if语句中是否包含写操作;对于优化读锁,判定是否对类的属性进行了读操作。
7.根据权利要求1所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,在抽象语法树上完成锁的重构转换的方法包括:生成程序源代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览。
8.根据权利要求1所述的一种面向细粒度读写锁的软件自动重构方法,其特征在于,对重构前后的程序进行程序行为的一致性检验的方法包括:采用回归测试的方法对重构前后的程序进行测试。
9.一种面向细粒度读写锁的软件自动重构装置,其特征在于,其包括前置条件检查组件、软件分析组件、锁推断组件、重构转换组件和重构一致性检验组件,通过前置条件检查组件、锁推断组件、重构转换组件和重构一致性检验组件之间依次数据配合,以及软件分析组件获取程序中锁的相关信息,完成从同步锁到细粒度读写锁的自动重构。
10.根据权利要求9所述的一种面向细粒度读写锁的软件自动重构装置,其特征在于,所述前置条件检查组件,用于在重构之前检查是否满足重构的条件,是否可以进行重构;
所述软件分析组件,用于获取程序中锁的相关信息,用于对程序代码进行控制流分析、数据流分析、可重入分析、别名分析和/或负面效应分析;
所述锁推断组件,用于推断代码块使用哪种锁;
所述重构转换组件,用于进行程序转换,转换前生成程序代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,重构转换时,引入要替换锁的包,在当前类中生成锁属性,替换目标锁结构;
所述重构一致性检验组件,用于对重构前后的程序行为进行一致性检验。

说明书全文

一种面向细粒度读写软件自动重构方法及装置

技术领域

[0001] 本发明涉及一种面向细粒度读写锁的软件自动重构方法及装置,其属于计算机软件维护和演化领域。

背景技术

[0002] 随着多核处理器的普及和众核处理器的不断发展,并行编程将会被越来越多的普通程序员使用,然而在并行编程过程中经常会出现由于多线程同时访问造成数据竞争问题,因此需要对并发访问的数据进行同步控制,以保证数据访问正确性。
[0003] 锁是目前并行编程领域一种典型的的同步控制方式,在访问前通过加锁保证只有一个线程操作共享数据,访问结束后再进行解锁。目前程序员在使用锁时大多数都趋向于单一的使用粗粒度的同步锁,这种加锁方式虽然简单和易于使用,但可能会影响程序性能,而且在多核时代容易引起锁竞争问题。
[0004] 软件自动重构是不需要程序开发人员手动操作的情况下自动的将程序中的某一结构转换为另一种结构,程序的外部语义没有变化。软件重构在早期主要用于提升软件的可维护性,近几年,将软件重构和并行编程结合除了用于提升软件的可维护性外,还用于对软件内部的并发结构进行转换,提升并行程序的性能。目前面向锁的软件重构方法主要面向对于同步锁和可重入锁展开,对于细粒度读写锁的重构支持不足。

发明内容

[0005] 本发明所要解决的技术问题是提供了一种面向细粒度读写锁的软件自动重构方法及装置。
[0006] 为解决上述技术问题,本发明采用如下技术方案:一种面向细粒度读写锁的软件自动重构方法,其包括:
在重构之前进行前置条件检查,检查并分析是否满足重构的条件;
进行锁推断,推断代码使用读锁、写锁、升级锁、降级锁或优化读锁;
在抽象语法树上完成锁的重构转换,对重构前后的程序进行程序行为的一致性检验。
[0007] 进一步的,所述重构的条件包括锁是否具有可重入性、是否包含影响转换的线程通信操作,当锁具有可重入性或者包含线程通信操作时,则不满足重构的条件,否则可以进行重构。
[0008] 进一步的,所述锁是否具有可重入性的分析方法为分别对同步方法和同步块进行操作,具体包括:分别对同步方法和同步块进行操作:在对同步方法分析时,对同步方法中包含的同步块也进行重入性分析;在对同步块进行分析时,对同步块中对同步方法的调用进行重入性分析。
[0009] 进一步的,所述锁是否具有可重入性的分析对象为锁的监视器对象。
[0010] 进一步的,所述重入性分析采用别名分析算法,通过别名分析提升分析的准确性。
[0011] 进一步的,进行锁推断的方法包括:采用负面效应分析方法对代码块中每个语句进行读写操作分析,先生成读写操作序列串,再采用有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断。
[0012] 进一步的,先生成读写操作序列串,再采用有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断,推断过程具有自动型。
[0013] 进一步的,所述读写操作序列串的生成方法包括:通过负面效应分析方法,分析代码块中每一条语句的读写操作,每一个对静态属性、实例属性和堆内存的写入语句都在操作序列串的结尾加上写操作标志w,每一个对属性或变量进行读操作的语句都在操作序列串的结尾加上读操作标志r,当代码块中还有对其他方法调用的语句时,则需对这些方法进行负面效应分析。
[0014] 进一步的,所述有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断的方法包括:针对升级锁、降级锁、写锁、读锁和优化读锁分别定义了相应的有限自动机,即对于写锁,至少包含一个写操作;对于读锁,至少包含一个读操作,后面可跟若干个读操作;对于降级锁,指写锁降级为读锁,对应的自动机为写操作后面跟若干个读操作;对于升级锁,首先判断是否为读操作,然后判断是否存在if语句操作,以及if语句中是否包含写操作;对于优化读锁,判定是否对类的属性进行了读操作。
[0015] 进一步的,在抽象语法树上完成锁的重构转换的方法包括:生成程序源代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览。
[0016] 进一步的,重构转换时,引入要替换锁的包,在当前类中生成锁属性,替换目标锁结构。
[0017] 进一步的,对重构前后的程序进行程序行为的一致性检验的方法包括:采用回归测试的方法对重构前后的程序进行测试。
[0018] 进一步的,对重构前后的程序进行程序行为的一致性检验的方法包括:对重构前和重构后的程序进行分析,分析代码变化的部分,根据一致性检验规则,对重构前后的程序行为的一致性进行检验。
[0019] 进一步的,当重构后的代码中的Boolean、Integer类型的为重用性,或者改变了同步依赖关系时判定违背一致性检验规则。
[0020] 进一步的,所述同步依赖关系的建立依赖于以下4种情况:(1)同步块之间存在嵌套关系;(2)同步方法之间存在调用关系;(3)同步方法中含有同步块;(4)同步块中调用某个同步方法。
[0021] 一种面向细粒度读写锁的软件自动重构装置,其包括前置条件检查组件、软件分析组件、锁推断组件、重构转换组件和重构一致性检验组件,通过前置条件检查组件、锁推断组件、重构转换组件和重构一致性检验组件之间依次数据配合,以及软件分析组件获取程序中锁的相关信息,完成从同步锁到细粒度读写锁的自动重构。
[0022] 进一步的,所述前置条件检查组件,用于在重构之前检查是否满足重构的条件,是否可以进行重构;前置条件检查的内容包括锁是否具有可重入性、是否包含影响转换的线程通信操作;所述软件分析组件,用于获取程序中锁的相关信息,用于对程序代码进行控制流分析、数据流分析、可重入分析、别名分析和/或负面效应分析;
进一步的,所述软件分析组件在程序分析开始时将程序源代码转换为有利于程序分析的中间代码表示形式。
[0023] 所述锁推断组件,用于推断代码块使用哪种锁;在锁推断时采用负面效应分析方法对某一个代码块或同步方法中的读写操作进行分析,根据分析结果形成一个读写操作序列,采用有限自动机对读写操作序列进行识别,推断使用读锁、写锁、升级锁、降级锁或优化读锁;所述重构转换组件,用于进行程序转换,转换前生成程序代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,重构转换时,引入要替换锁的包,在当前类中生成锁属性,替换目标锁结构;
所述重构一致性检验组件,对重构前后的程序行为进行一致性检验,采用回归测试的方法进行重构前后的程序的测试。
[0024] 本发明的有益效果如下:本发明支持由同步锁到细粒度读写锁的自动重构转换,可以避免程序员手动重构引入的错误,节省时间。
[0025] 本发明可以精准的识别程序中的锁,提供软件分析算法和一致性检验,保证重构的正确性。附图说明
[0026] 为了更清楚地说明本发明具体实施方式或现有技术中的技术方案,下面将对具体实施方式或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施方式,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
[0027] 图1为本发明的整体框架图。
[0028] 图2为本发明中可重入性分析算法的流程图
[0029] 图3为本发明中负面效应分析算法的流程图。
[0030] 图4为本发明中基于有限自动机的锁推断方法示意图。
[0031] 图5为本发明中重构转换方法的结构原理框图
[0032] 图6为本发明中一致性检验的结构原理框图。

具体实施方式

[0033] 为使本发明的目的、技术方案和优点更加清楚,下面结合图1-图6和具体实施例对本发明进行清楚、完整的描述。
[0034] 使用细粒度锁是解决锁竞争问题的方法之一,细粒度锁通常只在需要加锁的位置上进行同步控制,可以做到更加精准的同步控制。细粒度读写锁可以包括读锁、写锁、升级锁、降级锁、优化读锁,其中读锁保护只有读操作的代码段,写锁用于保护含有读写操作的代码段,升级锁和降级锁在写锁的基础上进一步定义,升级锁用于将读锁升级为写锁,降级锁用于将写锁降级为读锁,优化读锁用于读写某一个类的属性变量时使用。
[0035] 根据程序内部代码的具体情况来决定使用读锁、写锁、升级锁、降级锁、优化读锁等,可以更细粒度的对同步控制区域进行加锁和解锁操作。目前已有实践表明,并行程序在使用不用锁时获取的性能往往不同,为了最求高性能,程序员需要在实际开发过程中选择一种高性能的锁。
[0036] 软件自动重构是不需要程序开发人员手动操作的情况下自动的将程序中的某一结构转换为另一种结构,程序的外部语义没有变化。软件重构在早期主要用于提升软件的可维护性,近几年,将软件重构和并行编程结合除了用于提升软件的可维护性外,还用于对软件内部的并发结构进行转换,提升并行程序的性能。目前面向锁的软件重构方法主要面向对于同步锁和可重入锁展开,对于细粒度读写锁的重构支持不足,基于此本实施例提出一种面向细粒度读写锁的软件自动重构方法及装置。
[0037] 本实施例中一种面向细粒度读写锁的软件自动重构方法,其包括:在重构之前进行前置条件检查,检查并分析是否满足重构的条件;
进行锁推断,推断代码块使用读锁、写锁、升级锁、降级锁或优化读锁;
在抽象语法树上完成锁的重构转换,对重构前后的程序进行程序行为的一致性检验。
[0038] 进一步的,所述重构的条件包括锁是否具有可重入性、是否包含影响转换的线程通信操作,当锁具有可重入性或者包含线程通信操作时,则不满足重构的条件,否则可以进行重构。
[0039] 进一步的,所述锁是否具有可重入性的分析方法为分别对同步方法和同步块进行操作,具体包括:分别对同步方法和同步块进行操作:在对同步方法分析时,对同步方法中包含的同步块也进行重入性分析;在对同步块进行分析时,对同步块中对同步方法的调用进行重入性分析。
[0040] 进一步的,所述锁是否具有可重入性的分析对象为锁的监视器对象。
[0041] 进一步的,所述重入性分析采用别名分析算法,通过别名分析提升分析的准确性。
[0042] 进一步的,进行锁推断的方法包括:采用负面效应分析方法对代码块中每个语句进行读写操作分析,先生成读写操作序列串,再采用有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断。
[0043] 进一步的,先生成读写操作序列串,再采用有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断,推断过程具有自动型。
[0044] 进一步的,所述读写操作序列串的生成方法包括:通过负面效应分析方法,分析代码块中每一条语句的读写操作,每一个对静态属性、实例属性和堆内存的写入语句都在操作序列串的结尾加上写操作标志w,每一个对属性或变量进行读操作的语句都在操作序列串的结尾加上读操作标志r,当代码块中还有对其他方法调用的语句时,则需对这些方法进行负面效应分析。
[0045] 进一步的,所述有限自动机对代码块使用升级锁、降级锁、写锁、读锁或优化读锁中的一种锁进行推断的方法包括:针对升级锁、降级锁、写锁、读锁和优化读锁分别定义了相应的有限自动机,即对于写锁,至少包含一个写操作;对于读锁,至少包含一个读操作,后面可跟若干个读操作;对于降级锁,指写锁降级为读锁,对应的自动机为写操作后面跟若干个读操作;对于升级锁,首先判断是否为读操作,然后判断是否存在if语句操作,以及if语句中是否包含写操作;对于优化读锁,判定是否对类的属性进行了读操作。
[0046] 进一步的,在抽象语法树上完成锁的重构转换的方法包括:生成程序源代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,找到后在抽象语法树上进行相应的修改,所做的修改保存在一个change对象中,根据change对象生成重构预览。
[0047] 进一步的,重构转换时,引入要替换锁的包,在当前类中生成锁属性,替换目标锁结构。
[0048] 进一步的,对重构前后的程序进行程序行为的一致性检验的方法包括:采用回归测试的方法对重构前后的程序进行测试。
[0049] 进一步的,对重构前后的程序进行程序行为的一致性检验的方法包括:对重构前和重构后的程序进行分析,分析代码变化的部分,根据一致性检验规则,对重构前后的程序行为的一致性进行检验。
[0050] 进一步的,当重构后的代码中的Boolean、Integer类型的为重用性,或者改变了同步依赖关系时判定违背一致性检验规则。
[0051] 进一步的,所述同步依赖关系的建立依赖于以下4种情况:(1)同步块之间存在嵌套关系;(2)同步方法之间存在调用关系;(3)同步方法中含有同步块;(4)同步块中调用某个同步方法。
[0052] 本实施例中一种面向细粒度读写锁的软件自动重构装置,其包括前置条件检查组件、软件分析组件、锁推断组件、重构转换组件和重构一致性检验组件,通过前置条件检查组件、锁推断组件、重构转换组件和重构一致性检验组件之间依次数据配合,以及软件分析组件获取程序中锁的相关信息,完成从同步锁到细粒度读写锁的自动重构。
[0053] 进一步的,所述前置条件检查组件,用于在重构之前检查是否满足重构的条件,是否可以进行重构;前置条件检查的内容包括锁是否具有可重入性、是否包含影响转换的线程通信操作;所述软件分析组件,用于获取程序中锁的相关信息,用于对程序代码进行控制流分析、数据流分析、可重入分析、别名分析和/或负面效应分析;
进一步的,所述软件分析组件在程序分析开始时将程序源代码转换为有利于程序分析的中间代码表示形式。
[0054] 所述锁推断组件,用于推断代码块使用哪种锁;在锁推断时采用负面效应分析方法对某一个代码块或同步方法中的读写操作进行分析,根据分析结果形成一个读写操作序列,采用有限自动机对读写操作序列进行识别,推断使用读锁、写锁、升级锁、降级锁或优化读锁;所述重构转换组件,用于进行程序转换,转换前生成程序代码的抽象语法树,在抽象语法树上查找目标锁结构,获取该锁结构所在的类,重构转换时,引入要替换锁的包,在当前类中生成锁属性,替换目标锁结构;
所述重构一致性检验组件,对重构前后的程序行为进行一致性检验,采用回归测试的方法进行重构前后的程序的测试。
[0055] 在图1中,以使用粗粒度锁的程序作为输入,由于要进行程序分析,所以首先将程序转换为适合于程序分析的中间表示形式,程序分析主要采用访问者模式分析、可重入分析、负面效应分析等软件分析方法,程序分析产生分析结果,分析结果经过锁推断来判断使用读锁、写锁、升级锁、降级锁和优化读锁中的哪一种锁,锁推断会针对每一个同步方法和同步块产生推断的结果。在重构前,首先进行前置条件检查,判断是否可以进行重构,如果通过了重构前置条件检查,则进行重构,重构为相应的锁。重构完成后,针对重构前和重构后的程序进行一致性检验,判断程序的外部行为是否发生改变。
[0056] 前置条件主要用于检查重构是否可以进行、是否适合进行,因为锁分为可重入锁和不可重入锁,为了防止由可重入锁到可重入锁的重构,如图2所示,给出了锁的可重入性分析流程图,以同步方法作为分析对象,首先判断该方法是否为一个同步方法,如果是,则获取当前方法的监视器对象,并放入pointerKey中,利用别名分析判断pointerKey是否和pointerKeySet集合中的元素存在别名,如果没有别名发生,则将pointerKey放入pointerKeySet,然后对方法中调用的其他方法进行判断,如果调用了其他方法,则继续判断该方法是否为同步方法。如果不是一个同步方法,则将对该方法中含有的同步块的语句进行重入性分析。由于同步块可能存在嵌套调用的情况,如果存在嵌套调用,则将instrPointerkey放入堆栈stack和集合pointerKeySet中,方便后面对嵌套调用的情况进行处理。对同步块处理,要获取当前语句的监视器对象pointerKey,并进行别名分析。由于在同步块中也会调用方法,如果存在方法调用语句,则返回上层继续判断该方法中的语句是否存在重入性。如果存在可重入性,则返回true,否则返回false。
[0057] 图3描述了负面效应分析算法流程图,主要对同步方法或同步块中的读写操作进行分析,该方法返回一个读写操作序列,可以以字符串形式存储。如果是对静态变量、数组或堆内存数据进行写入,则将w并入字符串操作序列。如果读变量、静态属性或实例属性,则将r并入字符串操作序列。如果是一个方法调用指令并且调用了wait、notify和notifyAll方法,则将w并入字符串操作序列,最终返回一个读写操作序列的字符串。
[0058] 图4将根据图3的结果采用有限自动机对字符串序列符合的模式进行判定,每一种锁的推断对应一种自动机的字符串识别模式,对于写锁,应至少包含一个写操作;对于读锁,至少要包含一个读操作,后面可以跟若干个读操作;对于降级锁,通常指写锁降级为读锁,故对应的自动机为写操作后面跟若干个读操作;对于升级锁,首先判断是否为读操作,然后判断是否存在if语句操作,以及if语句中是否包含写操作;对于优化读锁,判定是否对类的属性进行了读操作。
[0059] 图5为重构转换的示意图,重构前的程序首先生成抽象语法树,然后查找目标锁在抽象语法树上的位置,找到后对锁进行替换,改变后的代码保存在change对象中,用于生成预览,用户预览结果并根据结果决定是否对源代码进行实质改变。
[0060] 图6是对重构前后的程序进行一致性检验,通过控制流分析、数据流分析和同步依赖分析发现程序中的变化,并检查这些变化是否符合定义的一致性检验规则来判定程序重构前后是否一致。一致性检验规则包括对象的可重用性检测规则、死锁发生规则等。
[0061] 最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈