Javaメモリモデルの理解

3839 ワード

Javaメモリモデル
Javaメモリモデルは,マルチスレッドプログラムでどのような動作が許可され,どのような動作が禁止されるかを規定している.これは少し抽象的かもしれませんが、角度を変えましょう.プログラム動作を読み取り操作と書き込み操作に抽象化し、各スレッドには独自のローカル変数があり、スレッド間には共有変数も存在する.マルチスレッドプログラムの実行が終了すると、すべての変数に最終値が表示されます.Javaメモリモデルは、どのような値が合法的で、どのような値が合法的でないかを決定します.
メモリモデルはあまり厳しく要求することはできません.これにより、多くの最適化方法が阻害され、プログラムの実行効率が低下しますが、あまり緩やかに要求することはできません.これは、いくつかの実行結果が私たちの直感に反するためです.例えば、命令間の並べ替え問題では、スレッド内部の命令がプログラムで指定された順序で完全に実行され、命令が実行されるたびに実行結果が直ちに有効になると、多くの最適化方法が阻害されるが、プログラムの実行結果を容易に推定できるため、プログラマにとって有利である.このように書くプログラムは自分の意図と一致しやすい.このメモリモデルは、シーケンス整合性モデル(Sequential Consistency)と呼ばれる.逆に,プログラムの実行効率を最適化するために並べ替えの可能性が多ければ,プログラムの効率は向上するが,プログラマにとってプログラムの実行結果を推定することは困難である.このクラスのメモリモデルはRelaxed Memory Modelと呼ばれています.
このようにして、私たちは2つの困難な問題に直面しました.
  • メモリモデルは厳格で、プログラム効率は低いが、プログラマーは
  • に書きやすい.
  • メモリモデルは緩やかであることが要求され、プログラムの効率は高いが、プログラマーは
  • を書くのは容易ではない.
    プログラムの効率は、プログラムが書きやすいかどうかにかかっている.この問題を解決するために、科学者はData Race Freeの概念を提出して、それはマルチスレッドプログラムの同期の程度の1種の説明で、基本的な思想はマルチスレッドプログラムが正しい同期を行ったならば、プログラマーは順序の一致性の模型によってプログラムの実行結果を推定することができて、底層のメモリ操作の実現に対して、最適化は、Relaxed Memory Modelに従って行うことができます.
    Javaメモリモデルには2つの側面が含まれています
  • 正しい同期のマルチスレッドプログラムに対して、その実行結果がシーケンスメモリモデルの下で実行する結果と一致することを保証する
  • .
  • は、正確な同期要求がないマルチスレッドプログラムに対して、セキュリティを保証するためにある程度の制限を行う
  • .
    このうち第1の側面はData Race Freeに関連し,第2の側面は後述するCausality Requirementsに関連している.
    Data Race Free
    Javaメモリモデルは、正しい同期とは何かを説明するためにいくつかの概念を定義しています.
  • コンフリクトアクセス
  • 複数のスレッドが存在し、同じアドレスに同時にアクセスし、少なくとも1つが書き込み操作である場合、このプログラムには競合アクセスがあります.
  • happen-before order

  • 2つのオペレーションの間に次のいずれかの条件が満たされると、happen-before orderが存在すると言える.
  • 同じスレッド内で、プログラムに前後順の操作
  • がある.
  • コンストラクタの最後の動作とfinalize関数の開始の動作
  • unlock操作は、すべての同じロック上のlock操作
  • とする.
  • volatile変数の読み取り操作とその書き込み操作
  • 変数のデフォルト値に対する書き込み操作とスレッド起動後の最初の操作
  • スレッドT 2がスレッドT 1の実行終了を検出すると、T 1の最後の動作は、T 2の任意の動作
  • となる.
  • は、スレッド内の第1の動作
  • と1つのスレッドの動作を開始する.
  • スレッドT 1がスレッドT 2を中断した場合、この中断動作は、T 2が中断されたのを見た他の任意の動作との間にある.

  • 中には私もよく理解していないものもあります.の
  • data race free

  • 競合アクセスのあるすべての操作の間にhappen-before orderがある場合、このマルチスレッドプログラムはdata race freeを満たす
  • 正しい同期
  • マルチスレッドプログラムがシーケンス整合性モデルの下で実行され、data race freeを満たす場合、このプログラムは正しい同期を行います.
    シーケンスコンシステンシモデルでの実行結果と一致する正確に同期されたマルチスレッドプログラム.概念の関係をよく体得する.ちょっと回ります.
    一方,プログラムが正しく同期されていない場合,実行結果も任意ではないため,制限しなければならないが,制限は強すぎず,強すぎると最適化が阻害されるためである.JavaメモリモデルはCausality Requirementsの概念を使用しています.
    Causality Requirements
    メモリモデルを正確に定義するために,Java言語仕様ではCausality Requirementsの概念を提案した.なぜか分からないが、この概念はあまり言及されていないが、私はそれが重要だと思っているが、同時に、非常に理解しにくい.言語仕様では、まずWell-Formed Executionsの概念が定義されています.現在、メモリモデルに関する多くの議論は、マルチスレッドプログラムの実行において、ロック、volatile変数、実行順序などに関する規定が含まれています.マルチスレッドプログラムの実行がこれらの規定を満たす場合、この実行はWell-Formed Executionsのものである.国内には「Javaメモリモデルを深く理解する」という一連の文章があり、主にこの方面でJavaメモリモデルを説明している.また、Javaコンカレント分野で有名なDoug LeaもThe JSR-133 Cookbook for Compiler Writersを提供し、コンパイラの著者たちに参考を提供し、検討しているのもこの方面の問題である.しかし、メモリモデルがマルチスレッドプログラムの実行に合法かどうかは、Well-Formed Executionsであるかどうかだけでなく、Causality Requirementsを満たす必要があります.
    言語仕様には、マルチスレッドプログラムの最終的な実行結果を構築できる構造プロセスが規定されており、今回の実行はCausality Requirementsを満たす.コンストラクションプロセスは、空の集合C 0から開始され、その中にいくつかの操作が追加されるたびに、すべての操作が追加されると、コンストラクションは成功する.すなわち、
    C0 -> C1 -> C2 -> ... -> C
    

    ここでC_iはC_(i+1)のサブセット.前に言った「操作が追加できる」ということに気づいたかもしれませんが、操作が追加できるとは何ですか?言語仕様では、各Ciが1つのEiに対応し、すべてのEiがWell-Formed Executionsを満たすことが規定されています.つまり、操作を追加した後、対応するEiがWell-Formed Executionsを満たしていない場合、この操作は追加できません.最終的に、マルチスレッドプログラムがこのような実行チェーンを構築できない場合は、その実行結果は不正です.
    また、Javaメモリモデルの最初の論文の著者は、Causality Test Casesというエントリがあり、Causality Requirementsを満たす行為と満たさない行為を理解するための小さな例を示したページThe Java Memory Modelを維持した.また、Javaコンカレント分野で有名なDoug LeaもThe JSR-133 Cookbook for Compiler Writersを提供し、コンパイラの著者たちに参考を提供しています.しかし、この規範には厳しいところがあると言われていますが、開発者たちはJava言語規範と仮想マシン規範に基づいて開発しています.
    参考資料:Java言語仕様のメモリモデル
    転載先:https://www.cnblogs.com/Iambda/p/3933450.html