
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习计算机编程开发技术,而本文我们就通过案例分析来简单了解一下,Java指令重排的作用都有哪些。
Java指令重排是指在执行程序时为了提高性能,编译器和处理器常常会对指令做重排序的一种防护措施机制。
我们在实际开发工作中编写代码时候,是按照一定的代码的思维和习惯去编排和组织代码的,但是实际上,编译器和CPU执行的顺序可能会代码顺序产生不一致的情况。
毕竟,编译器和CPU会对我们编写的程序代码自身做一定程度上的优化再去执行,以此来提高执行效率,因此提出了指令重排的机制。
一般来说,我们在程序中编写的每一个行代码其实就是程序指令,按照线性思维方式来看,这些指令按道理是一行行代码存在的顺序去执行的,只有上一行代码执行完毕,下一行代码才会被执行,这就说明代码的执行有一定的顺序。
但是这样的顺序,对于程序的执行时间上来看是有一定的耗时的,为了加快代码的执行效率,一般会引入一种流水线技术的方式来解决这个问题,就像Jenkins流水线部署机制的编写那样。
但是流水线技术的本质上,是把每一个指令拆成若干个部分,在同一个CPU的时间内使其可以执行多个指令的不同部分,从而达到提升执行效率的目的,主要体现在:
获取指令阶段:主要使用指令通道和指令寄存器,一般是在CPU处理器主导
编译指令阶段:主要使用指令编译器,一般是在编译器主导
执行指令阶段:主要使用执行单元和数据通道,相对来说像是从内存在主导
一般来说,指令从排会涉及到CPU,编译器,以及内存等,因此指令重排序的类型大致可以分为编译器指令重排,CPU指令重排,内存指令重排,其中:
编译器指令重排:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序
CPU指令重排:现代处理器采用了指令级并行技术(Instruction-LevelParallelism,ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
内存指令重排:由于处理器使用缓存和读/写缓冲区,其加载和存储操作看上去类似乱序执行的情况。
在Java领域中,指令重排的原则是不能影响程序在单线程下的执行的准确性,但是在多线程的情况下,可能会导致程序执行出现错误的情况,主要是依据Happen-Before关系原则来组织部重排序,其核心就是使用内存屏障来实现,通过内存屏障可以堆内存进行顺序约束,而且作用于线程。
由于Java有不同的编译器和运行时环境,对应起来看,Java指令重排主要发生在编译阶段和运行阶段,而编译阶段对应的是编译器,运行阶段对应着CPU,其中:
编译阶段指令重排:
通用描述:源代码->机器码的指令重排:源代码经过编译器变成机器码,而机器码可能被重排
Java描述:Java源文件->Java字节码的指令重排:Java源文件被javac编译后变成Java字节码,其字节码可能被重排
运行阶段指令重排:
通用描述:机器码->CPU处理器的指令重排:机器码经过CPU处理时,可能会被CPU重排才执行
Java描述:Java字节码->Java执行器的指令重排:Java字节码被Java执行器执行时,可能会被CPU重排才执行
既然设置内存屏障,可以确保多CPU的高速缓存中的数据与内存保持一致性,不能确保内存与CPU缓存数据一致性的指令也不能重排,内存屏障正是通过阻止屏障两边的指令重排序来避免编译器和硬件的不正确优化而提出的一种解决办法。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。