Javaのメモリモデル(X)の深い理解 - 概要

プロセッサメモリモデル

シーケンシャル一貫性メモリモデルは、通常、シーケンシャル一貫性メモリモデル基準として設計されます理論的な参照モデル、JMMプロセッサとメモリモデルです。正確な順序は、一貫性モデルのプロセッサとJMMを達成する場合は、プロセッサおよびコンパイラの最適化の多くが無効にする必要がありますので、JMMプロセッサとメモリモデルは、いくつかの緩和を行うには、順次一貫性モデルのデザインになります実行性能が大きな影響を持つことになります。

組み合わせの実行順序のリード/ライト動作の異なるタイプの緩和、共通プロセッサ・メモリ・モデルは、次のタイプに分けることができます。

  1. シーケンシャル読み出し動作を、それによって(TSOと呼ばれる)の合計ストア順序付けメモリモデルを生成する - プログラムが書き込まリラックス。
  2. 上記に基づいて図1に示すように、プログラムが書き込みを緩和し続け - 書き込み動作シーケンス、それによって(PSOと呼ぶ)部分ストア順序メモリ・モデルを生成します。
  3. 書き込みおよび読み取り - - 読み出し動作シーケンスを、それによってメモリモデル緩和メモリ順序(RMOと称する)とPowerPCのメモリ・モデルを作成する上記に基づいて1及び図2に示すように、プログラムが読み込まを緩和し続けます。

プロセッサ読み出し/書き込み動作が緩和されるよう-IF-シリアルセマンティクスに準拠するプロセッサは、データ・プロセッサは、の存在に依存しないので、何のデータ依存性は2つの動作前提(間に存在していないことに留意されたいです2メモリ操作)が並べ替えます。

以下の表に示す詳細な特徴共通プロセッサ・メモリ・モデル:

メモリー・モデル名

それぞれのプロセッサ

ストアのロード並べ替え

ストアストア並べ替え

ロード・ロードおよびロード・ストア並べ替え

あなたは以前に他のプロセッサに書かれた読むことができます

あなたは、以前の書き込みの現在のプロセッサを読むことができます

RELEASE

SPARC-TSO

X64

     

PSO

SPARC-PSO

   

RMO

IA64

 

PowerPCの

PowerPCの

この表では、我々はすべてのプロセッサ・メモリ・モデルを見ることができ、書き込みを許可する - 並べ替え読む理由は第一章で説明:彼らはすべての書き込みキャッシュは書き込みをもたらすことができる、書き込みキャッシュを使用する - 並べ替え読みます。同時に、我々はプロセッサ・メモリ・モデルは、以前の現在のプロセッサを書くために読むことができます見ることができ、その理由は、書き込みキャッシュためもある:ライト・バッファは、現在のプロセッサに表示されているので、この機能は現在のプロセッサよりも多くにつながる可能性他のプロセッサが書かれて一時的にキャッシュに自分の書き込みに保存されている参照してください。

様々なメモリ・モデル・プロセッサ上の表において、上から下に、強いから弱いに対するモデル。複数のプロセッサの性能を追求し、メモリモデルのデザインは弱くなります。これらのプロセッサは、そのメモリモデルは、彼らがパフォーマンスを改善するために多くの最適化として行うことができますので、より良い行きたいので。

JMMより弱い共通プロセッサ・メモリ・モデルので、場所コンパイラをJavaバイトコード命令を生成するリオーダリング処理を制限するためにシーケンス挿入されたメモリバリアに実行されます。様々なプロセッサの強度が異なるプロセッサプラットフォームで一貫性のあるメモリモデルプログラマを示すために、同一のメモリモデルではないので一方、JMM異なるプロセッサは、メモリバリアの数と種類を挿入する必要が彼らは同じではありません。次の図に示す挿入する異なるプロセッサJMMメモリモデルメモリバリアの概略図。

上に示したように、違いはJMMプロセッサ・メモリ・モデルを遮蔽し、それがメモリモデルは、異なるプロセッサのインターネット上の一貫性のあるJavaプログラマで提示します。

JMM、プロセッサ・メモリ・モデルとシーケンシャル一貫性メモリモデルとの間の関係

JMMは、言語レベルのメモリモデルである、プロセッサ・メモリ・モデルは、ハードウェア・レベルのメモリ・モデルであり、シーケンシャル一貫性メモリモデルは、理論的な参照モデルです。以下は、コントラストシーケンシャル一貫性モデルの言語モデルメモリ、プロセッサ・メモリ・モデルと強度であるメモリの概略図です。

グラフから、我々は見ることができます:プロセッサ・メモリ・モデルの一般的な4種類の3弱いメモリモデル、プロセッサのメモリモデルとシーケンシャル一貫性メモリモデルよりも言語のメモリモデルで一般的に使用される言語よりも弱いことが。プロセッサのメモリモデルでは、言語のパフォーマンスの実現をより追求は弱いメモリ・モデルのデザインになります。

JMMデザイン

ビューの設計者の視点からJMM、JMMの設計では、二つの重要な要因を考慮する必要があります。

  • プログラマは、メモリモデルを使用しています。プログラマは、メモリモデルは、プログラムに簡単に、理解しやすいですしたいです。プログラマの希望は、書き込みコードに強力なメモリモデルに基づいています。
  • コンパイラやプロセッサのメモリモデルを実現します。コンパイラやプロセッサのメモリモデルは、彼らがパフォーマンスを向上させるために、多くの最適化として行うことができますように、できるだけそれらをしたいためにバインド。コンパイラとプロセッサは、弱いメモリ・モデルを実現したいと考えています。

一方、コンパイルに、プログラマのためのメモリ保証十分に強いの可視性を提供するために、一方では:JMMの設計においてJSR-133専門家グループのコア目的は良いバランスを見つけることですので、この2つの要因は、互いに矛盾のため、制限、およびプロセッサを極力緩和します。のは、JSR-133は、この目標を達成することである方法を見てみましょう。

説明するために、サンプルコードを計算し、前述の円形の領域を考慮してください。

double pi  = 3.14;    //A
double r   = 1.0;     //B
double area = pi * r * r; //C

円の面積上記のサンプルコードとの関係を計算する前に3 happens-があります。

  1. Bの前にhappens-。
  2. BはCの前happens-。
  3. C前happens-。

B可視、及び前方動作の実行順序A、Bの操作で実行される演算の結果:AはBの前happens-ので、前happens-する定義を必要とするであろう。しかし、プログラムの視点のセマンティクスは、AとBはこれを並べ替えることができますコンパイラやプロセッサの最適化に制約を軽減(プログラムの並べ替え、すなわち実行結果を変更しませんが、また、プログラムの実行のパフォーマンスを向上させることができます)。換言すれば、これら三つhappens-上記の関係前に、2及び3が必要となるが、1は必要ではありません。したがって、JMMは、次の2つのカテゴリに分かれて並べ替えの禁止前happens-:

  • プログラムは、並べ替えの実装の結果を変更します。
  • プログラムは、並べ替えの実装の結果は変更されません。

JMMは、これら二つの異なる性質を並べ替え、異なる戦略を取りました。

  • プログラムのために変更されます結果を並べ替え、JMMは、コンパイラを必要とし、プロセッサは、このような並べ替えを禁止しなければなりません。
  • プログラムの実行結果は変わりません並べ替え、JMMコンパイラやプロセッサが必要とされていません(これはJMMの並べ替えができます)。

以下は、JMMの概略設計です。

ように2つのポイントの図から見ることができます。

  • JMMは、プログラマのニーズを満たすためにプログラマに提供されるルールの前にhappens-。JMMのhappens-ルールだけでなく、簡単に理解するためにも(視認性が、このようなAがBの前にhappens-上記のように、必ずしも本当ではないことを確認するために、いくつかのメモリ)のプログラマの視認性を確保するための強力な十分なメモリを提供する前に。
  • JMMコンパイラとプロセッサは、できるだけバインドされています。彼らは、プログラムの結果を変更しないでください(シングルスレッドプログラムと正しいマルチスレッドプログラムの同期化を参照)、最適化コンパイラおよびプロセッサがどうなるか:私たちは、JMMが実際に基本的な原則に従っている、上記の分析から見ることができます。コンパイラは、慎重に分析した後、単一のスレッドによってアクセスされることができるロックを検出した場合、例えば、ロックを解消することができます。コンパイラは、慎重に分析した後、発見した場合、コンパイラは通常の変数として扱われるために、この揮発性の変数を置くことができるので、他の例としては、揮発性変数は、単一のスレッドのみのアクセスとなります。これらの最適化は、どちらもプログラムの結果を変更しませんが、また、プログラムのパフォーマンスが向上します。

JMMは、メモリの可視性を保証します

種類に応じたプログラムの視認性を確保するために、メモリのJavaプログラムは、次の3つのカテゴリに分けることができます。

  1. プログラムをシングルスレッド。可視性、シングルスレッドプログラムメモリの問題は発生しません。コンパイラ、ランタイム、及びプロセッサは、シーケンシャル一貫性モデルにおけるプログラムの同じシングルスレッドプログラムの実行結果の結果の実施を確保するために協力します。
  2. マルチスレッドプログラムが正しく同期。マルチスレッド・プログラムが正しくシーケンシャル一貫性(同じ配列のメモリ一貫性モデルにおけるプログラムの実行結果のプログラムの実行結果)と同期されます。これは、制限コンパイラやプロセッサを並べ替えることにより、プログラマのためのメモリ保証の可視性を提供するために、注意JMM、JMMの焦点です。
  3. いいえ、同期/マルチスレッドのプログラムが正常に同期されていないされていません。スレッドが書き込まれる前にスレッド実行値、または値を読んで、いずれかのデフォルト値(0、NULL、偽):JMMは、最低限のセキュリティ保証を提供してください。

次の図は、類似点と相違点の逐次一貫性メモリモデルにおけるこれら三つのプログラムでJMMの実施の結果を示しています。

長いマルチスレッドプログラムが正しく同期されると、JMMは、プログラムの結果の実装では、シーケンシャル一貫性メモリモデルと一致して、任意のプロセッサ・プラットフォーム上のプログラムの結果の実現を確実にします。

古いメモリモデルのJSR-133のパッチ

2つの主な理由のJDK5前の旧メモリモデルのJSR-133のパッチ:

  • 揮発性メモリのセマンティクスを強化。旧モデルは、揮発性メモリと、通常の変数の並べ替えが可能になります。JSR-133および揮発書き込みので、共通の変数を並べ替え制限volatile変数 - 読み込みとロック解除 - 同じ捕捉メモリのセマンティクスを持ちます。
  • 最後のメモリセマンティクスを強化。古いメモリモデルでは、同じの最終変数の値が同じではないかもしれない何回も読みました。この理由のため、JSR-133は、二つの照合の最終重量を増加させます。さて、最後の安全性が初期化されています。

===

公開された169元の記事 ウォンの賞賛6 ビュー3509

おすすめ

転載: blog.csdn.net/weixin_42073629/article/details/104742703