用于变换在多线程上工作的程序的程序代码的方法和系统转让专利

申请号 : CN201080005431.7

文献号 : CN102292709B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 石崎一明

申请人 : 国际商业机器公司

摘要 :

需要自动确定将要发生由锁冲突引起的性能下降的问题的位置,自动修正该位置的方法。本发明提供将在多线程上工作的程序的程序代码变换为锁冲突少的程序代码的方法。该方法包括:检索步骤,向存储器内读出上述程序代码,从该读出的程序代码检索在同步块内且向对该同步块没有副作用的路径分支的第一条件句;复制步骤,向上述同步块外复制通过上述检索出的第一条件句分支的没有副作用的路径;追加步骤,与上述复制相应地向上述程序代码内追加第二条件句,上述第二条件句是向上述复制的没有副作用的路径分支的条件句。

权利要求 :

1.一种将在多线程上工作的程序的程序代码变换为锁冲突少的程序代码的方法,上述方法包括:检索步骤,向存储器内读出程序代码,从该读出的程序代码检索向一路径分支的第一条件句,所述路径在一同步块内,并且对该同步块没有副作用,没有上述副作用是指基于上述同步块内的语句处理中的值无法由上述同步块外的语句参照;

复制步骤,向上述同步块外复制上述检索出的第一条件句分支所向的没有副作用的路径;

追加步骤,与上述复制相应地在上述程序代码内追加第二条件句,上述第二条件句是向上述复制的没有副作用的路径分支的条件句。

2.根据权利要求1所述的方法,其中,

上述第一条件句包含第一条件式,该第一条件式定义为基于第一变量、常量或第一变量和常量的组合的读出而选择路径,所述第一变量不是仅调用包含所述第一条件句的子例程的例程中为有效范围的变量。

3.根据权利要求2所述的方法,其中,

上述第二条件句包含第二条件式,该第二条件式基于用于存储上述第一条件式的结果的变量,根据上述第一条件式的结果选择路径。

4.根据权利要求3所述的方法,其中,

上述检索步骤包含从上述读出的程序代码进一步检索更新句的步骤,上述更新句在上述同步块内且更新上述第一变量,上述追加步骤包括如下步骤:向从紧接上述检索出的更新句之后到上述同步块结束句为止之间,还追加包含用于存储上述第一条件式的结果的变量和向该变量代入的上述第一条件式的结果的语句。

5.根据权利要求3所述的方法,其中,

上述检索步骤包括如下步骤:从上述读出的程序代码和其他程序代码的至少一个进一步检索更新句,上述更新句在与上述同步块同步的其他同步块内且更新上述第一变量,其中,其他程序代码是从上述读出的程序代码链接的程序代码,上述追加步骤包括如下步骤:向从紧接上述检索出的更新句之后到上述同步块结束句为止之间,还追加包含用于存储上述第一条件式的结果的变量和向该变量代入的上述第一条件式的结果的语句。

6.根据权利要求3所述的方法,其中,

上述追加步骤包括如下步骤:在用于存储上述第一条件式的结果的变量首次被参照的语句之前,还追加初始化变量的语句,该变量用于使用上述第二条件句执行包含上述同步块的路径的值或使用上述第一条件式的结果存储上述第一条件式的结果。

7.根据权利要求2所述的方法,其中,

在上述第一条件式的数量为2以上的情况下,上述2以上的第一条件式的结果通过上述2以上的第一条件式的组合求出。

8.根据权利要求3所述的方法,其中,

在通过上述第一条件式选择的路径的数量为3条以上的情况下,用于存储上述第一条件式的结果的变量与上述3条以上的路径中没有副作用的路径分别对应。

9.根据权利要求3所述的方法,其中,

用于存储上述第一条件式的结果的变量是保证原子性的数据型的变量。

10.根据权利要求1所述的方法,其中,

上述检索步骤包括如下步骤:从上述程序代码和其他程序代码的至少一个进一步检索与上述同步块同步的其他同步块,随着上述检索的结束,执行上述复制步骤。

11.根据权利要求2所述的方法,其中,

上述检索步骤包括如下步骤:还检索包含于上述程序代码和其他程序代码的至少一个且从上述同步块外的语句参照上述第一变量的语句,随着上述检索的结束,执行上述复制步骤。

12.根据权利要求1所述的方法,其中,

在上述同步块内包含启动线程的语句的情况下,

上述检索步骤包括如下步骤:从包含于上述程序代码和其他程序代码的至少一个且记载上述线程的安装的语句,进一步检索与上述同步块内的语句同步地执行的语句,还包括如下步骤:根据检索上述同步地执行的语句,将包含启动上述线程的语句判定为具有副作用的路径。

13.根据权利要求1所述的方法,其中,

在上述同步块内包含启动线程的语句的情况下,

上述检索步骤还包括如下步骤:要求用户判断包含启动上述线程的语句的路径是否为没有副作用的路径。

14.根据权利要求1所述的方法,其中,

在用于确定执行上述同步块的线程的执行顺序的变量在上述同步块内定义的情况下,上述检索步骤包括如下步骤:从上述同步块外进一步检索包含于上述程序代码和其他程序代码的至少一个且参照上述变量的语句,其中,其他程序代码是从上述程序代码链接的程序代码,上述方法还包括如下步骤:根据检索参照上述使用的变量的语句,将包含上述使用的变量的路径判定为具有副作用的路径。

15.根据权利要求1所述的方法,其中,

在用于确定执行上述同步块的线程的执行顺序的变量在上述同步块内定义的情况下,上述检索步骤还包括如下步骤:要求用户判断包含所述变量的路径是否为没有副作用的路径。

16.根据权利要求3所述的方法,其中,

上述追加步骤包括如下步骤:向上述读出的程序代码还追加声明用于存储上述第一条件式的结果的变量的语句,在共有变量包含于上述程序代码和其他程序代码的至少一个且从上述同步块外的语句被访问的情况下,上述声明包含抑制与存储器的访问顺序有关的最优化的指定和保证原子性的指定,上述共有变量包含于没有上述副作用的路径,且能够从多个线程被访问,其中,其他程序代码是从上述程序代码链接的程序代码,在不进行上述访问的情况下,上述声明包含保证原子性的指定。

17.根据权利要求1所述的方法,其中,

上述检索步骤还包括如下步骤:允许用户判断是否具有与上述同步块同步的其他同步块,在上述允许步骤之后,执行上述复制步骤。

18.根据权利要求2所述的方法,其中,

上述检索步骤还包括如下步骤:允许用户判断是否具有参照上述第一变量的语句,在上述允许步骤之后执行上述复制步骤。

19.一种计算机系统,将在多线程上工作的程序的程序代码变换为锁冲突少的程序代码,上述计算机系统包括:检索部,向存储器内读出程序代码,从该读出的程序代码检索向一路径分支的第一条件句,所述路径在在一同步块内,并且对该同步块没有副作用,没有上述副作用是指基于上述同步块内的语句处理中的值无法由上述同步块外的语句参照;

复制部,向上述同步块外复制上述检索出的第一条件句分支所向的没有副作用的路径;

追加部,与上述复制相应地在上述程序代码内追加第二条件句,上述第二条件句是向上述复制出的没有副作用的路径分支的条件句。

20.一种将多线程上工作的程序的程序代码变换为锁冲突少的程序代码的方法,该方法包括:检索步骤,向存储器内读出程序代码,从该读出的程序代码检索向一路径分支的第一条件句,所述路径在一同步块内,并且对该同步块没有副作用,没有上述副作用是指基于上述同步块内的语句处理中的值无法由上述同步块外的语句参照;

复制步骤,向上述同步块外复制上述检索出的第一条件句分支所向的没有副作用的路径;

追加步骤,与上述复制相应地在上述程序代码内追加第二条件句,上述第二条件句是向上述复制的没有副作用的路径分支的条件句,上述第一条件句包含第一条件式,该第一条件式基于实例变量、类变量、常量或它们的组合的读出,在向没有副作用的路径分支的情况下定义为其结果变为true,另一方面,在向具有副作用的路径分支的情况下定义为其结果变为false,上述第二条件句包含第二条件式,该第二条件式基于用于存储上述第一条件式的结果的boolean型的变量,定义为根据上述第一条件式的结果选择路径。

说明书 :

用于变换在多线程上工作的程序的程序代码的方法和系统

技术领域

[0001] 本发明涉及用于将在多线程上工作的程序的程序代码变换为锁冲突少的程序代码的方法及其计算机程序和计算机系统。
[0002] 背景技术
[0003] 近几年,在处理器设计中,正在转向将多个CPU核封入一个中央运算处理装置(下面称CPU:Central Processing Unit)的内部的所谓多核。多核被认为是在外部有一个CPU,但在内部有两个CPU。通过多核,在主要进行并行处理的环境下,能够提高CPU核整体的处理能力,实现系统性能提高。多核使处理器能够同时执行的硬件线程数量飞跃增加。例如,SUN(商标)Niagara2(商标)能够在一个CPU上执行64个线程。
[0004] 在能够同时执行多个线程的处理器上执行以往的程序的情况下,由于锁冲突引起的处理器的性能降低成为问题。在此,所谓锁冲突是在某一线程为了进入需要排他执行的临界区而获得锁的情况下,在其他线程中在上述锁解除之前不执行下一步骤的状态。典型而言,不执行下一步骤的线程成为自旋环(spin loop)或休眠(sleep)状态。 [0005] 发生锁冲突的原因多种多样。例如,考虑从队列取出数据的处理在多个线程频繁执行的程序的情况。此外,考虑在上述程序的程序代码中,在用于记载需要排他执行的处理的同步块中记载有关于上述取出处理的语句。在执行时,上述程序每次调出上述取出处理时都获得锁。因此,频繁地发生锁冲突。所以,由于频繁地发生的锁冲突,可能引起系统性能上的问题。
[0006] 在SUN(商标)BUG DateBase中报告了在能够执行32个硬件线程的 计算机系统中,与上述程序代码相似的构造的程序代码的程序成为系统性能上的瓶颈(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6525425)。通过该报告,具有上述类似构造的程序代码的SUN JDK1.5.013的java.lang.ref.RereferenceQueue类中确认了上述问题。
[0007] 上述类的方法即与上述取出处理对应的poll()方法在SUNJDK1.5.014中修正。在该修正中,在poll()方法的安装中,在关于获得锁的处理的语句之前插入关于判断队列是否为空并在判断为空时退出方法的处理的语句。
[0008] 下述非专利文献1记载:向程序代码附加marked bit,利用该附加的marked bit和compareAndSwap(CAS)命令,由此程序代码能够变形为同时并行性(concurrency)高的程序代码。在下述非专利文献1中,手动进行上述marked bit的附加。
[0009] 非专利文献1:
[0010] Martin Vechev,Eran Yahav,Deriving Linearizable Fine-Grained Concurrent Objects,PLDI’08,ACM 978-1-59593-860-2/08/06,2008年6月7日~13日 发明内容
[0011] 每次发生由锁冲突引起的性能降低的问题时,需要确定其原因,通过人工修正程序代码的作业。但是,从现有的程序代码的量考虑,该作业需要大量工作负荷所以不可能接近。因此,需要自动确定上述问题将要发生的位置,自动修正该位置的方法。 [0012] 本发明提供将在多线程上工作程序的程序代码变换为锁冲突少的程序代码的方法。该方法使计算机系统执行下述步骤。所述步骤包括:
[0013] 检索步骤,向存储器内读出上述程序代码,从该读出的程序代码检索在同步块内且向对该同步块没有副作用的路径分支的第一条件句,没有上述副作用是指基于上述同步块内的语句处理中的值无法由上述同步块外的语句参照;
[0014] 复制步骤,向上述同步块外复制由上述检索出的第一条件句分支的没有副作用的路径;
[0015] 追加步骤,与上述复制相应地在上述程序代码内追加第二条件句,上述第二条件句是向上述复制的没有副作用的路径分支的条件句。
[0016] 通过上述方法,在向没有副作用的路径分支时,不执行同步块内的第一条件句。因此,锁冲突减少。上述方法特别在有一个条件句两个分支的情况下有效。 [0017] 在本发明的一个实施方式中,上述第一条件句包含第一条件式。该第一条件式定义为基于第一变量的读出、常量或这些的组合选择路径。所述第一变量不是仅调用包含所述第一条件句的子例程的例程中为有效范围的变量。
[0018] 本发明的一个实施方式中,上述第二条件句包含基于用于存储上述第一条件式的结果的变量根据上述第一条件式的结果选择路径的第二条件式。
[0019] 本发明的一个实施方式中,上述检索的步骤包含从上述读出的程序代码进一步检索更新句的步骤,上述更新句在上述同步块内且更新上述第一变量,
[0020] 上述追加的步骤包括如下步骤:向从紧接上述检索出的更新句之后到上述同步块结束句为止之间,还追加包含用于存储上述第一条件式的结果的变量和向该变量代入的上述第一条件式的结果的语句。
[0021] 在本发明的一个实施方式中,上述检索步骤包括如下步骤:从上述读出的程序代码和其他程序代码的至少一个进一步检索更新句,上述更新句在与上述同步块同步的其他同步块内且更新上述第一变量,
[0022] 上述追加的步骤包括如下步骤:向从紧接上述检索出的更新句之后到上述同步块结束句为止之间,还追加包含用于存储上述第一条件式的结果的变量和向该相同变量代入的上述第一条件式的结果的语句。
[0023] 在本发明的一个实施方式中,上述追加步骤包括如下步骤:在用于存储上述第一条件式的结果的变量首次被参照的语句之前,还追加初始化变量的语句,该变量用于使用上述第二条件句执行包含上述同步块的路径的 值或使用上述第一条件式的结果存储上述第一条件式的结果。
[0024] 在本发明的一个实施方式中,上述副作用是不容易取消执行结果的处理。 [0025] 在本发明的一个实施方式中,上述副作用是执行线程间的同步的处理、向实例变量代入值的处理、向类变量代入值的处理、执行输入输出的处理、调用本地代码的处理或向表示排列要素的位置的编号代入值的处理。
[0026] 在本发明的一个实施方式中,在上述第一条件式的数量为2以上的情况下,上述2以上的第一条件式的结果通过上述2以上的第一条件式的组合求出。
[0027] 在本发明的一个实施方式中,在通过上述第一条件式选择的路径的数量为3条以上的情况下,用于存储上述第一条件式的结果的变量与上述3条以上的路径中没有副作用的路径分别对应。
[0028] 在本发明的一个实施方式中,用于存储上述第一条件式的结果的变量是保证原子性的数据型的变量。
[0029] 在本发明的一个实施方式中,上述检索步骤包括如下步骤:从上述程序代码和其他程序代码的至少一个进一步检索与上述同步块同步的其他同步块,
[0030] 随着上述检索的结束,执行上述复制步骤。
[0031] 在本发明的一个实施方式中,上述检索步骤包括如下步骤:还检索包含于上述程序代码和其他程序代码的至少一个且从上述同步块外的语句参照上述第一变量的语句, [0032] 随着上述检索的结束,执行上述复制步骤。
[0033] 在本发明的一个实施方式中,在上述同步块内包含启动线程的语句的情况下, [0034] 上述检索步骤包括如下步骤:还从包含于上述程序代码和其他程序代码的至少一个且记载上述线程的安装的语句检索与上述同步块内的语句同步地执行的语句, [0035] 上述方法还使计算机系统执行如下步骤:根据检索上述同步地执行的语句,将包含启动上述线程的语句判定为具有副作用的路径。
[0036] 在本发明的一个实施方式中,在上述同步块内包含启动线程的语句的情况下, [0037] 上述检索步骤还包括如下步骤:要求用户判断包含启动上述线程的语句的路径是否是没有副作用的路径。
[0038] 在本发明的一个实施方式中,在用于确定执行上述同步块的线程的执行顺序的变量在上述同步块内定义的情况下,
[0039] 上述检索步骤包括如下步骤:从上述同步块外进一步检索包含于上述程序代码和其他程序代码的至少一个且参照上述使用的变量的语句,
[0040] 上述方法还使计算机系统执行如下步骤:根据检索参照上述使用的变量的语句,将包含上述使用的变量的路径判定为具有副作用的路径。
[0041] 在本发明的一个实施方式中,在用于确定执行上述同步块的线程的执行顺序的变量在上述同步块内定义的情况下,
[0042] 上述检索步骤还包括如下步骤:要求用户判断包含上述使用的语句的路径是否是没有副作用的路径。
[0043] 在本发明的一个实施方式中,上述追加步骤包括如下步骤:向上述读出的程序代码还追加声明用于存储上述第一条件式的结果的变量的语句,
[0044] 在共有变量包含于上述程序代码和其他程序代码的至少一个且从上述同步块外的语句被访问的情况下,上述声明包含抑制与存储器的访问顺序有关的最优化的指定和保证原子性的指定,上述共有变量包含于没有上述副作用的路径,且能够从多个线程被访问, [0045] 在不进行上述访问的情况下,上述声明包含保证原子性的指定。 [0046] 在本发明的一个实施方式中,上述检索步骤还包括如下步骤:允许用户判断是否具有与上述同步块同步的其他同步块。而且,上述方法使计算机系统在上述允许步骤之后执行上述复制步骤。
[0047] 在本发明的一个实施方式中,上述检索步骤还包括如下步骤:允许用户判断是否具有参照上述第一变量的语句。而且,上述方法使计算机系统在上述允许步骤之后执行上述复制步骤。
[0048] 在本发明的一个实施方式中,在包含于上述第二条件式的变量为指定了抑制与存储器的访问顺序有关的最优化的变量的情况下,在还追加代入 上述第一条件式的结果的语句的步骤中,在紧接上述同步块的结束语句之前,追加代入上述第一条件式的结果的语句。
[0049] 本发明还提供将多线程上工作的程序的程序代码变换为锁冲突少的程序代码的方法。该方法使计算机系统执行如下步骤。该步骤包括:
[0050] 检索步骤,向存储器内读出上述程序代码,从该读出的程序代码检索在同步块内且向对该同步块没有副作用的路径分支的第一条件句,没有上述副作用是指基于上述同步块内的语句处理中的值无法由上述同步块外的语句参照;
[0051] 复制步骤,向上述同步块外复制通过上述检索出的第一条件句分支的没有副作用的路径;
[0052] 追加步骤,与上述复制相应地,在上述程序代码内追加第二条件句,上述第二条件句是向上述复制的没有副作用的路径分支的条件句,
[0053] 上述第一条件句包含第一条件式,该第一条件式基于实例变量或类变量的读出、常量或这些的组合,在向没有副作用的路径分支的情况下定义为其结果变为true,另一方面,在向具有副作用的路径分支的情况下定义为其结果变为false,
[0054] 上述第二条件句包含第二条件式,该第二条件式基于用于存储上述第一条件式的结果的boolean型的变量,定义为根据上述第一条件式的结果选择路径。
[0055] 本发明还提供使计算机执行上述方法的任一种所述的方法的各步骤。 [0056] 本发明还提供将在多线程上工作的程序的程序代码变换为锁冲突少的程序代码的计算机系统。该计算机系统包括:
[0057] 检索部,向存储器内读出上述程序代码,从该读出的程序代码检索在同步块内且向没有对该同步块的副作用的路径分支的第一条件句,没有上述副作用是指基于上述同步块内的语句处理中的值无法由上述同步块外的语句参照;
[0058] 复制部,向上述同步块外复制通过上述检索出的第一条件句分支的没有副作用的路径;
[0059] 追加部,与上述复制相应地,在上述程序代码内追加第二条件句,上 述第二条件句是向上述复制的没有副作用的路径分支的条件句。
[0060] 在本发明的一个实施方式中,上述检索部,从上述读出的程序代码进一步检索更新句,上述更新句在上述同步块内且更新上述第一变量,
[0061] 上述追加部,向从紧接上述检索出的更新句之后到上述同步块结束句为止之间,还追加包含用于存储上述第一条件式的结果的变量和向该变量代入的上述第一条件式的结果的语句。
[0062] 在本发明的一个实施方式中,上述检索部,从上述读出的程序代码和其他程序代码的至少一个进一步检索更新句,上述更新句在与上述同步块同步的其他同步块内且更新上述第一变量,上述追加部,向从紧接上述检索出的更新句之后到上述同步块结束句为止之间,还追加包含用于存储上述第一条件式的结果的变量和向该变量代入的上述第一条件式的结果的语句。
[0063] 在本发明的一个实施方式中,上述追加部,在用于存储上述第一条件式的结果的变量首次被参照的语句之前,还追加初始化变量的语句,该变量用于使用上述第二条件句执行包含上述同步块的路径的值或使用上述第一条件式的结果存储上述第一条件式的结果。
[0064] 在本发明的一个实施方式中,上述检索部,从上述程序代码和其他程序代码的至少一个进一步检索与上述同步块同步的其他同步块,
[0065] 在本发明的一个实施方式中,上述检索部,还检索包含于上述程序代码和其他程序代码的至少一个且从上述同步块外的语句参照上述第一变量的语句,
[0066] 在本发明的一个实施方式中,在上述同步块内包含启动线程的语句的情况下, [0067] 上述检索部,还从包含于上述程序代码和其他程序代码的至少一个且记载上述线程的安装的语句检索与上述同步块内的语句同步地执行的语句,
[0068] 上述计算机系统还包括判定部,该判定部根据检索上述同步地执行的语句,将包含启动上述线程的语句判定为具有副作用的路径。
[0069] 在本发明的一个实施方式中,在上述同步块内包含启动线程的语句的 情况下, [0070] 上述检索部还包括判断部,该判断部允许用户判断包含启动上述线程的语句的路径是否为没有副作用的路径。
[0071] 在本发明的一个实施方式中,在用于确定执行上述同步块的线程的执行顺序的变量在上述同步块内定义的情况下,
[0072] 上述检索部,从上述同步块外进一步检索包含于上述程序代码和其他程序代码的至少一个且参照上述使用的变量的语句,
[0073] 上述计算机系统还包括判定部,该判定部根据检索参照上述使用的变量的语句,将包含启动上述使用的变量的路径判定为具有副作用的路径。
[0074] 在本发明的一个实施方式中,在用于确定执行上述同步块的线程的执行顺序的变量在上述同步块内定义的情况下,
[0075] 上述检索还包括判断部,该判断部允许用户判断包含上述使用的变量的路径是否为没有副作用的路径。
[0076] 在本发明的一个实施方式中,上述追加部,向上述读出的程序代码还追加声明用于存储上述第一条件式的结果的变量的语句,
[0077] 在共有变量包含于上述程序代码和上述其他程序代码的至少一个且从上述同步块外的语句被访问的情况下,上述声明包含抑制与存储器的访问顺序有关的最优化的指定和保证原子性的指定,上述共有变量包含于没有上述副作用的路径,且能够从多个线程被访问,
[0078] 在不进行上述访问的情况下,上述声明包含保证原子性的指定。 [0079] 在本发明的一个实施方式中,上述检索部还包括判断部,该判断部允许用户判断是否具有与上述同步块同步的其他同步块。
[0080] 在本发明的一个实施方式中,上述检索步骤还包括判断部,该判断部允许用户判断是否具有参照上述第一变量的语句。
[0081] 根据本发明的实施方式,从同步块中的第一路径中自动发现虽然没有获得锁但能够执行的第二路径。而且,该发现的第二路径和用于不获得锁而执行第二路径的条件句追加到程序代码中的上述第一路径之外。通过上述追加,程序代码执行时的锁冲突时间减少,能够防止多线程上的CPU效率的降低。

附图说明

[0082] 图1示出本发明实施方式中的、表示用于变换程序代码的系统具有的功能的功能框图。
[0083] 图2示出本发明实施方式中的、图1所示的变换之前的程序代码的例。 [0084] 图3示出本发明实施方式中的、在图1所示的变换程序中执行的处理步骤中取得变换所需的信息的处理步骤的例。
[0085] 图4示出本发明实施方式中的、在图1所示的变换程序中执行的处理步骤中进行变换的处理步骤的例。
[0086] 图5示出本发明实施方式中的、图4所示的步骤317的处理的详细情况。 [0087] 图6示出本发明实施方式中的、用于具体说明图3~图5所示的各步骤的工作所使用的输入数据CL。
[0088] 图7示出本发明实施方式中的、图4所示的步骤316的处理被执行后的方法dequeue()。
[0089] 图8示出本发明实施方式中的、对图6执行图3~图5所示的步骤的处理后的输入数据(变换后的程序代码)。
[0090] 图9示出本发明实施方式中的、用于具体说明图3~图5所示的各步骤的工作所使用的输入数据CL。
[0091] 图10示出本发明实施方式中的、图4所示的步骤316的处理被执行后的方法dequeue()。
[0092] 图11示出本发明实施方式中的、对图9执行图3~图5所示的各步骤的处理的输入数据(变换后的程序代码)。
[0093] 图12示出本发明实施方式中的、由第一条件句选择的路径为三条以上的情况下的、图3~图5所示的各步骤的处理被执行前的程序代码的一部分和被执行后的程序代码的一部分。
[0094] 图13示出本发明实施方式中的、图1的系统具有的计算机硬件的框图。 具体实施方式
[0095] 在本发明的实施方式中,“在多线程上工作的程序的程序代码”是指生成多个被称为线程的处理单位,按每个该生成的线程分配CPU时间,由此能够并行地进行多个处理的程序的源代码。该源代码例如使用Java(商标)语言或C++语言记述。
[0096] 在本发明的实施方式中,“锁”是指当在一个线程执行处理时在其他线程不执行上述处理本身和与上述处理相关的处理。例如,在第一线程开始上述锁的对象的处理的情况下,在第二线程不执行上述处理或与上述处理有关的处理。上述第二线程中的上述处理或与上述处理有关的处理等待直到上述第一线程中的处理结束,在上述结束后可以执行。 [0097] 在本发明的实施方式中,“锁冲突”是指以下状态:由于在一个线程执行的处理为锁的对象,在其他线程执行的上述处理自身以及与上述处理有关的处理等待执行直到在上述第一线程执行的处理结束。此外,“锁冲突少”表示锁冲突发生的频度少以及由锁冲突引起的上述执行等待的时间短。使用本发明的实施方式变换的程序代码与变换前的程序代码相比,锁冲突变少。
[0098] 在本发明的实施方式中,“同步块”是记载有作为上述锁的对象的处理的程序代码上的语句。该程序代码上的语句由同步块的开始句、同步块的结束句以及由上述开始句和结束句包围的语句构成。
[0099] 同步块的开始句在上述程序代码由例如Java(商标)语言记载的情况下,例如为记载synchronized声明的语句或记载由synchronized修饰符修饰的方法名的语句。 [0100] 同样地,在上述程序代码通过例如Java(商标)语言记载的情况下,同步块的结束句为表示上述开始句的结束位置的“}”。
[0101] 子例程的调用包含于由上述开始句和结束句包围的语句(即同步块内)的情况下,记载该子例程的安装的语句可以包含于上述同步块内。为了在记载该子例程的安装的语句中包含其他子例程的调用,子例程的调用成为阶层状的情况下,记载所有子例程的安装语句可以进一步包含于上述同步 块。在此,子例程例如是方法。
[0102] 在本发明的实施方式中,“与同步块同步的其他同步块”是例如通过作为锁的对象的处理被访问的变量通用或指定的锁对象通用的同步块。在此,锁对象是在Java(商标)语言的synchronized声明中指定的变量。例如,在声明第一同步块的synchronized声明中指定锁对象lock且在声明第二同步块的synchronized声明中指定锁对象lock的情况下,第二同步块是与第一同步块同步的其他同步块。此外,在第一同步块是方法且声明第二同步块的synchronized声明中指定表示上述方法的this的情况下,第二同步块是与第一同步块同步的其他同步块。
[0103] 在本发明的实施方式中,“对同步块的副作用”是基于同步块内的语句的处理(处理A)的结果能够由基于同步块外的语句的处理(处理B)参照的处理A。对同步块的副作用还是不容易取消处理结果的处理。对同步块的副作用是例如记载在同步块内的其他同步块内的处理、向实例变量代入值的处理、向类变量代入值的处理、执行输入输出的处理、调用本地代码中包含的处理的处理、或向表示排列要素的位置的编号代入值的处理,但不限定于这些。上述副作用通过例如用户在列表中登记关于上述处理的语句,计算机系统参照在该列表中登记的语句进行判断。
[0104] 上述输入输出,例如是向画面、文件或网络的输入输出,但不限于这些。此外,上述本地代码是由机器语言记载的程序。本地代码例如是汇编完成的程序。包含于本地代码的处理例如由Java Native Interface(JNI)调用。
[0105] 在本实施方式中,“没有对同步块的副作用”是基于同步块内的语句的处理中的值无法由上述同步块外的语句参照。没有副作用是指不是引起副作用的处理,例如不是记载在同步块内的其他同步块内的处理、向实例变量代入值的处理、向类变量代入值的处理、执行输入输出的处理、调用本地代码中包含的处理的处理、或向表示排列要素的位置的编号代入值的处理的任何一种。
[0106] 在本实施方式中,“路径”是与在程序执行时执行的处理对应的程序 代码上的一系列语句。该语句可以是0。
[0107] 在本发明的实施方式中,“对同步块没有副作用的路径”是与在程序执行时对上述同步块没有副作用的处理对应的上述一系列语句。
[0108] 在本发明的实施方式中,“条件句”是在程序中用于实现处理的分支的记载在程序代码上的语句。条件句包括条件式。条件句也可以包含表示选择的路径的范围的记号。程序代码例如由Java(商标)记载的情况下,上述记号是例如“{”和“}”。条件句根据条件式的结果选择执行的路径。程序代码例如由Java(商标)记载的情况下,条件句例如是if语句或switch语句。
[0109] 在本发明的实施方式中,“条件句”是用于选择路径使用的式子。条件式包含变量、常量以及运算符的至少一个。条件句例如为if语句的语句“if(x==0){y=1;}”的情况下,条件式为“(x==0)”。此外,条件句例如为switch语句或select case语句的情况下,将与两句相关的case的值和存储该值的变量进行比较的式子作为条件式。条件句例如为switch语句(switch(x){case 1:y=1;break;})的情况下,条件式为“(x==1)”。 [0110] 对于一个条件句,条件式的数量不一定是一个。
[0111] (1)条件句例如为if语句的语句
[0112] “if(x==0){y=0;}else if(x==1){y=1;}else{y=2}”的情况下,“(x==0)”、“(x==1)”以及“其他”的至少一个可以为条件式。此外,可以组合从多个条件式例如“(x==0)”、“(x==1)”以及“其他”选择的两个以上作为新的条件式。在此,所谓组合是将上述条件式之间例如进行逻辑运算。
[0113] (2)条件句例如为switch语句
[0114]
[0115] 的情况下,“(x==1)”、“(x==2)”以及“其他”的至少一个可以为条件式。此外,可以组合从多个条件式例如“(x==1)”、“(x==2)”以及“其他”选择的两个以上作为新的条件式。
[0116] 在本发明的实施方式中,“第一变量”是用于使第一条件式选择路径的一个变量。“第一变量”例如至多是一个变量。程序代码例如由Java语言记载的情况下,第一变量是一个实例变量或一个类变量。
[0117] 在本发明的实施方式中,“第一条件式的结果”是通过第一条件式或多个第一条件式的组合表示的值。
[0118] (1)条件句例如是if语句的情况下,第一条件式的结果例如用真或假表示。上述真或假可以用与记载程序代码的语言的上述条件式的方式相配合的值表达,或可以用用户确定的值表达。例如,可以将表示真的值设为true,表示假的值设为false,或者表示真的值设为0,表示假的值设为-1。上述表示真或假的值是true或false的情况下,用于存储第一条件式的结果变量例如是boolean型。上述表示真或假的值是0或-1的情况下,用于存储第一条件式的结果变量例如是支持负值的数值型。此外,if语句包含例如elseif语句所以在上述if语句中具有多个第一条件式的情况下,第一条件式的结果可以组合通过多个第一条件式表示的值求出。上述组合是例如对表示条件式的值之间进行逻辑运算。 [0119] (2)条件句例如是switch语句的情况下,第一条件式的结果例如通过表示在switch语句中指定的变量是case句指定的值的值(以下为示值)或与该示值对应的值表示。上述示值例如可以是由上述case句指定的值。上述对应的值例如是用户确定的值。用户在上述对应的值例如使用连续编号。将上述示值作为第一条件式的结果的情况下,用于存储第一条件式的结果的变量是例如与上述指定的变量相同的数据型。此外,第一条件式的结果可以组合多个上述示值或多个上述对应的值求出。上述组合是例如根据上述示值或上述对应的值所取的范围进行分组。
[0120] 在本发明的实施方式中,“保证原子性的数据型变量”是通过一次操作执行向存储器读入变量的数据型的变量,是根据记载程序代码的语言的 方式保证该执行的数据型变量。
[0121] 上述语言例如为Java(商标)语言且上述程序代码在32位以上的OS上执行的情况下,例如boolean型、byte型、short型、int型或float型为保证原子性的数据型。 [0122] 在本发明的实施方式中,“其他程序代码”是从变换前的程序代码链接的程序代码。在此,链接是指例如调用或共有变量,但不限于此。此外,其他程序代码是通过本发明的实施方式能够解析的程序代码。其他程序代码是例如源代码或字节码。 [0123] 在本发明的实施方式中,“抑制与存储器的访问顺序有关的最优化”是汇编变换前的程序代码时,不通过汇编进行与存储器的访问顺序有关的最优化。例如在变换前的程序代码用Java(商标)记载的语言的情况下,抑制最优化的指定用修饰符volatile修饰变量。
[0124] 下面按照附图说明本发明的实施方式。本实施方式用于说明本发明的优选方式,可以理解为没有意图将本发明的范围限定于此处所示例。此外,下面的附图中,只要不是特别说明,相同的标号表示相同的对象。
[0125] 图1示出本发明实施方式中的表示用于变换程序代码的系统具有的功能的功能框图。
[0126] 计算机系统(101)包括:存储器(102)、检索部(103)、复制部(104)、追加部(105)、判定部(106)以及判断部(107)。此外,存储部(108)可以包含于计算机系统(101),或包含于其他系统。
[0127] 计算机系统(101)从存储部(108)向存储器内(102)读出变换前的程序代码(109)。在此,计算机系统(101)可以从存储部(108)向存储器内(102)读出其他程序代码(110)。
[0128] 检索部(103)检索向上述存储器读出的程序代码(109)以及任意其他程序代码(110)。通过该检索,检索部(103)检索在同步块内的第一条件句、更新句、与同步块同步的其他同步块、参照来自同步块外的语句的第一变量的语句、记载与启动线程的同步块内的语句同步地执行的其他线程的安装的语句、或参照用于确定线程的执行顺序的变量的语句。
[0129] 检索部(103)包括判断部(107)。
[0130] 判断部(107)在用于上述检索的信息不充分的情况下,允许用户输入该信息。判断部(107)还为了进一步限定上述检索的条件允许用户输入该条件。
[0131] 判定部(106)从检索部(103)接收检索结果。判定部(106)根据上述检索结果判定程序代码(109)中的没有副作用的路径。
[0132] 复制部(104)将上述判定的没有副作用的路径复制到程序代码(109)的同步块外。
[0133] 追加部(105)将向上述复制的没有副作用的路径分支的第二条件句追加到向上述存储器读出的程序代码(109)。追加部(105)还将包含用于存储第一条件式的结果的变量和代入该变量的上述第一条件式的结果的语句、初始化该变量的语句或声明该变量的语句追加到向上述存储器读出的程序代码(109)。
[0134] 图2示出本发明的实施方式中的图1所示的变换前的程序代码。
[0135] 程序代码(200)是变换前的程序代码。下面以该程序代码(200)为例说明说明书中记载的各用语。
[0136] 与“类”对应的语句是满足格式“class类名{类的安装}”的语句。因此,在变换前的程序代码(200)中与“类”对应的语句是类W(201A)以及类X(201B)。
[0137] 与“方法”对应的语句是满足格式“返回值方法名(参数型参数名)方法的安装}”的语句。因此,在变换前的程序代码(200)中与“方法”对应的语句是方法enqueue(Ww)(202A)以及dequeue()(202B)。此外,在方法内记载的语句中包含其他的方法调用的情况下,记载该其他的方法的安装的语句也作为在上述同步方法内记载的语句处理。 [0138] 与“同步块”对应的语句例如是进行了synchronized块的声明的语句或指定了synchronized修饰符的方法。因此,在变换前的程序代码(200)中与“同步块”对应的语句是第一同步块(203A)、第二同步块(203B)以及第三同步块(203C)。
[0139] “同步块的锁对象”是例如通过上述synchronized块的声明或指定了上述synchronized修饰符的方法的参数指定的变量。因此,第一同步块(203A)的锁对象是w(204A)。第二同步块(203B)的锁对象是lock(204B)。第三同步块(203C)的锁对象是lock(204C)。
[0140] 此外,记载在同步块内的语句中包含方法调用的情况下,记载该方法的安装的语句也作为记载在上述同步块内的语句处理。
[0141] 与“条件句”对应的语句是例如“IF”语句、“SWITCH”语句或记载有“三元运算子”的语句。因此,在变换前的程序代码(200)中与“条件句”对应的语句是第一条件句(205A)、第二条件句(205B)、第三条件句(205C)以及第四条件句(205D)。
[0142] “条件式”是包含于条件分支句用于选择执行路径的式子。因此,第一条件句(205A)的条件式是w.val==null(206A)。第二条件句(205B)的条件式是head==null(206B)。第三条件句(205C)的条件式是head!=null(206C)。第四条件句(205D)的条件式是w.next==w(206D)。
[0143] 在执行了程序代码(200)的情况下,与“路径”对应的语句是存在处理的可能性的语句。例如,方法enqueue(Ww)(202A)被执行结束之前的路径是路径(207A),以及方法dequeue()(202B)被执行结束之前的路径是路径(207B)。
[0144] 此外,条件句被执行结束之前的路径是从开始各自的分支处理的语句到结束各自的分支处理的语句。
[0145] (1)对于第一条件句(205A),在从方法enqueue(Ww)(202A)退出的处理(208A和208B)的下一语句中结束各自的分支的处理。因此,第一条件句(205A)被执行结束之前的路径是在条件式(206A)成立时执行的路径(209A)以及在条件式(206A)不成立时执行的路径(209B)。
[0146] (2)第二条件句(205B)具有与“if(head==null){w.next=w;}else{w.next=head;}”相同的意思。因此,在将w或head代入w.next的处理的下一语句中结束各自的分支的处理。因此,第二条件句(205B)被执行结束之前的路径是在条件式(206B)成立时执行的路径(w.next=w;)以及 在条件式(206B)不成立时执行的路径(w.next=head;)。 [0147] (3)对于第三条件句(205C),在从方法dequeue()(202B)退出的处理(208C和208D)的下一语句结束各自的分支的处理。因此,第三条件句(205C)被执行结束之前的路径是在条件式(206C)成立时执行的路径(209C)以及在条件式(206C)不成立时执行的路径(209D)。
[0148] (4)第四条件句(205D)具有与“if(w.next==w){head=null;}else{head=w.next;}”相同的意思。因此,在将null或w.next代入head的处理的下一语句中结束各自的分支的处理。因此,第四条件句(205D)被执行结束之前的路径是在条件式(206D)成立时执行的路径(head=null;)以及在条件式(206D)不成立时执行的路径(head=w.next;)。
[0149] “第一变量”是用于判断分支的变量。因此,第一条件句(205A)的第一变量是w.val(210A)。第二条件句(205B)的第一变量是head(210B)。第三条件句(205C)的第一变量是head(210C)。第四条件句(205D)的第一变量是w.next(210D)。
[0150] “更新句”是包含上述第一变量的同步块内的语句,是更新上述第一变量的语句。更新w.val(210A)的更新句不包含于包含w.val(210A)的第一同步块(203A)。更新head(210B)的更新句是更新句(211B)。更新head(210C)的更新句是更新句(211C)。更新w.next(210D)的更新句是更新句(211D)。
[0151] 图3~图5示出本发明实施方式的图1所示的变换程序中执行的处理步骤的例子。
[0152] 下面以变换前的程序代码是用Java(商标)语言记载的程序代码的情况为例进行说明。
[0153] 计算机系统(101)将变换前的程序代码(下面称为CL)设为输入数据。计算机系统除了该CL之外,还可以将从上述CL链接的其他程序代码(下面称为其他CL)作为输入数据。在此,输入数据是能够从上述变换程序参照的数据。
[0154] 图3是本发明实施方式的图1所示的变换程序中执行的处理步骤中取 得变换所需的信息的处理步骤的例子。
[0155] 步骤301是上述变换处理的开始。在步骤301中,计算机系统将上述输入数据例如读入存储器。随着该读入结束,该处理进入步骤302。
[0156] 在步骤302中,计算机系统准备用于存储用于上述变换的信息的变量i、集合变量M、集合变量S以及集合变量C。
[0157] 变量i是存储用于识别在下述步骤315中声明的变量(下面为第二变量)的变量。变量i例如使用向上述第二变量分配的连续编号。也可以不准备变量。在不准备变量i的情况下,计算机系统在每次声明第二变量时对第二变量标注能够唯一识别的变量名。上述能够唯一识别的变量名可以例如由用户确定,也可以不重复地随机确定。 [0158] 集合变量是用于集合具有不同意思的数据进行处理的组。集合变量例如用排列或构造体表示。
[0159] 集合变量M按上述每个方法存储关于执行上述CL时处理能够到达的方法的信息的集合变量。上述方法的信息,是能够从程序代码确定记载对应的方法的安装的语句即可。关于上述方法的信息例如是记载方法的安装的语句的开始位置、记载方法的安装的语句的结束位置或者记载方法的安装的语句,但不限于这些。
[0160] 集合变量S按上述每个同步块设定关于分别执行上述方法时处理能够到达的同步块的信息的集合变量。关于上述同步块的信息是同步块的锁对象(下面为S的第一信息)、同步块的程序代码上的开始结束位置(下面为S的第二信息)以及同步块内的语句(下面为S的第三信息)。
[0161] 集合变量C是按每个上述执行路径设定关于包含于各上述同步块的满足预定条件的执行路径的信息的集合变量。关于上述执行路径的信息,是与上述执行路径对应的上述同步块的锁对象(下面为C的第一信息)、与上述执行路径对应的上述同步块的程序代码上的开始结束位置(下面为C的第二信息)以及能够从程序代码确定的上述执行路径的信息(下面为C的第三信息)。上述C的第三信息例如是执行路径的开始位置、执行路径的结束位置、或记载执行路径的语句,但不限于此。
[0162] 计算机系统在变量i、集合变量S和集合变量C的上述准备中向该变量i、该集合变量S和该集合变量C设定初始值。上述初始值例如是表示空的值。计算机系统例如设定0或1作为变量i的初始值。此外,集合变量S和C例如是包含数值型变量和文字型变量的构造体的情况下,计算机系统例如向数值型变量的初始值设定0,向文字型变量的初始值设定NULL作为集合变量S和C的初始值。
[0163] 计算机系统还在集合变量M的上述准备中向上述集合变量M设定关于上述方法的信息。计算机系统检索包含于CL的方法,将关于检索出的方法的信息设定到集合变量M。在上述检索中,可以预先由用户指定设为对象的方法,可以检索包含于CL的所有方法。通过执行包含于CL的方法能够到达的方法例如可以从上述其他CL检索。此外,可以代替上述检索,由用户向集合变量M设定关于上述方法的信息。
[0164] 随着上述准备结束,该处理进入步骤303。
[0165] 步骤303中,表示关于集合变量M的反复开始。
[0166] 步骤303中,计算机系统从集合变量M取出一件关于方法的信息(下面为m)。随着该取出结束,该处理进入步骤304。
[0167] 在步骤304中,计算机系统向集合变量S设定数据。
[0168] 计算机系统检索与上述取出的m对应的方法被执行时处理能够到达的同步块。在上述方法自身是同步块的情况下,上述方法自身也成为被检索的同步块。CL例如是Java(商标)记载的程序代码的情况下,计算机系统例如从上述CL检索“synchronized”。
在与m对应的方法由“synchronized”修饰的情况下,上述修饰的“synchronized”也还是被检索的“synchronized”。
[0169] 计算机系统从该检索出的同步块取得关于上述检索的同步块各自的、锁对象(S的第一信息)、程序代码上的开始结束位置(S的第二信息)以及同步块内的语句(S的第三信息),按每个同步块向集合变量S设定该取得的S的第一~第三信息作为一组信息。关于在检索的同步块中已经检索而设定了信息的同步块,不需要进行上述设定。随着结束上述设定, 该处理进入步骤305。
[0170] 步骤305表示关于集合变量M的反复的结束。
[0171] 在所有m取出完成的情况下,该处理进入步骤306。在存在未取出的m的情况下,该处理返回步骤303。
[0172] 步骤306表示关于集合变量S的反复的开始。
[0173] 步骤306中,计算机系统从集合变量S取出一件关于同步块的上述一组信息(下面为s)。随着该取出结束,该处理进入步骤307。
[0174] 在步骤307中,计算机系统判定在向与上述取出的s对应的集合变量S设定的同步块内的语句(下面为s的第三信息)中是否包含没有发生副作用的路径。该判定在包含于同步块内的语句(s的第三信息)路径且关于各执行的路由的路径(下面为执行路径)的全部中执行。在该判定中,计算机系统例如判定引起记载在下述副作用列表的副作用的原因是否包含于上述执行路径。
[0175] 副作用列表例如预先由用户制作。用户预先将引起副作用的原因例如方法或变量登记到副作用列表。方法例如是关于I/O的方法或JNI的方法。变量例如是实例变量或类变量。计算机系统在上述判定中,在上述执行路径中例如发现了向上述方法或变量写入的情况下,将上述执行路径判定为发生副作用的路径,在没有发现的情况下,将上述执行路径判定为没有发生副作用的路径。上述登记可以自动地通过计算机系统执行。计算机系统例如在步骤302中从上述CL或上述其他CL的至少一个取得引起副作用的原因,将该取得的引起副作用的原因登记到副作用列表。
[0176] 此外,计算机系统通过调查包含于执行路径的变量的种类能够执行上述判定。计算机系统例如通过调查上述变量的声明记载在上述CL的何处或上述变量的范围设定在CL上的哪个范围,能够执行上述判定。
[0177] 在上述执行路径中存在没有发生副作用的路径的情况下,该处理进入步骤308。在上述执行路径全部是发生副作用路径的情况下,该处理进入步骤310。
[0178] 在步骤308中,计算机系统判定不发生上述副作用的执行路径和用于 执行该执行路径的条件句是否满足以下条件。上述条件是上述执行路径包含实例变量或类变量的至多一个的读出,上述条件句评价该读出和常量。
[0179] 在满足条件的条件句存在即使一个的情况下,该处理进入步骤309。在满足条件的条件句不存在的情况下,该处理进入步骤310。
[0180] 在步骤309中,计算机系统关于通过满足上述条件的条件句执行的各路径,分别将作为上述S的第一信息的锁对象(C的第一信息)、作为上述S的第二信息的程序代码上的开始结束位置(C的第二信息)、以及能够从程序代码确定通过满足上述条件的条件句执行的执行路径的信息(C的第三信息)向集合变量C设定作为一组信息。
[0181] 随着上述设定的结束,该处理进入步骤310。
[0182] 在所有s取出完成的情况下,该处理进入步骤311。在存在未取出的s的情况下,该处理返回步骤306。
[0183] 图4示出本发明实施方式中的、图1所示变换程序中执行的处理步骤中进行变换的处理步骤的例子。
[0184] 步骤311示出关于集合变量C的反复的开始。
[0185] 在步骤311中,计算机系统从集合变量C取出一件关于执行路径的上述一组信息(下面为c)。计算机系统从关于通过程序代码早执行的执行路径的信息起依次进行上述取出。随着该取出结束,该处理进入步骤312。
[0186] 在步骤312中,计算机系统判定向与上述取出的c对应的集合变量C设定的锁对象(下面为c的第一信息)是否仅在CL内使用。在该判定中,例如在CL用Java(商标)语言记载的情况下,检查在锁对象(c的第一信息)的定义使用private修饰符或在上述其他CL中不包含使用上述锁对象(c的第一信息)的记载。通过该检查,在锁对象(c的第一信息)的定义使用了private修饰符或在上述其他CL中不包含使用上述锁对象(c的第一信息)的记载的情况下,计算机系统判定锁对象(c的第一信息)仅在CL内使用。在此,例如,由于没有给予上述其他CL作为输入数据或提供上述其他CL作为二进制数据使得源代码的记载不明的理由,存在无法执行上述检查的情况。在无法执行上述检查的情况下,计算机系统例如 可以判定为锁对象(c的第一信息)不是仅在CL内使用。此外,计算机系统例如可以使监控器显示用于进行上述判定的信息,使用户进行上述判定。在仅在CL内使用的情况下,该处理进入步骤314。在CL外也使用的情况下,该处理进入步骤313。 [0187] 步骤313中,计算机系统判定执行与上述c对应的集合变量C的第三信息(下面为c的第三信息)所对应的路径的条件句中包含的所有变量是否仅在CL内定义。该判定中检查在上述其他CL中不包含上述参照的变量的定义。通过该检查,在上述其他CL中不包含上述参照的变量的定义的情况下,计算机系统判定为参照的变量仅在CL内定义。在此,例如,由于没有给予上述其他CL作为输入数据或提供上述其他CL作为二进制数据使得源代码的记载不明的理由,存在上述检查无法执行的情况。在无法执行上述检测的情况下,计算机系统例如可以判定为上述参照的变量不是仅在CL内定义。此外,计算机系统例如可以使监控器显示用于进行上述判定的信息,使用户进行上述判定。在仅在CL内定义上述参照的变量的情况下,该处理进入步骤314。在并非仅在CL内定义上述参照的变量的情况下,该处理进入步骤318。
[0188] 在步骤314中,计算机系统向CL内追加声明变量(下面为第二变量)的语句。上述追加的情况下,根据记述CL的程序语言的规格而不同。第二变量的声明是保证原子性的数据型、能够指定静态的而且抑制最优化的数据型的第二变量的声明。在此,保证原子性根据语言规格保证用一次操作执行向存储器读入变量。如果是Java(商标)语言,例如boolean型、byte型、short型、int型或float型是大小在32位以下的数据型,是例如在32位以上的CPU上执行用上述Java(商标)语言记载的程序的情况下,保证用一次操作执行向存储器读入变量的数据型。静态的是指在CL内仅具有一个实体。例如,在Java(商标)语言的情况下,变量是静态可以用修饰符static指定。此外,抑制最优化是指例如抑制在汇编中程序代码进行与存储器的访问顺序有关的最优化。例如,在Java(商标)语言的情况下,抑制变量的最优化可以用修饰符volatile指定。通过导入volatile声明, 保证存储器命令和向同步块外变更的可视性。
[0189] 第二变量的变量名只要是不与其他变量重复的名字,可以是任意名字。该名字例如可以通过包含变量i识别。CL如果是用作为第二变量能够使用排列的语言记载的程序代码,则上述名字可以是将变量i作为添标的排列。
[0190] 在上述第二变量的声明中,声明第二变量是静态变量。此外,从向S设定了信息的同步块内的语句以外访问与上述c的第三信息对应的路径中包含的共有变量的情况下,在上述第二变量声明中,还声明上述第二变量是抑制最优化的对象的变量。在此,共有变量是具有从多个线程访问的可能性的变量。在记述CL的程序语言是Java(商标)语言的情况下,上述共有变量是实例变量和类变量。上述访问通过详查例如CL或上述其他CL求出。在此,例如,由于没有给予上述其他CL作为输入数据或提供上述其他CL作为二进制数据使得源代码的记载不明的理由,存在无法执行上述详查的情况。在无法执行上述详查的情况下,计算机系统可以从同步块的外侧访问共有变量。此外,计算机系统例如可以在监控器显示使用户判断是否从同步块的外侧访问共有变量的信息,使用户进行上述判断。 [0191] 随着上述追加结束,该处理进入步骤315。
[0192] 在步骤315中,计算机系统从执行与上述c的第三信息对应的执行路径的条件句制作语句。上述制作的语句在用于执行上述执行路径的条件成立时和条件不成立时分别将不同的值代入上述第二变量的语句。
[0193] 例如,上述第二变量是boolean型的变量b1,上述条件句的条件式是(x!=null)的情况下,上述制作的语句可以设为“b1=(x!=null);”。在其他例子中,上述第二变量是int型的变量i1,上述条件句的条件式是(y==0)的情况下,上述制作的语句例如可以设为“if(y==0){i1=0;}else{i1==1;};”。
[0194] 此外,上述条件句例如是分支为三条以上的路径的条件句“if(x==0){if(y==0){x++;y--}else{c2++;}}else{c1++;}(c1和c2都是局部变量)”的情况下,上述制作的语句例如可以设为“b=(x!==0)?!:(y!==0)?2:0;”。在此,代入变量b的值表示从不具有副作用的路径中选择哪一 个。在上述例中,制作b为1的情况下选择执行“c1++;”的路径,b为2的情况下选择执行“c2++;”的路径的语句。
[0195] 然后计算机系统在上述条件式中包含实例变量的情况下,从上述第二变量的声明删除为上述静态变量的声明。例如在Java(商标)语言的情况下,上述删除是删除修饰符static。
[0196] 随着结束上述删除,该处理进入步骤316。
[0197] 在步骤316中,计算机系统将与上述c的第三信息对应的路径复制到紧接用上述c的第二信息表示的CL上的同步块的开始位置之前。然后计算机系统在上述第二变量的值为成立值的情况下开始从上述追加的执行路径的处理,另一方面在上述第二变量的值是不成立值的情况下将开始从上述同步块的处理的条件句追加到CL上。上述条件句的终端,在值为成立值的情况和值为不成立值的情况下都在紧接用上述c的第二信息表示的CL上的同步块的结束位置之后。
[0198] 随着结束上述条件句的追加,该处理进入步骤317。
[0199] 在步骤317中,计算机系统执行关于与上述c的第三信息对应的执行路径有关的同步块的处理。关于该处理,将在下述图5中详细描述。关于上述同步块的处理,可以向CL追加新的语句。此外,关于上述同步块的处理中,可以删除在步骤314和316中向CL追加的语句。随着关于上述同步块的处理结束,该处理进入步骤318。
[0200] 步骤318表示关于集合变量C的反复的结束。
[0201] 在所有c完成取出的情况下,该处理进入步骤319。存在没有取出的c的情况下,该处理返回步骤311。
[0202] 在步骤319中,计算机系统关于第二变量,在声明上述第二变量的语句与上述第二变量对应的上述步骤314和316向CL追加的语句或与上述第二变量对应的同步块的语句且最早执行的语句之间,追加向上述第二变量设定初始值的语句。设定上述初始值的语句是在步骤315中生成的语句。在此,上述初始值可以是上述不成立值。上述语句的追加对定义的所有第二变量执行。
[0203] 随着上述追加的结束,该处理进入步骤320。
[0204] 步骤320是上述变换处理的结束。
[0205] 图5示出本发明实施方式的图4所示的步骤317的处理的详细情况。 [0206] 步骤321示出步骤317的处理的开始。
[0207] 步骤322中,计算机系统从集合变量S取出一件关于方法的信息(s)。随着该取出结束,该处理进入步骤323。
[0208] 在步骤323中,计算机系统判定上述c的第一信息即锁对象和上述s的第一信息即锁对象是否相同。在相同的情况下,该处理进入步骤324。在不同的情况下,该处理进入步骤329。
[0209] 在步骤324中,计算机系统判定由上述s的第三信息表示的同步块中是否包含更新在步骤315中制作的语句中包含的变量的语句。在包含上述更新的语句的情况下,该处理进入步骤325。在不包含上述更新的语句的情况下,该处理进入步骤329。 [0210] 在步骤325中,计算机系统判定在由上述s的第三信息表示的同步块中是否包含启动使用上述c的第一信息即锁对象取得锁的线程的语句。该判定通过计算机系统详查上述同步块执行。在上述详查中,存在发现使上述锁对象在上述同步块内使用的语句(下面为第一语句)的情况。上述第一语句例如是将上述锁对象作为参数的方法。在发现了上述第一语句的情况下,计算机系统例如详查上述其他CL,求出通过上述第一语句执行的执行路径。计算机系统通过详查上述求出的执行路径,能够发现启动线程的语句。 [0211] 通过上述详查没有发现启动上述线程的语句的情况下,该处理进入步骤326。在发现了的情况下,该处理进入步骤328。
[0212] 在此,例如由于没有给予上述其他CL作为输入数据或提供上述其他CL作为二进制使得源代码记载不明的理由,存在无法执行上述详查的情况。在无法执行上述详查的情况下,计算机系统可以判定为启动上述线程的语句包含于与上述c的第三信息对应的执行路径。此外,计算机系统例如在监控器显示输入是否包含启动上述线程的语句的信息,使用户进行上 述判定。
[0213] 在步骤326中,计算机系统判定与上述s的第三信息对应的同步块内定义的变量是否在上述同步块外参照且用于线程间的执行排序。该判定通过计算机系统详查上述程序代码执行。通过上述详查,在没有发现上述变量的情况下,该处理进入步骤327。在发现了的情况下,该处理进入步骤328。
[0214] 在此,例如,由于没有给予上述其他CL作为输入数据或提供上述其他CL作为二进制使得源代码记载不明的理由,存在无法执行上述详查的情况。在无法执行上述详查的情况下,计算机系统可以判定为上述变量包含于与上述c的第三信息对应的执行路径。此外,计算机系统例如在监控器显示输入是否包含上述变量的信息,使用户进行上述判定。 [0215] 在步骤327中,计算机系统向CL追加在步骤315中制作的语句。在此,第二变量为指定了抑制变量的最优化的变量的情况下,上述追加对与s对应的同步块执行。此外,上述追加的CL上的位置在紧接用于从与上述s对应的同步块退出的语句之前。 [0216] 第二变量为没有指定抑制变量的最优化的变量的情况下,上述追加的CL上的位置为在上述步骤324发现的上述更新的语句之后,在退出与上述s对应的同步块的处理之前。
[0217] 随着上述追加结束,该处理进入步骤329。
[0218] 在步骤328中,计算机系统在步骤314和316中删除向CL追加的语句。 [0219] 随着上述删除结束,关于步骤322的反复结束,该处理进入步骤330。 [0220] 步骤329表示关于集合变量S的反复的结束。
[0221] 在所有s取出完成的情况下,计算机系统使变量i递增。随着该递增结束,该处进入步骤330。在存在未取出的s的情况下,该处理返回步骤322。
[0222] 步骤330表示步骤317的处理的结束。
[0223] 在下述图6~图8以及图9~图11中示出图3~图5的各步骤的工作的具 体例。
[0224] 图6示出本发明的实施方式中的、用于具体说明图3~图5所示的各步骤的工作的输入数据CL。
[0225] 图6~图8所示的例子表示步骤325和步骤326中向用户进行询问的情况。 [0226] 计算机系统将输入数据(401)作为输入数据CL启动变换程序。
[0227] 在步骤302中,计算机系统向变量设定以下的值。
[0228] 集合变量M={void enqueue(Ww)public W dequeue()}
[0229] 变量i=1
[0230] 集合变量S={φ}
[0231] 集合变量C={φ}
[0232] 随着上述设定结束,该处理进入步骤303。
[0233] 步骤303~步骤305的反复中,计算机系统对m=“Boolean enqueue(Ww)”以及m=“public W dequeue()”各自执行步骤304。通过该执行,向集合变量S保存 [0234]
[0235] 随着上述保存结束,该处理进入步骤306。
[0236] 在步骤306~步骤310的反复中,计算机系统对包含于上述集合变量S的s1~s3执行步骤307~步骤309。该执行的结果是,向集合变量C保存
[0237] C={
[0238] (以下为c),
[0239] }
[0240] 在此,在包含S03的路径上具有同步的副作用。此外,在包含S04行和T05行的路径上存在向实例变量代入的副作用。因此,包含S03行、S04 行和T05行的路径不满足步骤307的条件。因此,包含S03行、S04行和T05行的路径在步骤309中不保存在集合变量C。
此外,例如,在S02行,参照从w的方法的参数提供的局部变量。因此,S02行不满足步骤308的条件。因此,S02行在步骤309不保存在集合变量C。然后,该处理进入步骤311。 [0241] 在步骤311~步骤318的反复中,计算机系统对包含于上述集合变量C的c执行步骤312~317。
[0242] 在步骤312和步骤313中,执行关于上述c的判定。在此,包含于c的“lock”是用private声明的变量,是无法从CL外参照的变量。因此,c满足步骤312和步骤313的条件,所以该处理进入步骤314。
[0243] 在步骤314中,计算机系统向CL追加声明变量的语句。在此,共有变量head仅在s1内被访问。因此,计算机系统向CL追加实例变量的声明“private static boolean b1”。
[0244] 在步骤315中,计算机系统使用T02行的条件句(head!=null),生成“b1=(head!null)”的语句。此外,head是实例变量,所以计算机系统从在步骤314追加的声明“private static boolean b1”取出“static”。
[0245] 在步骤316中,计算机系统在T01行之前生成T02行、T07行以及T08行。此外,计算机系统用“(b1)”置换包含于c的条件句。计算机系统是T02行的then节向具有副作用的路径的分支,所以将上述then节与向同步块的代码相连。
[0246] 图7示出本发明实施方式的图4所示的步骤316的处理被执行后的方法dequeue()。
[0247] 通过步骤316的处理,向CL的方法dequeue()追加语句(412)。
[0248] 在上述步骤316中,随着执行上述追加,该处理进入步骤317。
[0249] 在步骤317中,计算机系统执行步骤322~步骤329的反复。
[0250] 在步骤322~步骤329的反复中,计算机系统对包含于上述集合变量S的s1~s3各自执行步骤323~步骤328。
[0251] 满足步骤322的条件的s1~s3是
[0252] (s2)以及
[0253] (s3) [0254] 在步骤323中,计算机系统调查在关于满足上述步骤322的条件的s2或s3的路径是否存在至少一个向b0的代入语句的右边参照的变量的代入。在s2或s3中,检索进行向head代入的处理。上述检索的结果是,s2或s3满足步骤323的条件。
[0255] 在步骤324中,计算机系统关于由上述s2或s3表示的同步块,生成新的线程,检查生成的线程是否将获得与由上述s2或s3表示的同步块相同的锁对象。通过该检查,发现在由s2表示的同步块的S06行包含以L0为参数调用方法bar(lock)的处理。 [0256] 在此,在输入仅为CL的情况下,安装上述方法bar(lock)的程序的程序代码不明。因此,计算机系统使用户判定是否将进行上述获得。计算机系统例如在监控器显示“foo.bar(lock)启动线程,关于lock是否调出synchronized block或synchronized method”,对用户进行询问。用户回答“否”的情况下,该处理进入步骤326,用户回答“是”的情况下,该处理进入步骤328。
[0257] 步骤326中,计算机系统检查由s2或s3表示的同步块内定义的变量是否在同步块外参照且用于决定至少两个线程间的执行顺序。在此,S06行的共有变量lock存在从foo.bar(lock)退出从其他线程被访问的可能性。因此,计算机系统例如在监控器显示“lock是否用于决定与其他线程决定执行顺序?”,对用户进行询问。用户回答“否”的情况下,该处理进入步骤327,用户回答“是”的情况下,该处理进入步骤328,退出上述反复。 [0258] 在步骤327中,计算机系统决定追加在步骤315中生成的语句“b1=(head!=null)”的位置。b1没有进行volatile声明,所以计算机系统将上述生成的语句追加到更新head的语句之后。该追加的场所例如关于s2是在S06行之后,关于s3是在T06行之前和T08行之前。
[0259] 随着上述步骤322~步骤329的反复结束,该处理进入步骤319。
[0260] 在步骤319中,计算机系统向在步骤314中追加的声明追加“b1=(head!=null);”。
[0261] 随着上述追加,该处理结束。
[0262] 图8示出对图6执行图3~图5所示的步骤的处理后的输入数据(下面为变换后的程序代码(421))。
[0263] 通过图3~图5的步骤的处理,向变换后的程序代码(421)追加语句(422)。 [0264] 变换后的程序代码(421)在head为null的情况下,b1成为false。因此,变换后的程序代码(421)被执行,head为null时调用dequeue()方法时,该处理不会突入同步块而返回null。因此,解决所冲突的问题。
[0265] 图9示出本发明实施方式的用于具体说明图3~图5所示的各步骤的工作的输入数据CL。
[0266] 图9~图11所示的例子是在上述CL之外存在其他CL(未图示),在步骤325和步骤326中不向用户进行询问的情况的例子。
[0267] 计算机程序将输入数据(501)作为输入CL,启动变换程序。
[0268] 在步骤302中,计算机系统向变量设定以下的值。
[0269] 集合变量M={Boolean enqueue(W w)public W dequeue()}
[0270] 变量i=1
[0271] 集合变量S={φ}
[0272] 集合变量C={φ}
[0273] 随着上述设定结束,该处理进入步骤303。
[0274] 步骤303~步骤305的反复中,计算机系统对m=“boolean enqueue(Ww)”以及m=“public W dequeue()”各自执行步骤304。通过该执行,向集合变量S保存 [0275]
[0276]
[0277] 随着上述保存结束,该处理进入步骤306。
[0278] 在步骤306~步骤310的反复中,计算机系统对包含于上述集合变量S的s1~s3分别执行步骤307~步骤309。该执行的结果是,向集合变量C保存
[0279] C={
[0280] (以下为c),
[0281] }
[0282] 在此,在包含S03的路径上具有同步的副作用。此外,在包含S04行和T05行的路径上存在向实例变量代入的副作用。因此,包含S03行、S04行和T05行的路径不满足步骤307的条件。因此,包含S03行、S04行和T05行的路径在步骤309中不保存在集合变量C。
此外,例如,在S02行,参照从w的方法的参数提供的局部变量。因此,S02行不满足步骤308的条件。因此,S02行在步骤309不保存在集合变量C。然后,该处理进入步骤311。 [0283] 在步骤311~步骤318的反复中,计算机系统对包含于上述集合变量C的c执行步骤312~317。
[0284] 在步骤312和步骤313中,执行关于上述c的判定。在此,包含于c的“lock”是用private声明的变量,是无法从CL外参照的变量。因此,c满足步骤312和步骤313的条件,所以该处理进入步骤314。
[0285] 在步骤314中,计算机系统向CL追加声明变量的语句。在此,共有变量head仅在s1内被访问。因此,计算机系统向CL追加实例变量的声明“private static boolean b1”。
[0286] 在步骤315中,计算机系统使用T02行的条件句(head!=null),生成“b1=(head!null)”的语句。此外,head是实例变量,所以计算机系统从在步骤314追加的声明“private static boolean b1”取出“static”。
[0287] 在步骤316中,计算机系统在T01行之前生成T02行、T07行以及T08行。此外,计算机系统用“(b1)”置换包含于c的条件句。计算机 系统是T02行的then节向具有副作用的路径的分支,所以将上述then节与向同步块的代码相连。
[0288] 图10示出本发明实施方式中的、执行图4所示的步骤316的处理后的方法dequeue()。
[0289] 通过步骤316的处理,向CL的方法dequeue()追加语句(512)。
[0290] 在上述步骤316中,随着执行上述追加,该处理进入步骤317。
[0291] 在步骤317中,计算机系统执行步骤322~步骤329的反复。
[0292] 在步骤322~步骤329的反复中,计算机系统对包含于上述集合变量S的s1~s3各自执行步骤323~步骤328。
[0293] 满足步骤322的条件的s1~s3是
[0294] (s2)以及
[0295] (s3) [0296] 在步骤323中,计算机系统调查在关于满足上述步骤322的条件的s2或s3的路径是否存在至少一个向b0的代入语句的右边参照的变量的代入。在s2或s3中,检索进行向head代入的处理。上述检索的结果是,s2或s3满足步骤323的条件。
[0297] 在步骤324中,计算机系统关于由上述s2或s3表示的同步块,生成新的线程,检查生成的线程是否将获得与由上述s2或s3表示的同步块相同的锁对象。在由s2或s3表示的同步块中不包含生成新线程的语句。因此,计算机系统在该检查中判断为不获得与由上述s2或s3表示的同步块相同的锁对象。根据不进行该获得,该处理进入步骤326。 [0298] 步骤326中,计算机系统检查由s2或s3表示的同步块内定义的变量是否在同步块外参照且用于决定至少两个线程间的执行顺序。在此,共有变量lock进行private声明,所以不从CL外访问。此外,共有变量lock在CL内仅在同步块内被访问。因此,计算机系统在该检查中判断为共有变量lock不用于决定执行顺序。根据该不用于,该处理进入步骤327。
[0299] 在步骤327中,计算机系统决定追加在步骤315中生成的语句“b1= (head!=null)”的位置。b1没有进行volatile声明,所以计算机系统将上述生成的语句追加到更新head的语句之后。该追加的场所例如关于s2是在S06行之后,关于s3是在T06行之前和T08行之前。
[0300] 随着上述步骤322~步骤329的反复结束,该处理进入步骤319。
[0301] 在步骤319中,计算机系统向在步骤314中追加的声明追加“b1=(head!=null);”。
[0302] 随着上述追加,该处理结束。
[0303] 图11示出本发明实施方式中的、对图9执行图3~图5所示的步骤的处理后的输入数据(下面为变换后的程序代码(521))。
[0304] 通过图3~图5的步骤的处理,向变换后的程序代码(521)追加语句(522)。 [0305] 变换后的程序代码(521)在head为null的情况下,b1成为false。因此,执行变换后的程序代码(401),head为null时调用dequeue()方法时,该处理不会突入同步块而返回null。因此,解决所冲突的问题。
[0306] 图12示出本发明的实施方式中的、通过第一条件式选择的路径为三条以上时的、执行图3~图5所示的各步骤的处理前的程序代码的一部分以及执行后的程序代码的一部分。
[0307] 程序代码(601)的同步块包含两个第一条件式“(x==0)”和“(y==0)”。此外,通过上述两个第一条件式选择三条路径(602~604)。在此,在c1和c2为局部变量的情况下,路径(603)和路径(604)是没有副作用的路径。路径(602)包含更新与第一变量对应的x和y的两个变量,所以是具有副作用的路径。
[0308] 程序代码(611)示出对程序代码(601)执行图3~图5所示的各步骤的处理的结果。
[0309] 程序代码(611)中向程序代码(601)的同步块追加声明第二变量的声明句(612)、第二条件句(613)以及步骤315中制作的语句(614)。
[0310] 在上述各步骤的处理中,向第二变量准备可以取表示从没有副作用的路径(603和604)中选择哪一路径的值的变量。因此,向程序代码(611) 追加声明作为选择路径(603)的值可以取2,作为表示路径(604)的值可以取1的变量b的声明句(612)。此外,向程序代码(611)追加第二条件句(613),作为根据上述第二变量执行没有副作用的路径(603和604)的条件句。
[0311] 向程序代码(611)还在紧接更新第一变量即x和y的更新句之后追加在求变量b的值的语句即步骤315中制作的语句(614)。
[0312] 根据本发明的实施方式,通过执行图3~图5的各步骤,能够解决java.lang.ref.ReferenceQueue中的锁冲突的问题。
[0313] 图13示出本发明的实施方式中的、图1的系统具有的计算机硬件的框图。 [0314] 本发明的实施方式的计算机系统(701)包括CPU(702)和主存储器(703),这些连接于路径(704)。优选,CPU(702)基于32位或64位的系统结构,例如可以使用英特尔公司的Xeon(商标)系列,Core(商标)系列、Atom(商标)系列,Pentium(商标)系列,Celeron(商标)系列,AMD公司的Phenom(商标)系列、Althlon(商标)系列、Turion(商标)系列或Sempron(商标)等。在路径(704)上经由显示器控制器(705)连接有LCD监控器等显示器(706)。显示器(706)用于为了计算机系统的管理将经由通信线连接于网络的计算机系统有关的信息和在该计算机系统上工作中的软件有关的信息在适当的图形界面显示。在路径(704)上还经由IDE或SATE控制器(707)连接有硬盘或硅盘(708)和CD-ROM、DVD驱动器或Blu-ray驱动器(709)。
[0315] 在硬盘(708)中以可下载的方式在主存储器(703)存储有操作系统、提供J2EE等Java(商标)处理环境的程序、其他程序以及数据。
[0316] CD-ROM、DVD驱动器或Blu-ray驱动器(709)根据需要用于从CD-ROM、DVD或Blu-ray盘向硬盘追加导入程序。在路径(704)上还经由键盘鼠标控制器(710)连接有键盘(711)和鼠标(712)。
[0317] 通信接口(714)例如按照以太网协议。通信接口(714)经由通信控制器(713)连接于路径(704),发挥物理连接计算机系统和通信线(715) 的作用,对计算机系统的操作系统的通信功能的TCP/IP通信协议提供网络接口层。通信线可以是有线LAN环境、或者例如基于IEEE802.11a/b/g/n等无线LAN连接规格的无线LAN环境。