JavaのメモリモデルのXII-深い理解

Javaのメモリモデルの深い理解

[1] CPUとキャッシュの一貫

IMG

我々は、すべてのプログラムの実施におけるコンピュータは、各命令をCPUで実行されることを知っている必要があり、時間の実装では、彼らは必然的にデータを操作する必要があります。上記のデータとメインメモリに格納されたコンピュータ、コンピュータその即ち物理メモリ。

最初は、まだなく、CPUの技術、より高速CPUの実行速度の発展とともに、平和に住んでいます。そして、メモリ技術はあまり変わっていないので、実行速度が読み込まれ、ギャップの方法に比べて、メモリとCPUからのデータを書き込むためには、各操作のメモリにCPUを過ごすために持っている原因と、増加されます待ち時間がたくさん。

だから、人々はCPUとメモリ間のキャッシュを増やすことである良い方法を思いつきました。我々はすべて知っているキャッシュの概念は、データのコピーを保存することです。彼は速く、小さなメモリ、および高価なことを特徴としています。

その後、プログラムの実行は次のようになります。

プログラムが実行されている場合は、操作がデータから前記データを読み出すために、直接そのキャッシュを書くことができ、その後CPUを算出し、キャッシュのメインメモリコピーにCPUからのデータが必要になります操作の終了後、メインメモリへのデータ・キャッシュは、それらを更新します。

キャッシュを増加させるCPUとメインメモリとの間のマルチスレッドシナリオで存在することができるキャッシュ・コヒーレンスの問題、すなわち、マルチコアCPUで、各コア独自のキャッシュであり、同一のデータのキャッシュコンテンツよいです矛盾。

[2]及び最適化処理命令を再配列

上記CPUとメインメモリキャッシュの増加との間では、マルチスレッドのシナリオが存在するであろうキャッシュ・コヒーレンスの問題この場合に加えて、ハードウェアの問題は、より重要であるがあります。それは、完全に可能な限り利用することができ、プロセッサは、注文コード入力処理から実行することができるプロセッサの演算部の内部をもたらすことです。これは、プロセッサの最適化

注文処理のうち、コードを最適化する現在の人気のプロセッサに加えて、多くのプログラミング言語コンパイラは、Java仮想マシンのタイムコンパイラ(JIT)と同様の最適化が、どうなる必要がありますコマンド転位を

1つは、プロセッサとコンパイラ命令の並べ替えを最適化するために許可されている場合、それは様々な問題につながる可能性があることを想像することができます。

ソリューション:メモリバリア

[3] Javaのメモリモデルとは何ですか

メモリモデル

共有メモリ(可視性、順序、アトミック性)を確保するために、共有メモリモデルは、定義されたメモリシステム内の仕様は、マルチスレッド・プログラムの動作の読み出し動作と書き込み。これらのルールは、読み取りおよび実行の正確さを保証するように、メモリへの書き込み動作を制御します。

Javaのメモリモデル(Javaのメモリモデル、JMM)は、メモリに異なるハードウェアとオペレーティングシステムへのアクセスの様々な違いJavaプログラムをマスクするために使用するJava仮想マシンによって定義された仕様であり、これは別のJavaプログラムの様々な達成することができますプラットフォーム上に均一なメモリアクセスを実現しています。

IMG

Javaのメモリモデルの主な目的は、プログラムのアクセスルールで変数を定義することです。すなわち、メインメモリに格納された変数で仮想マシンまたはメインメモリから抽出されたような変数の低レベルの詳細です。私たちはここでその変数に注意するJavaプログラム変数を記述することはまったく同じではありません。変数は、ここでの方法のローカル変数とパラメータ(それはスレッドに対してプライベートであるため)を含むインスタンスフィールド、静的フィールド、配列オブジェクトを構成する要素ではなくなります。

関連するJavaメモリー・モデルの概念は、以下のとおりです。

  • メインメモリ:Java仮想マシンは、それがメインメモリ上に生成しなければなりません(変数がプログラムに含まれていない)すべての変数が必要です。そのマシンの前に物理的なメインメモリに比べて、しかし、マシンのメインメモリは、全体の物理マシンのメモリであり、仮想マシンのメインメモリは仮想マシンのメモリの一部であることができます。
  • ワーキングメモリ:Java仮想マシンは、各スレッドは、独自のワーキングメモリを持っている、メモリはスレッドプライベートです。そのキャッシュの正面に匹敵します。メモリワーカースレッドは、メインメモリ内の変数のコピーを保存する必要があります。VMは、メインメモリ変数へのスレッドの変更はメモリスレッドが直接メモリ内の主な変数を読み書きすることができない作業である必要があります提供します。異なるスレッド間で互いのワーキングメモリにアクセスすることはできません。変数の値は、スレッド間を通過する必要がされている場合は、メインメモリの仲介を通過しなければなりません。

対応強制場合はワーキングメモリとメインメモリが分割され、Javaヒープ、スタック、分割方法の異なるゾーンは、両者の関係が実質的にない、メインメモリヒープインスタンスがスタックの一部領域に対応するワーキングメモリ、データの一部として理解されるべき

Javaヒープ、スタック、メソッド領域について:学習にクリックしてください

[4]揮発性メモリセマンティクス

不揮発性メモリの書き込みセマンティクス:
可変時間を書くとき、スレッドをJMMますプライベートメモリはメインメモリへの共有変数の値を更新し、その値が無効であることが他のスレッドに設定されている。
読み込むための不揮発性メモリの意味:
可変時間を読んだとき、JMMは、最初の障害は、次のスレッドがメインメモリ変数から読み込まれた場合にプライベートな空間での値は、無効であるかどうかを決定します。

詳細については、以下を参照してください学ぶためにクリックしてください

[5]キーメモリのセマンティクス

スレッドがロックを解放すると、JMMは、メインメモリにフラッシュスレッドローカルメモリの共有変数に対応するであろう。

スレッドがロックを取得するときに、JMMは、ローカルメモリに対応するスレッドがデアサートされるであろう。モニターによって保護されたコードのクリティカル領域が、メインメモリから読み出すための変数を共有しなければならないことになります。

詳細については、以下を参照してください学ぶためにクリックしてください

おすすめ

転載: www.cnblogs.com/lee0527/p/11729698.html