缓存与指令乱序执行怎么回事-CPU层面知识

缓存与指令乱序到底是怎么回事

缓存

首先我们要明白缓存的出现是为了加速程序的执行过程,提升效率。为什么这样说呢?因为程序的执行是在CPU中来完成的,而程序的驻留地确实硬盘,程序需要先从硬盘加载到内存,然后再读入CPU当中才能执行,而硬盘、内存、CPU的读写数据能力相差极大(好几个数量级),为了缓解三者之间读写数据速度问题,因此引入了缓存,缓存一般在CPU当中(一般有三层缓存)。

块处理

在引入缓存后,出现了一种块处理方式(读取数据进入缓存时会将所需数据和与之相邻的数据都读入缓存【相邻数据可能为下次所需数据】)这样读入缓存的总是一块数据。

缓存一致性问题

引入缓存后,这样数据可能分布在不同的物理存储块上,这样会引发一种问题,各物理块上的数据可能存在数据不一致问题即缓存一致性问题。

解决办法

1.常用 MESI(Modified Exclusive Shared Or Invalid)(也称为伊利诺斯协议,是因为该协议由伊利诺斯州立大学提出)是一种广泛使用的支持写回策略的缓存一致性协议
2.锁总线
注:参考 缓存一致性协议

指令乱序

为了进一步提升程序的运行效率,一般在CPU层面将会允许指令重排序。那么什么是指令重排序呢?
程序中指令顺序为:
order1
order2
order3

但在执行时并不一定按照上述顺序执行,这个过程称为指令重排序。如果程序只在单线程下运行,这样执行并没有什么影响(会有个结果一致性来确保程序执行结果的准确性),但在多线程环境下这样乱序执行则无法保证结果的准确性(线程间存在共享资源时)。

禁止乱序

1.CPU层面:可通过一些原语来处理
2.jvm:hanppens-before原则 和内存屏障

注:
jvm层面的解决实际上还是得依靠虚拟机的最终实现(实际还得归到CPU层)我们应该认识到jvm只是一个中间平台,具体解决还得看CPU
原语:控制硬件的汇编语言
内存屏障:只是个名词而已,相当于在两条指令之间加了个隔断,上下指令不能重排序

原创文章 4 获赞 6 访问量 297

猜你喜欢

转载自blog.csdn.net/IT_0008/article/details/105716391