内存屏障的优化方法技术

技术编号:39853611 阅读:7 留言:0更新日期:2023-12-30 12:53
本申请提供一种内存屏障的优化方法

【技术实现步骤摘要】
内存屏障的优化方法、装置、设备及介质


[0001]本申请涉及计算机
,尤其涉及一种内存屏障的优化方法

装置

设备及介质


技术介绍

[0002]Java
内存模型中,在对象初始化时,为保证
Java
线程的安全性,要求元数据和
final
类型字段的可见性先于该对象的可见性

具体解释为:要求对象初始时的元数据和
final
类型字段的写操作,在该对象的引用传递的写操作之前完成,以保证在另一个线程看到该对象时,看到的是该对象的最终字段的正确构造版本

[0003]已知技术中,对于上述要求,在
Java
虚拟机的即时编译器将对象初始化方法转化成语法树过程中,分别实现为:在用于写对象元数据的存储节点后面插入一个内存屏障节点,类型为
StoreStore
,以指示在内存屏障节点之后的写操作需要在位于内存屏障节点之前的写操作执行完毕后执行;在写
final
类型字段的存储节点后面插入一个内存屏障节点,类型为
LoadStore|StoreStore
,以指示在内存屏障节点之后的所有写操作在位于内存屏障节点之前的所有读写操作执行完毕后执行

进一步的,在用代码实现语法树的过程中,对于用于写对象元数据的存储节点和其后面的内存屏障节点,通过生成两个机器指令来实现对应操作;对于写
final
>类型字段的存储节点和其后面的内存屏障节点,也通过生成两个机器指令来实现对应操作

[0004]可见,已知技术中,两个节点至少需要分别生成一条机器指令,不够简洁


技术实现思路

[0005]本申请提供一种内存屏障的优化方法

装置

设备及介质,用以减少机器指令条数

[0006]一方面,本申请提供一种内存屏障的优化方法,该方法包括:
[0007]对于每个对象初始化方法,查找所述初始化方法对应的语法树中是否存在预设类型的目标内存屏障节点;所述语法树是所述编译器根据所述初始化方法的原始代码生成的;
[0008]若存在所述目标内存屏障节点,则查找所述语法树中是否存在满足预设条件的目标存储节点;
[0009]若存在所述目标存储节点,则根据所述目标内存屏障节点和所述目标存储节点,得到更新节点;
[0010]通过所述编译器的后端架构生成用于实现所述更新节点的原子访存指令,并根据所述原子访存指令更新所述初始化方法,以形成所述初始化方法对应的优化代码

[0011]在另一种可能实现的方式中,所述根据所述目标内存屏障节点和所述目标存储节点,得到更新节点,包括:
[0012]合并所述目标内存屏障节点和所述目标存储节点,以得到原子存储节点;将所述
原子存储节点作为所述更新节点

[0013]在另一种可能实现的方式中,所述根据所述目标内存屏障节点和所述目标存储节点,得到更新节点,包括:
[0014]删除所述目标内存屏障节点,并根据保序标识和所述目标存储节点,得到所述更新节点;所述保序标识用于指示所述目标存储节点需要保序

[0015]在另一种可能实现的方式中,所述查找语法树中是否存在预设类型的目标内存屏障节点,包括:
[0016]从所述语法树的根节点开始,向上查找所述初始化方法对应的返回节点,所述返回节点是所述初始化方法的唯一出口;
[0017]从所述返回节点开始,沿所述语法树向上查找所述预设类型的内存屏障节点;
[0018]将查找到的第一个所述预设类型的内存屏障节点作为所述目标内存屏障节点

[0019]在另一种可能实现的方式中,所述将查找到的满足所述预设类型的第一个内存屏障节点作为所述目标内存屏障节点之后,所述方法还包括:
[0020]从所述目标内存屏障节点开始,沿所述语法树继续向上查找所述预设类型的第
N
个内存屏障节点,
N
为大于1的整数;
[0021]从所述第
N
个内存屏障节点开始,沿所述语法树继续向上查找所述第
N
个内存屏障节点对应的目标存储节点;所述目标存储节点用于存储所述初始化方法的元数据或
final
类型字段;
[0022]根据所述第
N
个内存屏障节点和对应的目标存储节点,得到所述第
N
个内存屏障节点的更新节点,并通过所述后端架构生成用于实现所述更新节点的原子访存指令

[0023]在另一种可能实现的方式中,所述预设条件包括:所述目标存储节点对应的树深度值比所述目标内存屏障节点对应的树深度值大1;所述方法还包括:
[0024]对于每个目标内存屏障节点,若所述语法树中包括具有相同树深度值的至少两个目标存储节点,则根据其中一个所述目标存储节点和所述目标内存屏障节点得到所述更新节点;
[0025]根据所述更新节点,更新所述语法树,使剩余的目标存储节点对应的树深度值大于所述更新节点对应的树深度值

[0026]在另一种可能实现的方式中,所述根据其中一个所述目标存储节点和所述目标内存屏障节点得到所述更新节点,包括:
[0027]获取所述预设后端架构原子访存指令支持的目标数据类型,所述目标数据类型包括整型

浮点型;
[0028]根据所述数据类型,确定至少两个满足所述预设条件的目标存储节点中的最优存储节点,所述最优存储节点的数据类型为所述目标数据类型中的一种

[0029]第二方面,本申请提供一种内存屏障的优化装置,所述装置包括:
[0030]查找模块,用于对于每个对象初始化方法,查找所述初始化方法对应的语法树中是否存在预设类型的目标内存屏障节点;所述语法树是所述编译器根据所述初始化方法的原始代码生成的;
[0031]所述查找模块,用于在存在所述目标内存屏障节点,查找所述语法树中是否存在满足预设条件的目标存储节点;
[0032]确定模块,用于在存在所述目标存储节点,根据所述目标内存屏障节点和所述目标存储节点,得到更新节点;
[0033]生成模块,用于通过所述编译器的后端架构生成用于实现所述更新节点的原子访存指令,并根据所述原子访存指令更新所述初始化方法,以形成所述初始化方法对应的优化代码

[0034]在另一种可能实现的方式中,所述确定模块具体用于:
[0035]合并所述目标内存屏障节点和所述目标存储节点,以得到原子存储节点;将所述原子存储节点作为所述更新节点

[0036]在另一种可能实现的方式中,所述确定模块具体用于:
[0037]删除所述目标内存屏障节点,并根据保序标识和本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.
一种内存屏障的优化方法,应用于编译器,其特征在于,包括:对于每个对象初始化方法,查找所述初始化方法对应的语法树中是否存在预设类型的目标内存屏障节点;所述语法树是所述编译器根据所述初始化方法的原始代码生成的;若存在所述目标内存屏障节点,则查找所述语法树中是否存在满足预设条件的目标存储节点;若存在所述目标存储节点,则根据所述目标内存屏障节点和所述目标存储节点,得到更新节点;通过所述编译器的后端架构生成用于实现所述更新节点的原子访存指令,并根据所述原子访存指令更新所述初始化方法,以形成所述初始化方法对应的优化代码
。2.
根据权利要求1所述的方法,其特征在于,所述根据所述目标内存屏障节点和所述目标存储节点,得到更新节点,包括:合并所述目标内存屏障节点和所述目标存储节点,以得到原子存储节点;将所述原子存储节点作为所述更新节点
。3.
根据权利要求1所述的方法,其特征在于,所述根据所述目标内存屏障节点和所述目标存储节点,得到更新节点,包括:删除所述目标内存屏障节点,并根据保序标识和所述目标存储节点,得到所述更新节点;所述保序标识用于指示所述目标存储节点需要保序
。4.
根据权利要求1‑3任一项所述的方法,其特征在于,所述查找语法树中是否存在预设类型的目标内存屏障节点,包括:从所述语法树的根节点开始,向上查找所述初始化方法对应的返回节点,所述返回节点是所述初始化方法的唯一出口;从所述返回节点开始,沿所述语法树向上查找所述预设类型的内存屏障节点;将查找到的第一个所述预设类型的内存屏障节点作为所述目标内存屏障节点
。5.
根据权利要求4所述的方法,其特征在于,所述方法还包括:从所述目标内存屏障节点开始,沿所述语法树继续向上查找所述预设类型的第
N
个内存屏障节点,
N
为大于1的整数;从所述第
N
个内存屏障节点开始,沿所述语法树继续向上查找所述第
N
个内存屏障节点对应的目标存储节点;所述目标存储节点用于存储所述初始化方法的元数据或
final
类型字段;根据所述第
...

【专利技术属性】
技术研发人员:孙国云王锐敖琪
申请(专利权)人:龙芯中科技术股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1