[並行プログラミング - ファンデーション](A)同時プログラミングの基礎

同時並列

1.1、同時実行

       プログラムはまた、プログラムが複数のスレッドを交互に入れ替えまたはページアウト、シングルコアプロセッサ上で実行される場合、スレッドが同時に存在する、Aにおける各実行スレッドを複数のスレッドを有しています状態。プログラムは、マルチコアプロセッサ上で実行される場合、各スレッド内のプログラムは、複数のスレッドが同時に実行できるプロセッサコアに割り当てます。

1.2、パラレル

       二つ以上のイベントが同時に発生します。

1.3、高同時実行

       大量同時インターネットは、分散システムアーキテクチャ設計の要因の一つである、それは通常、設計保証システムを指し、考えなければならないと同時に多くの要求を同時に処理することができます。

二、CPUマルチレベルキャッシュCPUキャッシュ

2.1は、なぜあなたは、CPUのキャッシュが必要なのでしょうか?

       プロセッサのクロック・サイクルは、CPUが頻繁にメインメモリ、資源の無駄を待つ必要があるように、CPU周波数が速すぎて、メインメモリに近づいては、維持することはできません。CPUとメモリの問題(:CPU-> cache->メモリ構造)との間の速度のミスマッチを緩和するために、キャッシュの出現は、そう。

2.2、CPUのキャッシュポイントは何ですか?

       バッファ容量はメインメモリよりもはるかに小さいです

2.3、局所性の原則

       (1)イベント地域:データがアクセスされた場合、それは近い将来に再びアクセスされる可能性があります。

       (2)空間的局所性:データがアクセスされる場合、その隣接データも迅速にアクセスすることができます。

三、CPUのキャッシュの一貫性(MESI変更|独占|シェア|無効)

3.1、キャッシュコヒーレンシコンテンツ:

       キャッシュコントローラは、ローカル操作と遠隔操作時間を監視するように四則演算のCPUキャッシュは、一貫性のない状態を作り出すかもしれないが、複数のCPUのキャッシュの一貫性との間の共有キャッシュを確保するためには、4つの状態のキャッシュを定義します、キャッシュデータフローの複数の間の一貫性を確保するために、特定のcatline状態に対処するためにいくつかの変更を加える必要があります。

キャッシュ・コヒーレンシを理解するには、以下の4つの* 4つの状態と状態明確に変換するために必要とされます。
ここに画像を挿入説明

3.2、四つの状態:MESIは、4つの状態の頭文字です。
  • M(変更):変更が変更されるが、キャッシュ・ラインがメイン・メモリ内のデータが矛盾しているように、唯一のCPUのキャッシュにキャッシュされ、そして変性され、メモリのキャッシュラインは、将来的に必要値は、メインメモリの内部に書き戻された後、対応するメインメモリは、読み取り前にメインメモリのライトバック時間は、この時点で、他のCPUメモリを可能にするために、キャッシュラインの状態は、単一の状態E(なり)を楽しみます。
  • E(排他):独占排他的な、唯一のキャッシュラインがCPUのキャッシュにキャッシュされているが、それは変更されていなかった、メインメモリ内のデータと一致して、任意の時点での状態、時に他がありますCPUは、状態メモリを読み込むときSは共有状態になります。ときにCPUのキャッシュラインの内容は、この条件は、Mの状態が変更になります。
  • S(共有)は:共有、共有、キャッシュラインがCPUのキャッシュの複数であってもよく、各キャッシュとメインメモリのデータがキャッシュ・ラインを変更するCPUがあるデータと一致している場合、他のCPUのキャッシュラインそれは無効となります。私は非アクティブになりました
  • I(無効):無効無効、無効、キャッシュの代表が無効化されたときに、CPUのキャッシュラインの他の用途があるかもしれません。
3.3は、4つの操作
  • ローカルの読み取り:ローカルキャッシュに読み込んだデータ
  • 地元の書き込み:ローカルキャッシュの内部にデータを書き込みます
  • リモート読み取り:データメモリオーバー読みます
  • リモート書き込み:メインメモリへの書き込みデータバックの内側に行きます
3.3、各状態でのバッファとスイッチ

       典型的なマルチコアシステムでは、各コアが共有メモリバスに独自のキャッシュを持って、対応する読み取りまたは書き込み要求を開始し、各CPUがキャッシュされたオブジェクトは、共有CPU書き込み要求、Aの数を減らすことですE状態キャッシュに加えて、読み取り要求を満たすことができます

       MとEデータは常に正確で、かつキャッシュラインの本当の状態は同じです。S状態が矛盾している可能性があり、脇キャッシュセットのS状態のキャッシュラインならば、別のキャッシュは、実際には、キャッシュラインの排他的キャッシュラインであったかもしれないが、新しいキャッシュ・ラインがE状態で署名しないだろう他のキャッシュは、キャッシュラインの通知を相殺放送しないので、キャッシュラインのトークンの数が保存されるため、これは、キャッシュが同じではありませんので、排他的なキャッシュ・ラインかどうかを判断する方法はありません。Eは、一種のように投機的な最適化します。

3.4、CPUマルチレベル・キャッシュ - 最適化のための実行に

ここに画像を挿入説明

(1)シングルコアの状況が離れ、目標の実現を許可していません。命令を、マルチコア時代に、複数のコアが存在するが、実行、命令の各コアは、順不同である可能性が高いです。
プロセッサ(2)はまた、いくつかのキャッシュメカニズムを導入し、各コアが独自のキャッシュを持っている、データがメモリに書き込まれているではありません本当に、論理的な順序の後に書かれた最後をリードしてきました。
(3)最後の質問は、私たちがどんな保護対策を持っていなかった場合、プロセッサおよびロジックは、最終的に結果が著しく異なる結果を得ています。

四、Javaのメモリモデル

4.1、Javaのメモリモデル抽象構造図

ここに画像を挿入説明

4.2、Javaメモリー・モデル - 同期動作とルール

ここに画像を挿入説明
同期ルール:

  1. あなたが店や書き込み操作に、ワーキングメモリにメインメモリから変数をコピーしたい場合は順番に実行する必要があります。しかし、Javaのメモリモデルのみをアピール操作が順序で実行しなければならない必要がありますが、継続的に行われなければならない保証はありません。
  2. 読み、ロード、ストア1および書き込み操作を単独で許可されていません。
  3. スレッドは、作業メモリに変更さすなわち変数は、その後、メインメモリに同期させる必要があり、その最も最近の割り当て操作を破棄することはできません。
  4. スレッドが許可しないする理由メインメモリへのワーキングメモリバックからデータを同期する(任意のアクションを割り当てないでは発生しません)。
  5. メインメモリ内の新しい変数の唯一の誕生は、ワーキングメモリに直接(負荷またはアサイン)初期化されていない変数を使用することはできません。すなわち、変数の使用とストアオペレーションの実装は割り当て、ロード操作後に行わなければならない前に。
  6. 一つだけのロックを操作するスレッドが、ロック操作を繰り返しロックした後、直線で複数回繰り返すことができる可能にすると同時に変数、ロック解除操作のみの同じ数を行い、変数のロックが解除されます。ロックとロック解除は、ペアリングする必要があります。
  7. あなたは変数にロック操作を行う場合は、この変数のワーキングメモリ値をクリアします、我々はする必要があり、この変数を使用する前に、実行エンジンに負荷値または割り当て変数の初期化操作を再実行してください。
  8. 変数実現がロック操作をロックされていない場合は、ロック解除操作を実行することはできません。変数は、別のスレッドによってロック解除するために許可されていません。
  9. Unclock一つの変数に対する操作を実行する前に、この変数は、最初にメインメモリに同期(店舗および書き込み動作を実行)しなければなりません。

第五に、同時の利点とリスク

5.1、同時リスク
  • セキュリティ:それは複数のスレッドがデータを共有するときに、所望の結果が一致しない生成することが
  • アクティビティ:運転を継続することができない、アクティブな問題が発生します。このようなデッドロック、飢餓など
  • パフォーマンス:頻繁にCPUを切り替えますあまりにも多くのスレッド、起動時間の増加、同期メカニズムは、過度のメモリを消費します。
5.2、同時実行性の利点
  • 速度:同時に複数の要求および応答を処理することと、複雑な操作は、同時に複数のプロセスに分割することができます。
  • デザイン:いくつかのケースでは、また、より多くの選択肢を有していてもよく、より簡単にプログラミング
  • リソースの使用:IOを待っている間にCPUは他の何かを行うことができます
公開された20元の記事 ウォンの賞賛1 ビュー566

おすすめ

転載: blog.csdn.net/weixin_42295814/article/details/103765953