目前主流网站开发所用软件,商标设计网上接单第一平台,临沂网站网站建设,河北网站开发多少钱CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行#xff08;指令重排#xff09; 二、JMM——Java内存模型 一、CPU多核缓存架构
计算机的基本组成图
CPU 缓存为了提高程序运行的性能#xff0c;现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快#xf… CPU多核缓存架构 一、CPU多核缓存架构可见性问题乱序执行指令重排 二、JMM——Java内存模型 一、CPU多核缓存架构
计算机的基本组成图
CPU 缓存为了提高程序运行的性能现代 CPU 在很多方面会对程序进行优化。CPU 的处理速度很快内存的速度是其次的磁盘的速度更慢由于 CPU 向内存中获取数据得经过系统总线等原因会影响 CPU 整体的执行效率所以设置了多级缓存策略。 CPU 分为三级缓存每个 CPU 都有 L1、L2缓存但是L3缓存是多核公用的。 CPU 查找数据的顺序为CPU-L1-L2-L3-内存-磁盘. 从CPU到大约需要的时间主存60~80纳秒L3 cache大约15纳秒L2 cache大约3纳秒L1 cache大约1纳秒寄存器大约0.3纳秒
进一步优化CPU 每次读取一个数据并不是仅仅读取这个数据本身而是会读取到与它相邻的64个字节的数据称之为【缓存行】因为 CPU 认为我使用了这个变量很快就会使用与它相邻的数据这是计算机的局部性原理。这样就不需要每次都从主存中读取数据了。MySQL进行IO操作获取表数据也是这样的会多取相邻的数据放入页中。
可见性问题
在多级缓存的结构下最经典的问题就是【可见性问题】即每个逻辑 CPU 都有自己的缓存这些缓存和主存之间不是完全同步的。 比如两个 CPU 读取了一个缓存行缓存行里有两个变量一个x一个y。每一颗CPU修改了x的数据还没有刷回主存此时第二颗CPU从主存中读取了未修改的缓存行而此时第一颗CPU修改的数据刷回主存这时就出现第二颗CPU读取到的数据和主存不一致的情况。当然刷回到主存只是时间问题产生可见性问题也是概率性事件。 为了解决数据不一致的问题很多厂商也提出了自己的解决方案比如缓存一致性协议MESI该协议虽解决了缓存一致性问题但是对性能有很大损耗当然CPU的设计者也对其进行了优化这里小编不多阐述。
乱序执行指令重排
除了增加高速缓存提高性能以外为了使处理器内部的运算单元尽量被充分利用。处理器可能会对输入的代码进行【乱序执行】优化处理器会在计算之后将乱序执行的结果【进行重组】保证该结果与顺序执行的结果是一致的但不保证程序中各语句的先后执行顺序与输入代码的顺序一致因此如果存在一个计算任务依赖于另一个依赖任务的中间结果那么顺序性不能靠代码的先后顺序来保证。Java虚拟机的即时编译器中也有【指令重排】的优化。
举个例子现在我们有这么一个需求有四条指令这四条指令分别是让四个人在四张纸上写下【新年快乐】四个字。但是在这个过程当中有的人写的快有的人写得慢而如果我们非要按照新年快乐这四个顺序去执行这个工作的话可能时间会浪费的多一点那我们不妨让这四个人分别去写他们这四个字儿我们等着这四个人最后一个写完了然后再把这四个字组合在一起我们就达到目的了这样的乱序执行效率可能会更高一些。
二、JMM——Java内存模型
Java 虚拟机规范中曾经试图定义一种Java内存模型来屏蔽各种硬件和操作系统的内存访问之间的差异以实现让Java程序在各种平台上都能达到一致的内存访问效果。在此之前主流程序语言直接使用物理内存和操作系统的内存模型会由于不同平台的内存模型差异可能导致程序在一套平台上发挥完全正常在另一台就可能发生错误所以在某种常见的场景下必须针对平台来进行代码的编写。
在Java内存模型中仍然是存在可见性问题和指令重排问题的。