多线程条件下cpu高速缓存行失效的处理方法及装置的制造方法

文档序号:9489340阅读:1146来源:国知局
多线程条件下cpu高速缓存行失效的处理方法及装置的制造方法
【技术领域】
[0001]本发明涉及数据处理领域,具体地,涉及一种多线程条件下CPU高速缓存行失效的处理方法及装置。
【背景技术】
[0002]Java虚拟机(英文:Java Virtual Machine,简称:JVM)是运行Java程序的抽象计算机,是Java语言的运行环境。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在JVM上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
[0003]Java内存模型规定,Java程序中的所有变量都存储在主内存中。每条线程还有自己的工作内存,线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(如读取、赋值等)都在工作内存中进行,但线程间变量的传递则需要通过主内存来完成。
[0004]此外,Java语言规范还规定了可以通过volatile关键字来修饰变量,以保证一个线程对该变量的更新会对其他线程立即可见,也就是说,保证所述其他线程始终能够读取该变量的最新数据。
[0005]通常,为了提高线程处理速度,可以将线程频繁调用的变量载入线程所在CPU的缓存中。CPU缓存是位于CPU与主内存之间的临时存储器,可结合实际应用被设置为多级缓存,各级缓存以一定大小的缓存行作为基本的存储单元。

【发明内容】

[0006]本发明的目的是提供一种多线程条件下CPU高速缓存行失效的处理方法及装置,使需要被隔离的两个字段分开位于两个缓存行中,可以有效避免多线程条件下的CPU高速缓存行失效,有助于维持应用程序性能。
[0007]第一方面,本发明实施例提供了一种多线程条件下CPU高速缓存行失效的处理方法,所述方法包括:
[0008]判断第一字段和第二字段之间是否需要隔离,所述第一字段用volatile关键字修饰;
[0009]如果需要隔离,在所述第一字段和所述第二字段之间加入填充字段,所述填充字段用于使所述第一字段和所述第二字段位于不同缓存行。
[0010]在第一方面的第一种可能的实现方式中,所述判断第一字段和第二字段之间是否需要隔离,包括:
[0011]根据Java虚拟机变量重排列规则,获得所述第一字段和所述第二字段的间隔距离;
[0012]利用所述间隔距离和处理器的缓存行大小,判断所述第一字段和所述第二字段是否位于同一缓存行;
[0013]如果位于同一缓存行,判定所述第一字段和所述第二字段之间需要隔离。
[0014]结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述Java虚拟机变量重排列规则为按照变量的类型进行重排列,则所述第一字段、所述第二字段和所述填充字段三者具有相同类型。
[0015]结合第一方面的第一种可能的实现方式,在第三种可能的实现方式中,获得所述处理器的缓存行大小的方式为:
[0016]利用Java本地接口 JNI调用C语言函数,并使用所述C语言函数调用CPUID汇编指令,获得所述处理器的缓存行大小。
[0017]结合第一方面的第一种至第三种中任一种可能的实现方式,在第四种可能的实现方式中,获得所述间隔距离之前,所述方法还包括:
[0018]判断所述第一字段和所述第二字段是否被标识为需要隔离;
[0019]如果是,再执行获得所述间隔距离的步骤。
[0020]在第一方面的第五种可能的实现方式中,在所述第一字段和所述第二字段之间加入填充字段,包括:
[0021]修改Java源文件,加入所述填充字段。
[0022]在第一方面的第六种可能的实现方式中,在所述第一字段和所述第二字段之间加入填充字段,包括:
[0023]对Java源文件编译生成的class文件进行字节码增强,加入所述填充字段。
[0024]在第一方面的第七种可能的实现方式中,在所述第一字段和所述第二字段之间加入填充字段之后,所述方法还包括:
[0025]添加对所述填充字段的调用方法。
[0026]第二方面,本发明实施例提供了一种多线程条件下CPU高速缓存行失效的处理装置,所述装置包括:
[0027]隔离判断单元,用于判断第一字段和第二字段之间是否需要隔离,所述第一字段用volatile关键字修饰;
[0028]字段加入单元,用于在所述隔离判断单元判定所述第一字段和所述第二字段之间需要隔离时,在所述第一字段和所述第二字段之间加入填充字段,所述填充字段用于使所述第一字段和所述第二字段位于不同缓存行。
[0029]在第二方面的第一种可能的实现方式中,所述隔离判断单元包括:
[0030]间隔距离获得单元,用于根据Java虚拟机变量重排列规则,获得所述第一字段和所述第二字段的间隔距离;
[0031]隔离判断子单元,用于利用所述间隔距离和处理器的缓存行大小,判断所述第一字段和所述第二字段是否位于同一缓存行;如果位于同一缓存行,判定所述第一字段和所述第二字段之间需要隔离。
[0032]结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述隔离判断单元还包括:
[0033]缓存行大小获得单元,用于利用Java本地接口 JNI调用C语言函数,并使用所述C语言函数调用CPUID汇编指令,获得所述处理器的缓存行大小。
[0034]结合第二方面的第一种或者第二种可能的实现方式,在第三种可能的实现方式中,所述隔离判断单元还包括:
[0035]标识判断单元,用于在所述间隔距离获得单元获得所述间隔距离之前,判断所述第一字段和所述第二字段是否被标识为需要隔离;如果是,再通知所述间隔距离获得单元获得所述间隔距离。
[0036]在第二方面的第四种可能的实现方式中,所述字段加入单元,具体用于修改Java源文件,在所述第一字段和所述第二字段之间加入所述填充字段。
[0037]在第二方面的第五种可能的实现方式中,所述字段加入单元,具体用于对Java源文件编译生成的class文件进行字节码增强,在所述第一字段和所述第二字段之间加入所述填充字段。
[0038]在第二方面的第六种可能的实现方式中,所述装置还包括:
[0039]调用方法添加单元,用于在所述字段加入单元加入所述填充字段之后,添加对所述填充字段的调用方法。
[0040]结合发明人分析研究结果,当两个需要被隔离的字段位于同一缓存行时,可能会因为线程的频繁更新操作,影响多核处理器的性能,本发明技术方案中,在需要被隔离的第一字段和第二字段之间加入填充字段,确保第一字段和第二字段分别位于不同缓存行,如此,便可在需要时分别载入各自线程所占用CPU,从而有效避免多线程条件下的CPU缓存行失效,有助于维持应用程序的性能。
[0041]本发明的其他特征和优点将在随后的【具体实施方式】部分予以详细说明。
【附图说明】
[0042]附图是用来提供对本发明的进一步理解,并且构成说明书的一部分,与下面的【具体实施方式】一起用于解释本发明,但并不构成对本发明的限制。在附图中:
[0043]图1是CPU缓存的示意图;
[0044]图2是本发明多线程条件下CPU高速缓存行失效的处理方法的流程图;
[0045]图3是本发明中判断第一字段和第二字段之间是否需要隔离的流程图;
[0046]图4是本发明多线程条件下CPU高速缓存行失效的处理装置的结构示意图。
【具体实施方式】
[0047]以下结合附图对本发明的【具体实施方式】进行详细说明。应当理解的是,此处所描述的【具体实施方式】仅用于说明和解释本发明,并不用于限制本发明。
[0048]结合实际应用,发明人发现在运行环境基本相同的情况下,多核处理器执行一些多线程操作时的性能较优,而在执行另一些多线
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1