2016-07-16 2 views
4

私の理解では、JSR-133 cookbookは一連のメモリバリアを使用してJavaメモリモデルを実装する方法のよく引用されたガイドです少なくとも可視性の保証)。JSR-133 cookbookは、Javaメモリモデルによって保証されたすべての保証をどのように実施しますか

また、StoreLoadは、すべてのCPUバッファがキャッシュにフラッシュされることを保証する唯一のものであるため、(店舗転送を避けることによって)新鮮な読み取りを保証し、観測を保証するバリアの種類に基づいて理解しています。キャッシュの一貫性のために最新の値の

私は、揮発性/通常の店舗/荷物の異なるプログラム順の間引きと、必要とされるメモリ障壁とに必要な特定の障壁のテーブルを見ていました。

私の直感からは、この表は不完全なようです。たとえば、Javaメモリーモデルは、更新される値が不揮発性であっても、別のスレッドでリリースされる前に実行されたすべてのアクションに対するモニターの取得アクションの可視性を保証します。上記のリンクの表では、CPUバッファをフラッシュして変更を伝播/新しい変更を監視できる唯一の動作は、揮発性ストアまたはMonitorExitとそれに続く揮発性ロードまたはMonitorEnterです。これらの操作(表によると)がLoadStoreとStoreStoreのみを使用している場合、私の理解からはスレッドの再順序付けに関係しており、前に発生したことを実行できないとき保証(スレッド間)。

私はここで私の理解に間違っていますか?あるいは、この実装は、モニターの獲得/解放に関する同期の保証や追加のアクションの前に行われます。

おかげ

+0

ありがとうございます。 –

答えて

1

StoreLoadは、すべてのCPUバッファをキャッシュし、したがって、新鮮確実にフラッシュされる保証だけは(店舗の転送を回避することにより)、読み込みとによるキャッシュ・コヒーレンシに最新の値を観察することが保証されています。

これはx86アーキテクチャでも当てはまるかもしれませんが、抽象化のレベルについて考えるべきではありません。キャッシュ一貫性が、プロセッサが実行されるのに費用がかかる場合があります。

たとえば、モバイルデバイスを使用する場合、重要な目標の1つは、バッテリ使用プログラムの消費量を削減することです。その場合、キャッシュ一貫性に関与せず、StoreLoadはこの機能を失います。

私は、障壁は私の上記の例では、視認性を保証することができるか見ていないとき、それらの操作(表に従って)のみを使用私の理解から糸で再配列を有する唯一の懸念しているLoadStoreとStoreStore (スレッド間で)保証の前に起こることを強制することはできません。

揮発性フィールドを考えてみましょう。揮発性の負荷と店舗はどのように見えるでしょうか?まあ、Aleksey Shipilëv has a great write up on thisですが、私はそれを取るでしょう。

揮発性ストアとその後の負荷は次のようになります。だから、

<other ops> 
[StoreStore] 
[LoadStore] 
x = 1; // volatile store 
[StoreLoad] // Case (a): Guard after volatile stores 

... 

[StoreLoad] // Case (b): Guard before volatile loads 
int t = x; // volatile load 
[LoadLoad] 
[LoadStore] 
<other ops> 

<other ops>は、不揮発性の書き込みすることができますが、あなたはそれらの書き込みは前に揮発性メモリに記憶することにコミットしている見るように。その後、我々がLoadLoad​​を読む準備ができたら、volatile storeが成功するまで待ちます。

最後に、StoreLoad beforeとafterは、揮発性のロードとストアを、直前に並べ替えることはできません。

1

文書の障壁は異なるCPU上の異なるものへの、多かれ少なかれマップ抽象的な概念です。しかし、それはガイドラインにすぎません。 JVMのが実際にをコンセプトとしてJLS第17章

障壁におけるものであり、従わなければならないルールは、彼らがすべて前に、次の手順を注文するという意味でも、「グローバル」です。

たとえば、Javaメモリモデルは、更新される値が不揮発性であっても、別のスレッドでリリースされる前に実行されたすべてのアクションに対して、モニタの取得アクションの可視性を保証します。モニターを取得

のみロックを争う他のスレッドに可視である必要が料理にを-入力モニタです。 モニタ出口はリリースアクションです。リリースアクションは、リリース前のロードおよびストアがそれを移動するのを防止します。これは、最初の操作が通常のロード/ストアで、2番目の操作がvolatile-storeまたはmonitor-exitであるcookbookテーブルで確認できます。

合計ストアオーダーのCPUでは、ストアバッファーが利用可能であれば、正確性には影響しません。パフォーマンス上のみ。

いずれにしても、JLSが要求するアトミック性と可視性セマンティクスを提供する命令を使用するのは、JVMに任されます。そしてそれが鍵となるのです。Javaコードを書く場合、JLSで定義されている抽象マシンに対してコードを作成します。抽象マシンにのみコーディングしても、必要なパフォーマンスが得られない場合には、具体的なマシンの実装の詳細を掘り下げるだけです。あなたは正しさのためにそこに行く必要はありません。

0

私はどこにいるのか分かりませんStoreLoad障壁はいくつかの特定の行動を強制する唯一のタイプです。すべての障壁は、抽象的に、強制するために定義されているものを正確に実施します。たとえば、LoadLoadは、それ以前の負荷がその後の負荷で並べ替えられないようにします。

アーキテクチャ具体的な記載特定の障壁が適用される方法のがあってもよい:チップアーキテクチャは自動的に他の順序付けを適用し、そしてStoreLoadであるので、例えば、x86で StoreLoad以外のすべての障壁がno-OPSありません通常はストアバッファフラッシュとして実装されます。それでも、すべての障壁は、アーキテクチャーに依存しない抽象的な定義を持ち、実際のISA固有の実装に対する概念的な障壁のマッピングとともに、クックブックはその点で定義されています。

特に、バリアが特定のプラットフォームで「ノーオペレーション」であっても、順序が保持されているため、すべての発生前およびその他の同期要件が満たされていることを意味します。

関連する問題