シーケンシャル一貫性の定義
シーケンシャル一貫性の正確な定義は、レスリー・ランポートの弟(後に我々は彼に何回かに言及します)から来ています。
彼は元々共有メモリマルチCPUの並列計算に基づいて、一貫性モデルを定義しただけでなく、実際には、マルチCPUの並列コンピューティングは、分散システムとみなすことができ、分散システムに拡張することができます。
モデルが定義されています
すべてのプロセッサの動作は、いくつかの連続した順序で実行されたかのように、任意の実行の結果は同じであり、それぞれの個々のプロセッサの動作は、プログラムによって指定された順序で順に表示されます
分散システムに、すべてのノードのすべての操作が同じノードの遺跡から動作し、ソートした後、順番に実行されますが、この順番シーケンスであれば、システムが稼働しているかに関係なく、結果が得られていることを意味それらがノードに指定されているため。
シーケンシャル一貫性の例
一貫して私たちはいくつかの例を見て不自然に読ん言っレスリー・ランポートの弟。左から右へ図物理的時間は、Wは、(a)は、Rは、(a)は、読み出しデータを表すデータを書き込む表す表します。
2つのシステムが完璧ではないことがわかるが、形質転換により、常に定義が順番に見つけることができます満たしていることを、正当化することができますので、彼らのモデルは、シーケンシャル一貫として見ることができます。
シーケンシャル一貫性とハードウェア
也许有人会问,同一个进程中保留操作顺序不是显而易见的么?实际上随着硬件技术,尤其是多核、多CPU技术的发展,一个CPU核心运行的进程,不一定能观测到另一个核心进程的操作顺序。
在论文中,Leslie Lamport老哥举了这样一个例子,有一个互斥算法,要求两个进程不能同时执行临界区方法,a和b两个变量初始值为0。正常情况下,最多一个进程执行临界区方法。
进程1执行序列如下:
a = 1
if (b!=0){
临界区方法
}
进程2执行序列如下:
b = 1
if (a!=0){
临界区方法
}
这个程序在多核CPU机器上运行时,有可能两个进程同时进入临界区。为什么呢?
我们先看一下现代CPU的架构
CPU一般具有多个核心,每个核心都有自己的L1 cache和L2 cache,cache之上还有Load Buffer和Store Buffer。写入时,处理器很有可能仅仅将数据写入Store Buffer,稍后再将Store Buffer中的数据统一写回cache,有可能再过一会儿才将cache的数据写回内存。同样,一个核心读取的数据说不定也已经被另一个核心修改过,只是它不知道而已。
所以上述进程对a和b的赋值,很有可能没被对方感知。
为了保证Sequential Consistency,Leslie Lamport老哥在论文中提出了两个要求:
Each processor issues memory requests in the order specified by its program
Memory requests from all processors issued to an individual memory module are serviced from a single FIFO queue. Issuing a memory request consists of entering the request on this queue.
彼らはハードウェアレベルでシーケンシャル一貫性を満たしている場合でも、確かに大幅にそれはこれらのジョブを行うソフトウェア開発者の上位層になり、一般的に、効率が低下します。