5分钟系列之-java内存模型与线程(一、硬件效率与一致性)

8 篇文章 0 订阅

1. 衡量效率指标

衡量一个服务性能好坏高低 ,每秒事务处理数事重要的指标之一(TPS),它代表一秒内服务能处理的请求数,而TPS的大小又与程序并发能力有着重要的关系。

2.硬件的效率与一致性

如何压榨cpu资源

2.1高速缓存

计算机的存储设备与cpu的运算速度有几个数量级的差距,因此现代计算机都加上一层读写速度尽可能接近与cpu处理速度的高速缓存来充当内存与cpu的中间层,将要使用到的数据复制到缓存中,让运算能快速进行,当运算结束后再从高速缓存同步回内存中,多个进程(线程)把各自需要运算的数据提前放置到高速缓存中,cpu在多个进程(线程)间切换,基于高速缓存做运算,这样就无需等待缓慢的内存读写了,可以充分的压榨计算机性能。把cpu比作高射速的机枪,缓存就是弹夹,各个进程(线程)就是多个给弹夹压子弹的人,只有子弹供给上了才能压榨机枪的威力。
引入的新问题,在多处理器(多核心)系统中,每个处理器都有自己的高速缓存,而他们又共享同一主存,当过个核心的运算任务都涉及到同一块主存时,到底以谁的结果为准,这就引入了缓存一致性的问题。为了解决这一问题,各个处理器访问缓存时都要遵循一些缓存一致性协议进行操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
处理器,高速缓存,与主存的关系

处理器,高速缓存,与主存的关系

2.2乱序执行优化

为了使得处理器内部的运算单元尽可能被利用,处理器可能会对输入代码进行乱序执行优化,处理器会将乱序执行结果进行重组,保证该结果与顺序执行结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因此一个计算任务在计算任务依赖于另一个计算任务的中间结果,那么其顺序性不能靠代码的先后顺序保证。
一条语句的执行需要好多步,简单来说可以分为以下几步:

  • 取指 IF
  • 译码和取寄存器操作数 ID
  • 执行或者有效地址计算EX
  • 存储器访问MEM
  • 写回 WB

先简单看一个A=B+C的流水线执行情况,其中LW表示load, LW R1,B表示把B的值加载到R1寄存器中。ADD 就是加法,SW表示存储。


在这里插入图片描述

执行流水示意图

从上往下是执行顺序,右边是流水线情况,注意在ADD指令上有⊙,表示一个中断,即在这里停顿了以下,因为R2中的数据还没有准备好,所以ADD必须进行一次等待,因此会导致后边的所有指令都慢一个节拍。
下边看个复杂一点的例子A=B+C,D=E-F
在这里插入图片描述
复杂情况原始流水图

这个运算有不少停顿,为什么不在停顿的时间做点别的事情呢
在这里插入图片描述
优化前后对比图

将E和F的读取向前提,整个执行周期减少了两个节拍,而最终的执行结果也没改变,由此可见,执行重排序对提高cpu处理性能是十分必要的


欢迎关注我的公众号,加我好友【chenaima】,一起探讨,共同进步!

​​​​ 在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值