メモリモデル (プログラミング)

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

歴史と意義 編集

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

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

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

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

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

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

関連項目 編集

参考文献 編集

  1. ^ Jeremy Manson and Brian Goetz (2004年2月). “JSR 133 (Java Memory Model) FAQ”. 2010年10月18日閲覧。 “The Java Memory Model describes what behaviors are legal in multithreaded code, and how threads may interact through memory. It describes the relationship between variables in a program and the low-level details of storing and retrieving them to and from memory or registers in a real computer system. It does this in a way that can be implemented correctly using a wide variety of hardware and a wide variety of compiler optimizations.
  2. ^ Goetz, Brian (2004年2月24日). “Fixing the Java Memory Model, Part 1”. 2008年2月17日閲覧。
  3. ^ Buhr, Peter A. (September 11, 1995). Are Safe Concurrency Libraries Possible?. http://plg.uwaterloo.ca/usystem/pub/uSystem/LibraryApproach.pdf 2015年5月12日閲覧。. 
  4. ^ Boehm, Hans-J. (2004年11月12日). “Threads Cannot be Implemented as a Library”. 2015年5月12日閲覧。
  5. ^ Boehm, Hans (2005年8月26日). “Implications of C++ Memory Model Discussions on the C Language”. www.open-std.org. 2015年5月12日閲覧。
  6. ^ WG21/N2429: Concurrency memory model (final revision)”. www.open-std.org (2007年10月5日). 2015年5月12日閲覧。
  7. ^ N2480: A Less Formal Explanation of the Proposed C++ Concurrency Memory Model”. www.open-std.org. 2015年5月12日閲覧。
  8. ^ Alexandrescu, Andrei (2005年3月4日). “Memory Model for Multithreaded C++: Issues”. 2014年4月24日閲覧。 “C++ threading libraries are in the awkward situation of specifying (implicitly or explicitly) an extended memory model for C++ in order to specify program execution.We propose integrating a memory model suitable for multithreaded execution into the C++ Standard.
  9. ^ Boehm, Hans. “Threads and memory model for C++”. 2014年4月24日閲覧。 “This [link farm] provides information related to the effort to clarify the meaning of multi-threaded C++ programs, and to provide some standard thread-related APIs where those are currently missing.