メモリオーダリング
メモリオーダリング（）とは、CPUによるコンピュータメモリへのアクセス順序を表わす。この言葉は、コンパイル時のコンパイラに生成されるメモリオーダリングか、実行時にCPUによって生成されるメモリオーダリングのいずれかを指す。
近代的なマイクロプロセッサでは、メモリオーダリングはメモリ操作の順番を入れ替えるCPUの特性を示す。メモリリオーダリングはアウト・オブ・オーダー実行の一種であり、キャッシュメモリやメモリバンクといった異なるタイプのメモリのバスを最大限に有効活用するために利用される。
現在のほとんどのユニプロセッサのメモリ操作は、プログラムコードで指定された順番では実行されない。シングルスレッドのプログラムでは、すべてのアウト・オブ・オーダー実行はプログラマから隠され、すべての命令は順番通りに実行されたように見える。しかしながら、マルチスレッド環境（もしくはメモリバスで他のハードウェアと接続されている場合）では、問題が起こりえる。この場合、問題を避けるためにはメモリバリアを使わなければならない。
コンパイラはコンパイル時に、命令の実行順序を自由に入れ替えることができる。しかし、メモリアクセスの順番が重要な場合、問題が起きる。
これらのバリアは、コンパイラがコンパイル時に命令を入れ替えないように抑制する一方で、実行時のCPUによるリオーダリングを抑制することはできない。
asm volatile("" ::: "memory");
は、GCCコンパイラが、その前後の読み書き命令を入れ替えることを禁止する。
__memory_barrier()
という固有の機能を使う。
_ReadWriteBarrier()
が存在する。
SMPにはいくつかのメモリ一貫性モデルが存在する：
いくつかのCPUでは、