アーキテクチャとNUMAアーキテクチャでのUMAのスピンロック(CLHロックとロックMCS)

スピンロックについて

私たちは、それが非ブロッキングロックで、スピンロックは、同期プログラムを達成することであることを知っています。これは、主な違いは、従来のロックは、スレッドがブロックされ、適切な場合、それをウェイクされ、ロックの取得に失敗した後、異なる治療にある従来のロックです。スピン動作を使用する2つの単語の中核機構スピンロックスピンは、ブロッキング操作を交換します。ロックがすでに別のスレッドによって占有されている場合は、スレッドがロックを取得しようとすると、このスレッドはロックが解除されているかどうかをチェックするためのサイクルを続けるのではなく、このスレッドが中断またはスリープさせます。別のスレッドがロックを解除すると、このスレッドはロックを取得することができるようになります。スピンがビジー待機状態であり、このプロセスはCPUの時間のかかる作品だったでしょう。

スピンロック

UMA架构

各スピンロックの導入前に、我々は2つのプロセッサアーキテクチャを理解する必要があるので、問題が関与しますCLHロックとロックMCSプロセッサアーキテクチャの欠点を分析する際ため:UMAアーキテクチャとNUMAアーキテクチャ。マルチプロセッサシステムでは、メモリの共有に係るUMA(ユニフォーム・メモリ・アクセス)およびNUMA(非均一メモリ・アクセス)、すなわち均一なメモリアクセスと非一様メモリ・アクセスに分割することができます。

UMAアーキテクチャの性質は、各CPUコアアクセス時間のための主記憶装置は同じです。バスを介して通信するために、直接バスに接続されているUMAベースのバス・アーキテクチャは、4つのCPUプロセッサの総数(下記参照)。あなたは、彼らがプライマリストレージへのアクセスを等しく、各CPUには違いはありません、この構造から見ることができます。主記憶の時間にアクセスするために必要な同じ、すなわち均一なメモリアクセスです。

UMA架构

CPUは、読み取りおよび書き込みたい場合は、それを最初にチェックバスは無料で、唯一のアイドル状態のバスがフリーになるまで、それ以外の場合は待機します、それはプライマリストレージと通信することを可能にします。この問題は、各CPU内のキャッシュの導入を最適化します。このように、CPU読ん操作がローカルキャッシュに行うことができます。しかし、その後、私たちはそれ以外の場合は、ダーティデータの問題を引き起こす可能性があり、データの一貫性のCPUのキャッシュとメインメモリの問題を考慮する必要があります。

UMA架构2

NUMAアーキテクチャ

同じUMAアーキテクチャ、NUMAアーキテクチャではなく、毎回CPUアクセスメインメモリとは対照的に、NUMAアーキテクチャのCPUは、すべての主要なストレージにアクセスすることができます。なお、図2のCPUにより見ることができる。ローカルバスを介して対応するローカルアクセスメインメモリは、その後時間が短いが、非ローカル主記憶アクセス(リモートメインメモリ)は、時間が非常に長くなる場合、すなわち、CPUは、ローカルにアクセスするアクセスする場合リモートアクセスメインメモリとメインメモリの速度が同じではありません。NUMAアーキテクチャの利点は、優れたスケーラビリティが百以上のCPUの組み合わせとして実現することができたということです。

NUMAアーキテクチャ

CLH锁

クレイグ、とLandin、ヘゲルステン3人がCLHロックを発明しました。核となるアイデアは、次のとおりです。すべてのことで、各ポーリング独自のローカル変数、特定のスレッドのポーリングスレッドキューに共有変数のための競争、およびスレッドのキューを意味しています。

この変換プロセスは、主に2つのポイントがあります:まず、何が構築され、どのようにキューキューを構築するためにすべきですか?公平性を確保するために、我々はFIFOキューを構築します。テール・ノードの尾を移動することにより、キューのメインラインを達成するために構築された場合、それぞれがロック・スレッドを取得したい新しいノードを作成し、アトミックCAS操作によって新しいノードが尾に割り当てられ、その後、ポーリングスレッドの前に現在のノードを聞かせてステータスビット。図キュー構造は明らかにスピン操作を参照して、これに成功したスレッドのキューイングを構築することができます。第二は、キューを解放する方法ですか?次のノードがポーリングされているので、単にスレッドアンロック状態への状態の位置に対応するノード、現在のスレッドを実行した後、ロックを得ることが可能です。

CLH锁

だから、CLHロック核となるアイデアは、それだけでローカル変数を検出するために変換するために、これらのスレッドを注文して、リソースの数で競争するのに長い時間をスレッドすることです。競争がある唯一の場所は、競争の尾 - 尾ノードの前にキュー内にあるが、今回は競争のスレッドの数は多くを削減しました。直接リソースの競合でポーリングの数へのすべてのスレッドに比べても大幅システムの性能を向上、また、CPUのキャッシュの同期の消費量を節約する多くのことを、減少しました。

CLHロックは、スレッドの同期と多くの問題を解決したと同時に変数をもたらしたが、それは、前駆体オブジェクトスピン・ノードで動作します。影響を受けている前駆体ノードと現在のノードがもはや同じローカルアクセスメインメモリである場合ので、その後、時間がパフォーマンスにつながることができ、非常に長くなり、NUMAアーキテクチャでパフォーマンスの問題があるかもしれません。

MCSロック

MCSのジョン・メラー-Crummeyマイケル・スコットによって発明のロックと2、それは既存の問題CLHロックの解決を目的とした表示されます。これは、FIFOキューに基づいて、ロックCLH同様の差は異なるがポーリングオブジェクトということでもあります。MCSは、ローカル変数のスピンにスレッドをロックし、その先行ノードは、スピン動作の終了を通知する責任があります。だから、同期のパフォーマンスコストを削減するために、CPUのキャッシュとメインメモリとの間に不必要な同期操作を減らします。

以下、各スレッドは、キュー内のノードに対応します。回転の必要性を表すノード内のスピン変数は、あります。あなたは、前駆体ノードロックの使用を終了したら、それはロックの獲得に成功したスピン操作を行うには継続する必要はありません知らせる、スピン変数後続ノードを変更します。

MCSロック

、人工知能に焦点を当て読み、感情や数学、コンピュータサイエンス、分散型、機械学習、深い学習、自然言語処理、アルゴリズムとデータ構造、Javaの深さ、Tomcatのカーネルなどについて話しています。

おすすめ

転載: juejin.im/post/5d8ab21b51882509593fd2a4