Memory management 多处理器中存储缓冲区的顺序一致性?

Memory management 多处理器中存储缓冲区的顺序一致性?,memory-management,architecture,multiprocessing,buffer,Memory Management,Architecture,Multiprocessing,Buffer,具有写缓冲区的多处理器如何保持顺序一致性? 据我所知,在单处理器中,如果缓冲区是FIFO,并且对主存上待写元素的读取由缓冲区提供,则它会保持一致性。 但是它在国会议员中是如何运作的呢?我认为如果一个处理器在他的缓冲区中放置了一个存储,另一个处理器就不能读取它,我认为这会破坏顺序一致性 在每个线程都有写缓冲区的多线程环境中,它是如何工作的?它还会破坏顺序一致性吗 你提到: 通常,CPU只能看到随机访问;内存总线被顺序访问的事实对CPU本身是隐藏的,因此从CPU的角度来看,这里不涉及FIFO 在S

具有写缓冲区的多处理器如何保持顺序一致性? 据我所知,在单处理器中,如果缓冲区是FIFO,并且对主存上待写元素的读取由缓冲区提供,则它会保持一致性。 但是它在国会议员中是如何运作的呢?我认为如果一个处理器在他的缓冲区中放置了一个存储,另一个处理器就不能读取它,我认为这会破坏顺序一致性

  • 在每个线程都有写缓冲区的多线程环境中,它是如何工作的?它还会破坏顺序一致性吗

  • 你提到:

    通常,CPU只能看到随机访问;内存总线被顺序访问的事实对CPU本身是隐藏的,因此从CPU的角度来看,这里不涉及FIFO

    在SMP现代机器中,有所谓的嗅探控制单元,用于监视内存传输,并在必要时使RAM的缓存副本无效。所以有专门的硬件来确保数据是同步的。这并不意味着它是真正同步的——获取无效数据的方法总是不止一种(例如,在另一个CPU内核更改内存值之前,已经将内存值加载到寄存器中),但这正是您所得到的

    此外,多线程基本上是一个软件概念。因此,如果需要同步软件FIFO,则需要使用适当的锁定机制。

    您提到:

    通常,CPU只能看到随机访问;内存总线被顺序访问的事实对CPU本身是隐藏的,因此从CPU的角度来看,这里不涉及FIFO

    在SMP现代机器中,有所谓的嗅探控制单元,用于监视内存传输,并在必要时使RAM的缓存副本无效。所以有专门的硬件来确保数据是同步的。这并不意味着它是真正同步的——获取无效数据的方法总是不止一种(例如,在另一个CPU内核更改内存值之前,已经将内存值加载到寄存器中),但这正是您所得到的

    此外,多线程基本上是一个软件概念。因此,如果需要同步软件FIFO,则需要使用适当的锁定机制。

    我在这里假设为X86

    存储缓冲区中的存储本身不是问题所在。例如,如果CPU只进行存储,并且存储缓冲区中的存储都按顺序退役,那么它的行为将与没有存储缓冲区的处理器完全相同。对于SC,不需要保留实时订单

    您已经指出,处理器将按顺序在存储缓冲区中看到自己的存储。违反SC的部分是当存储后面跟着加载到不同地址时

    想象一下

    A=1
    r1=B
    
    然后,在没有存储缓冲区的情况下,首先将的存储写入缓存/内存。然后从缓存/内存中读取B

    但是使用存储缓冲区时,B的负载可能会超过a的存储。因此,在a的存储写入缓存/内存之前,负载将从缓存/内存中读取

    SC使用存储缓冲区中断的典型示例是Dekkers算法

    lock_a=1
    while(lock_b==1){
       if(turn == b){
          lock_a=0
          while(lock_b==1);
          lock_a=1
       }
    }
    
    因此,在顶部,您可以看到存储的
    lock_a=1
    ,后面是加载的
    lock_b
    。由于存储缓冲区的原因,这两个线程可能会被重新排序,因此有两个线程可能会进入关键部分

    解决这个问题的一种方法是在加载和存储之间添加一个[StoreLoad]围栏,它防止在存储缓冲区耗尽之前执行加载。这样可以恢复SC

    注1:存储缓冲区为每个CPU;不是每个线程

    注2:存储(和加载)缓冲区在缓存之前。

    我在这里假设为X86

    存储缓冲区中的存储本身不是问题所在。例如,如果CPU只进行存储,并且存储缓冲区中的存储都按顺序退役,那么它的行为将与没有存储缓冲区的处理器完全相同。对于SC,不需要保留实时订单

    您已经指出,处理器将按顺序在存储缓冲区中看到自己的存储。违反SC的部分是当存储后面跟着加载到不同地址时

    想象一下

    A=1
    r1=B
    
    然后,在没有存储缓冲区的情况下,首先将的存储写入缓存/内存。然后从缓存/内存中读取B

    但是使用存储缓冲区时,B的负载可能会超过a的存储。因此,在a的存储写入缓存/内存之前,负载将从缓存/内存中读取

    SC使用存储缓冲区中断的典型示例是Dekkers算法

    lock_a=1
    while(lock_b==1){
       if(turn == b){
          lock_a=0
          while(lock_b==1);
          lock_a=1
       }
    }
    
    因此,在顶部,您可以看到存储的
    lock_a=1
    ,后面是加载的
    lock_b
    。由于存储缓冲区的原因,这两个线程可能会被重新排序,因此有两个线程可能会进入关键部分

    解决这个问题的一种方法是在加载和存储之间添加一个[StoreLoad]围栏,它防止在存储缓冲区耗尽之前执行加载。这样可以恢复SC

    注1:存储缓冲区为每个CPU;不是每个线程


    注2:存储(和加载)缓冲区在缓存之前。

    我们谈论的是哪种FIFO?有哪种FIFO?我只知道一种FIFO。我也接受基于软件或硬件中各种写缓冲区FIFO的答案。由CPU控制的硬件FIFO,由其他硬件控制。有锁定机制的FIFO,没有…这里的核心问题是:你的问题是关于硬件FIFO还是软件FIFO?关于硬件请问我们谈论的是什么类型的FIFO?有什么类型的FIFO?我只知道一种FIFO。我也接受基于软件或硬件中各种写缓冲区FIFO的答案。由CPU控制的硬件FIFO,co