Wikipedia的一致性模型页面列出了共享内存架构的四种一致性模型,它们需要程序员进行特定的显式同步(按从强到弱的顺序):
1.弱有序:
将内存操作分为两类:“数据操作”和“同步操作”。同步操作向处理器发出信号,以确保它已经完成并看到所有处理器完成的所有先前操作。
1.放行一致性:
区分进入同步操作和退出同步操作。在进入临界段期间(称为“获取”),需要完成与本地内存变量有关的所有操作。在退出期间(称为“释放”),本地处理器所做的所有更改都应传播到所有其他处理器。
1.输入一致性:
每个共享变量都被分配了一个特定于它的同步变量。当"获取“是针对变量x时,所有与x相关的操作都需要相对于该处理器完成。当”释放“是针对变量x时,所有与x相关的更改都应该传播。
1.局部一致性:
每个进程都按照其程序定义的顺序执行自己的操作。其它进程的写操作执行的顺序没有限制。
其中许多看起来类似于C内存顺序模型。有人能给予出这些概念到C内存顺序模型的正确Map吗?。
1条答案
按热度按时间k10s72fa1#
我不确定C内存顺序模型是否源自这些模型,但它们确实很好地Map到了这些一致性模型。
1.弱序:
使用C序列一致性围栏确实对应于弱排序中的“同步操作”。
1.放行一致性:
这有两种(也提到在维基百科页面链接的问题)
RCsc:C顺序一致操作的使用Map到发布一致性中的“acquire”和“release”操作(同步操作之间具有顺序一致性)。
RCpc:C release-acquire操作的使用Map到“acquire”和“release”操作的发布一致性(同步操作之间的处理器一致性)。
1.输入一致性:
在C中,最接近这些的方法是使用C释放-消费操作。但是,在这种情况下,释放操作确实同步了整个内存,而不仅仅是依赖操作。也许,由于其复杂性,C没有费心添加一个生产操作。还要注意,即使消费操作存在,在大多数实现中,它被实现为获取。我也听说到目前为止不鼓励使用它。
另外,根据对称性,进入一致性也可能有两种类型-- ECsc和ECpc --虽然维基百科上没有提到,在这种情况下,我认为释放-消费模型与ECpc接近。
1.局部一致性:
这是单线程C程序的默认模型。如果你使用多线程共享数据,那么必须使用宽松原子。
我不知道释放-获取和释放-消费栅栏应该放在哪里,它们看起来比释放一致性模型更强,但肯定比弱排序弱。