Page 61 - 《软件学报》2021年第12期
P. 61
张杨 等:基于下推自动机的细粒度锁自动重构方法 3725
6.1 面向锁的优化
[3]
Emmi 等人 提出了一种自动锁分配技术,采用带有原子性规范的注解对程序进行标记,自动推断程序中应
[4]
该获取锁的位置.Kawachiya 等人 提出一种锁保留算法,该算法允许锁被线程保留,当一个线程尝试获得锁操
作时,如果线程保留了该锁,它就不用执行获取锁的原子操作;否则,线程使用传统的方法获得锁. Halpert 等人 [30]
提出了基于组件的锁分配技术,用于分析数据依赖性,自动将具有可调粒度的锁对象分配给临界区.Tamiya
[8]
Onodera 等人 [31] 设计了一种基于锁保留的自旋锁,并使用这种自旋锁替换传统的自旋锁.Arbel 等人 提出了使
用乐观同步替换程序中的一些加锁代码,以减少争用,可以在不牺牲正确性的情况下提高其可扩展性.
[9]
Bavarsad 针对软件事务性内存,提出了两种优化技术来克服全局时钟的开销:第一种技术是读写锁定分配,它
不利用任何中央数据结构来保持事务的一致性,仅当事务成功提交时,此方法才能提高软件事务性内存的性能;
第二种优化技术是一种动态选择基线方案的自适应技术,用来减小读写锁定分配的成本.Gudka [32] 提出了一种
针对 Java 的锁定推断方法,使用锁定推断来实现原子块,该方法可以全面分析 Java 库方法.以上工作的研究目的
与我们相似,通过锁分配、锁保留、原子块等技术减少临界区竞争;而我们使用锁降级、锁分解实现对临界区
的细粒度保护方式,从而减少临界区竞争.
Hofer 等人 [33] 提出了一种通过跟踪 Java 虚拟机中的锁定事件来分析 Java 应用程序中的锁争用的方法,该
方法不仅检测线程在锁上被阻塞情况,还检测是哪个其他线程通过持有该锁来阻止它,并记录它们的调用链.
Tallent [34] 提出了 3 种量化锁争用的方法,可以在低开销的前提下,有效提供锁争用检测精度.Inoue [35] 提出了一个
基于 Java 虚拟机,使用硬件性能计数器来检测应用程序获取锁的位置以及阻塞位置的方法.以上研究是用于揭
示锁争用的原因以及识别锁性能瓶颈的分析工具,我们的研究提出的是一个解决锁争用问题的重构工具.
6.2 自动化的重构工具
Dig 等人提出了一个软件并行化重构工具 CONCURRENCER [36] ,该工具可以将串行的 Java 代码进行并行
化重构,以及面向循环并行化重构的重构工具 Relooper [37] .Wloka 等人 [38] 提出了一个用于把串行程序转变为可
重入的程序的自动重构工具 Reentrancer,从而使程序更易并行化实现.Brown 等人 [39] 提出了一个用于生成并行
程序的重构工具 ParaPhrase,从而增加并行程序的可编程性.以上研究以各种形式实现了重构工具,并很好地实
现了工具的自动化,但都是面向并发程序的自动重构工具,而我们的工具是面向锁的自动重构.
McCloskey [40] 提出了悲观的原子块,在不牺牲性能或兼容性的情况下,保留了类似事务性内存中乐观原子
块的许多优点,并实现了自动重构工具 Autolocker. Schäfer 与 IBM T.J. Watson 研究中心合作设计了一种面向
[5]
Java 显示锁的重构工具 Relocker ,它能将同步锁重构为可重入锁,以及将可重入锁重构为读写锁.与 Relocker
[6]
相比,我们的重构方法引入了锁降级、锁分解模式,使重构的适用性更广.Zhang 等人 提出了一种用于在字节码
级别锁重构方法,由于在字节码层实现,可视性较差一些;我们的重构工作直接在源代码层实现,转换过程更直
[7]
观.Zhang 等人 提出了一个面向邮戳锁的自动重构工具 CLOCK,该重构工具支持优化读锁和锁升级等操作,但
是受限于邮戳锁的非可重入性,适用范围有限.我们的研究面向细粒度锁的重构则不受该限制.
[1]
Tao 等人 提出了针对 Java 程序、根据类属性域划分锁保护域的自动锁分解重构方法,并以 Eclipse 插件
[2]
形式实现了自动重构工具.Yu 等人 在进行优化同步瓶颈的研究中提出了一种锁分解方法,该方法重新构造锁
的依赖关系,使用细粒度的锁来保护不相交的共享变量集,并实现了工具 SyncProf. Greenhouse 等人 [41] 根据类的
功能将对象的状态划分为多个子区域,然后通过不同的锁来保护每个分区锁分解方法.在工业界,得到广泛应用
的重构工具包括集成在 IntelliJ IDEA 上的重构插件 LockSmith [10] 以及一个基于 Eclipse JDT 的并发重构插件 [11] ,
这两个插件都可以实现锁分解、锁合并等重构.以上研究均是通过不同锁对象对类中的方法实现锁分解,我们
的研究是通过读写锁的分离在方法内实现锁分解.
7 总 结
本文提出了一种面向细粒度锁的自动重构方法,该方法结合借助访问者模式分析、别名分析、负面效应分