1.高い並行性に関するいくつかの重要な概念
1.1同期および非同期
まず、ここで言及した同期と非同期は、関数/メソッドコールの側面を指します。
明らかに、同期コールはメソッドが返されるのを待ち、非同期コールは即座に戻りますが、非同期コールは即座に戻ります。タスクが完了したことを意味しません。タスクを継続するために、背景にスレッドを設定します。
1.2並行性と並列性
並行性と並列性は、外観が似ています。図に示すように、並列性は2つのタスクが同時に実行される場合、一方、一度に1つのタスクを実行してから別のタスクに切り替えることです。したがって、単一のCPUは並列にすることはできず、同時性のみになります。
1.3クリティカルゾーン
重要な領域は、公共リソースまたは共有データを表すために使用されます。複数のスレッドで使用できますが、一度に使用できるスレッドは1つだけです。クリティカルエリアリソースが占有されると、このリソースを使用したい場合は、他のスレッドを待つ必要があります。
1.4ブロッキングとノンブロッキング
ブロッキングとノンブロッキングは通常、複数のスレッド間の相互の影響を説明しています。たとえば、スレッドがクリティカルエリアリソースを占める場合、このリソースを必要とする他のすべてのスレッドは、この重要な領域で待機する必要があり、待機するとスレッドが掛けられます。これはブロックです。この時点で、リソースを占有するスレッドがリソースをリリースしたくない場合、この重要な領域でブロックする他のすべてのスレッドは機能しません。
ノンブロッキングにより、複数のスレッドが同時にクリティカルゾーンに入ることができます
したがって、ブロッキングのパフォーマンスは一般的にあまり良くありません。一般統計によると、スレッドがオペレーティングシステムレベルで吊り下げられ、コンテキストスイッチを作成した場合、通常、これを行うには80,000回の時間がかかります。
1.5デッドロック、ハンガー、ライブロック
いわゆるデッドロックとは、2つ以上のプロセスの実行プロセス中に、競合リソースの競合または互いに通信することによって引き起こされる閉塞を指します。外力がなければ、彼らは前進することができません。この時点で、システムはデッドロックと呼ばれているか、システムにデッドロックがあります。常にお互いを待っているこれらのプロセスは、デッドロックプロセスと呼ばれます。下の写真の車が前進したいのと同じように、誰も前進することはできません。
ただし、デッドロックは悪い現象ですが、静的な問題です。デッドロックが発生すると、プロセスが遅くなり、CPUの占有率も0になります。CPUを占有することはなく、呼び出されます。比較的言えば、発見して分析するのは比較的簡単です。
デッドロックに対応するのはライブロックです。
ライブロックとは、物事1がリソースを使用できることを意味しますが、他のものが最初にリソースを使用できるようにします。 Things 2はリソースを使用できますが、他のものが最初にリソースを使用することもできます。そのため、どちらも謙虚でリソースを使用できません。
たとえば、路上で誰かに会って、たまたまあなたの反対方向に歩いていて、あなたが真正面から出会っているようなものです。あなたは左に移動し、彼は左に移動しましたが、2人はまだそこに行くことができませんでした。この時点で、あなたは右に移動し、彼は右に移動し、このように続けます。
スレッドがリソースを取得すると、他のスレッドもすべてのリソースを取得していないためにこのリソースについても考えていることがわかります。別のスレッドが同じことを行う場合、Aはリソースを保持するなど、同じリソースを必要とし、BはBリソースを保持し、リソースを放棄した後、AはBリソースを取得し、Bはリソースを取得し、これが繰り返されると、ライブロックが発生します。
ライブロックはダイナミックプロセスであるため、ライブロックはデッドロックよりも検出が困難です。
空腹とは、1つ以上のスレッドがさまざまな理由で必要なリソースを取得できないため、実行できないことを意味します。
1.6並行性レベル
並行性レベル:ブロッキングとノンブロッキング(非ブロッキングは、バリアフリー、ロックフリー、および待機中に分割されます)
1.6.1ブロッキング
1つのスレッドが重要なセクションに入ると、他のスレッドが待つ必要があります
1.6.2アクセシビリティ
非ブロッキングスケジューリングと比較して、ブロッキングスケジューリングは悲観的な戦略であり、データを一緒に変更するとデータが悪化する可能性が高いと考えています。スケジューリングをブロックする代わりに、それは楽観的な戦略であり、データを変更することは必ずしもデータを悪化させるとは限らないと考えています。ただし、これは幅広いエントリと厳格な出口の戦略です。プロセスが重要な領域でデータ競合と競合を持っていることがわかった場合、バリアフリースケジューリング方法はデータをロールバックします。
このバリアフリースケジューリング方法では、すべてのスレッドはシステムのスナップショットを取得するのと同等です。彼らは、それらが有効になるまでスナップショットを服用しようとし続けます。
1.6.3ロックレス
アクセス可能です
勝つことができるスレッドがあることを確認してください
アクセシビリティと比較して、アクセシビリティは、競争があるときに操作が完了することを保証するものではありません。これは、各操作で競合を見つけた場合、試し続けるからです。重要な領域のスレッドが互いに干渉すると、すべてのスレッドが重要な領域に詰まってしまい、システムのパフォーマンスが大きな影響を与えます。
LockLessは、新しい条件を追加して、1つのスレッドが各競争に勝つことができることを確認します。少なくとも、すべてのスレッドがスムーズに実行されることを保証します。
次のコードは、Javaの典型的なロックフリー計算コードです
Javaではロックレスが一般的です
while(!atomicvar.compareandset(localvar、localvar+1)){localvar = atomicvar.get(); }1.6.4待っていません
ロックレス
すべてのスレッドは、限られたステップ内で完了する必要があります
空腹はありません
まず第一に、No Waitingの前提はロックフリーに基づいています。ロックフリーは、クリティカルエリアに入場と出口が必要であることのみを保証します。ただし、エントリの優先度が非常に高い場合、重要なエリアで優先度が低いいくつかのスレッドは空腹であり、クリティカルエリアを離れることができません。その後、待機はこの問題を解決しません。これにより、すべてのスレッドが限られたステップ内で完了する必要があり、当然飢えはありません。
待機は最高レベルの並列性であり、このシステムが最適な状態に到達できるようにすることができます。
待つことなく典型的なケース:
読み取りスレッドとスレッドスレッドのみがある場合、これは待たずに必要です。
読み取りスレッドと書き込みスレッドの両方があり、各スレッドを書き込む前に、データをコピーして、コピーの変更に競合がないため、元のデータを変更する代わりにコピーを変更する場合、変更プロセスも待ちません。最終的な同期は、書かれたデータを上書きすることだけです。
待機中の要件は比較的高く、実装が困難であるため、ロックフリーはより広く使用されます。
2。並列性に関する2つの重要な法則
両方の法律は加速度に関連しています
2.1アムダールの法律
シリアルシステムの並列化後の加速度比の計算式と理論上の上限を定義します
加速度比定義:加速度比=最適化 /最適化後に消費される前にシステム時間が消費される
例えば:
加速度比=最適化 /最適化後の時間の時間の前にシステム時間が消費されます= 500 /400 = 1.25
この定理は、CPUプロセッサの数を増やすことで、システム内の並列モジュールの割合を増やす上で効果的な役割を果たすとは限らないことを示しています。並列プロセッサの数を合理的に増やすことによってのみ、最小の投資で最大加速度を取得できます。
2.2 Gustafsonの法律
プロセッサの数、シリアル比、加速比の関係を説明する
その後、加速度比= nf(n-1)//派生プロセスは省略されています
十分な並列化がある限り、加速度比はCPUの数に比例します。