目录
基础概念
【摘自网络】
- 寄存器:(register)寄存器是 CPU 内部用来存放数据的一些小型存储区域,用来暂时存放参与运算的数据和运算结果。它的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。
- 高速缓 存:(Cache)其原始意义是指存取速度比一般随机存取记忆体(RAM)来得快的一种RAM,一般而言它不像系统主记忆体那样使用DRAM技术,而使用昂贵但较快速的SRAM技术,也有快取记忆体的名称。
高速缓冲存储器是存在于主存与CPU之间的一级存储器, 由静态存储芯片(SRAM)组成,容量比较小但速度比主存高得多, 接近于CPU的速度。在计算机存储系统的层次结构中,是介于中央处理器和主存储器之间的高速小容量存储器。它和主存储器一起构成一级的存储器。高速缓冲存储器和主存储器之间信息的调度和传送是由硬件自动进行的。
- 写缓冲器:写缓冲器是一个非常小的告高速存储缓冲器,用来临时存放处理器将要写入到主存中的数据,然后写缓冲器再以低速写入主存中。这就将高速的CPU和cache从对主存的低速读写中脱离了出来。
可见性问题
1、每个处理器都有自己的寄存器(register),所以多个处理器各自运行一个线程的时候,可能导致某个变量存放在各自的寄存器中,其他处理器无法看到该处理器的变量值修改;
2、处理器运行的线程对变量的修改要保存在写缓存器,而不是直接更新到主内存中,其他处理器无法获得最新的变量;
3、有些系统会在保存变量在写缓存器后,同步更新到高速缓存,并且会把这个更新通知给其他处理器,但其他处理器可能把这个更新放到无效队列中,导致没有更细各自的缓存。
上面三种情况出现可见性问题,底层硬件确定通过了一个 MESI 协议,不同的底层系统,针对可见性问题会有不同的实现
MESI 协议同步实现
MESI 协议、flush处理器缓存和refresh处理器缓存整套机制来保证可见性的。
flush处理器缓存
会将更新的变量(强制)刷新到高速缓存(或者主内存),并发送一个消息到总线,通知其他处理器,某个变量的值被修改了。
refresh处理器缓存
处理器从总线嗅探,发现其他处理器中变量更新的消息,必须强制会从其他高速缓存(或是主内存)中读取这个最新的值,并更新到自己的高速缓存。