CPU的性能优化

1、CPU的缓存
CPU存在三级缓存分别是L1,L2,L3,其中L1的大小在32-4096KB,缓存的大小也是从L1到L3逐渐增加,其中大多数情况下是多核CPU共享一个L3缓存。
CPU读取数据的时候是先读取L1,然后L2,最后L3,要是缓存中没有的话才从主存中读取,最后主存中也咩有的话就从外存中读取。
然后每个CPU都有自己的缓存那么怎么保证的数据一致性呢,就是通过 缓存同步协议。
1.1、缓存同步协
缓存一致性规定缓存要有四种状态。分别是1、修改态,2、专有态,3、共享态,4、无效态
1、修改态:缓存中的数据已经相对于主存有修改了,属于缓存专有。
2、专有态:缓存和主存中的数据相同,属于缓存专有。
3、共享态:缓存和主存中的数据相同,属于缓存专有。
4、无效态:缓存和主存中的数据已经不同,切该cache已经无效。
多核CPU中,CPU对于数据的修改需要通知给其他的CPU。
那就意味着,多核CPU在执行的时候不仅要控制自己的数据读写,同时还要监听别的CPU对数据的读写。从而保证数据的一致性。

2、指令重排序
第二个CPU对对于代码执行效率的优化是指令重排序
指令重排序是指CPU在不改变程序执行结果的情况下对执行的指令进行优化。这里遵循 as-if-serial 原则,as-if-serial 原则就是CPU不会对有数据依赖的执行指令进行重排。这也是为了保证程序的正确性。

这里会遇到两个问题:
问题一、
由于每个CPU操作的是他对应的缓存中的数据,在统一时刻各个CPU可能看到的统一地址的数据是不一致的。
问题二、
在多核多线程情况下,as-if-serial 会失效。
为了解决以上问题。出现了内存屏障。
内存屏障
1、写内存屏障(Store Memory Burrier),在指令后面插入写内存屏障(Story Burrier),就是强制将数据先写进内存,并且CPU不会为了性能而进行指令重排序。
2、读内存屏障(Load Memory Burrier),在指令前面插入读内存屏障(Load Burrier),就是强制所有的CPU说该内存的数据已经失效,必须从主存中进行读取。
以上的内存屏障就是为了保证缓存和主存的数据一致性。

你可能感兴趣的:(CPU的性能优化)