計算機科学の分野において、メモリモデルとは、メモリを介したスレッド間の通信やデータの共有アクセスの方法を表現したものである。

歴史と意義 メモリモデルを使用することで、コンパイラは多数の重要な最適化を行えるようになる。loop fusionのようなコンパイラ最適化では、プログラム内のステートメントの移動が行われ、共有されている可能性がある変数の読み取り・書き込みの操作の順序に影響を与える。読み取り・書き込みの操作の変更は競合状態を引き起こすことがある。そのため、メモリモデルがなければ、一般にコンパイラは、マルチスレッドのプログラムを最適化できなくなるか、できるとしても、特殊なケースのみに限定されることになってしまう。

そのため、Javaなどのプログラミング言語ではメモリモデルを実装している。メモリモデルは、同期ブロックや同期メソッドに突入する際のロックの獲得などの、よく定義された特別な同期操作を用いた同期バリアを規定している。また、メモリモデルは、同期バリアに到達した時点で、共有変数の値の変更が他のスレッドから確認できるようにすることも規定している。さらに、競合状態の完全な表記は、メモリバリアに関する順序の操作を通して定義されている。

このようなセマンティクスのおかげで、最適化コンパイラが最適化を施す際に高い自由度が与えられることになる。コンパイラは、同期バリアに到達した時点で、(共有される可能性のある)変数の値が、最適化された場合と最適化されていない場合で、ともに同じ値になることだけを保証すれば良いことになる。特に、同期バリアが含まれないコードブロック内では、コンパイラは文の順序の交換をしても安全であるという前提を置くことができるようになっている。

メモリモデルの分野における研究の大部分は、以下のいずれかに関係している。

競合フリーかつ(より重要かもしれないが)競合状態を含むプログラムに対して十分な保証を与えつつ、コンパイラ最適化に最大限の自由を許すメモリモデルの設計。 プログラムの最適化がメモリモデルの観点から正当であることの証明。

当初、は、よく使われるプログラミング言語のために、包括的なスレッディングメモリモデルを提供しようとしていた。しかし、後に、実装にある種の制約を課さない限り、スレッドをライブラリとして実装することができないこと、そして特に、CおよびC++の標準(C99および)では必要な制約が欠けていることが明らかになると、C++のスレッディング小委員会は、適したメモリモデルを見つけるための作業を開始した。2005年、委員会はCのワーキングドキュメントn1131を提出し、Cの委員会に協力を提案した。提案された最終バージョンのメモリモデルC++ n2429は、2007年10月のKonaにおける会議でC++の標準のドラフトに採択された。このメモリモデルは、次のC++およびCの標準であるC++11およびC11に含まれることになっている。

関連項目 メモリオーダリング メモリバリア

共有メモリ(プロセス間通信)

脚注