メモリーロックとは?

歴史的に、すべてのコンピューター プログラムは完全に連続した方法で書かれていました。これは、読み、書き、理解が簡単です。また、コンピューターで実行するのも簡単で、必要なハードウェアも比較的単純です。この設計パラダイムでは、システム パフォーマンスを向上させる唯一の 2 つの方法は、より効率的なコードを記述し、CPU 速度を向上させることです。コードの効率を高めることは可能かもしれませんが、一般的には複雑なプロセスであり、結果が限られることがよくあります。

何十年もの間、より効率的な新しい CPU を待つことで、パフォーマンスが低下する可能性がありました。ムーアの法則で説明されているように、CPU のパフォーマンスは 2 ~ 3 年ごとに約 2 倍になります。残念ながら、これらのパフォーマンスの向上のほとんどは、これまでになく小型化された製造ノードを使用したことによるものです。現代のテクノロジーは、ナノメートル スケールでの材料の難しさのおかげで、歴史的な速度でノード サイズを縮小するのに苦労しています。

これを回避するために、最新の CPU アーキテクトは複数のプロセッサ コアを CPU に追加することを選択しました。各プロセッサ コアは、異なるタスクで独立して動作できます。同じ問題を組み合わせることはできませんが、同時に 2 つの問題に取り組むことができます。この基本的なアーキテクチャの変更により、パフォーマンスが大幅に向上しますが、プロセッサ時間の競合は減少しますが、個々のプロセスには直接的なメリットはありません。

マルチコア CPU を利用するには、コードをマルチスレッド方式で記述する必要があります。その後、各スレッドを同時に実行し、使用可能なスレッドと CPU コアの数によってパフォーマンスの利点を拡大できます。ただし、これを行うと、「競合状態」という新たな課題に直面します。

注:一部のタスクはマルチスレッド化できませんが、他のタスクは大規模なマルチスレッド化が可能です。考えられるパフォーマンス上の利点は、実行中の作業に依存します。

レース条件

マルチスレッド ソフトウェアは、複数のコアを利用できます。これらの水域には危険が潜んでおり、経験の浅いプログラマーを罠にかけようとしています。競合状態は、2 つの異なるスレッドが同じビットのメモリと対話するときに発生する可能性があります。

簡単な例として、2 つのスレッドが同時に変数のチェックとインクリメントを試みる場合があります。a=0としましょう。次に、2 つの異なるスレッドがそれぞれの機能を実行し、ある時点でaをチェックして 1 ずつ増やします。一般に、2 つのスレッドで 1 に 0 を足した結果は 2 になると予想されます。ほとんどの場合、これが当てはまります。両方のスレッドがその特定の機能を正確に適切なタイミングで実行すると、異なる結果が得られます。

この場合、最初のスレッドはaの値を読み取ります。最初のスレッドがaの値をインクリメントする前に、2 番目のスレッドがそれを読み取ります。ここで、最初のスレッドはゼロに 1 を加算しますが、2 番目のスレッドはすでに値がゼロであると認識しており、ゼロに 1 を加算しています。この結果、aの最終値は2 ではなく 1 になります。

最悪のシナリオへの競争

上記の例は特に悪いようには聞こえないかもしれませんが、劇的な効果をもたらす可能性があります。aの値がマシンの動作モードを選択する場合はどうなるでしょうか? そのマシンの特定の操作モードが危険であったり、生命を脅かしたりする可能性があるとしたら?

レース条件もそれほど単純である必要はありません。たとえば、あるスレッドがメモリ セクションを読み取ると同時に、別のスレッドがメモリ セクションに書き込んでいる可能性があります。この場合、読み取りスレッドは前後のデータの奇妙な混合を取得する可能性があります。チェックが単純な真/偽チェックであるとしましょう。

読み取りの開始時に変数が true を示していたが、false という単語に上書きされる過程にあった場合、読み取り操作の結果は「trlse」のようなものになる可能性があります。これは「真」でも「偽」でもありません。二者択一の 2 つのオプションのいずれにも該当しない場合、ほぼ確実にアプリケーションがクラッシュします。このメモリ破損は、サービス拒否や権限昇格など、多くのセキュリティ問題につながる可能性があります。

レースを締め出す

プログラム内のどのビットのメモリが異なるスレッド間で共有されているかを知ることは、競合状態を防ぐために不可欠です。変数が単一のスレッドによってのみ制御およびアクセスされる場合は、何もする必要はありません。2 つ以上のスレッドが変数にアクセスできる場合は、そのメモリ ピースに対するすべての操作が互いに独立して完了していることを確認する必要があります。

この独立性は、ロックのおかげで達成されます。プログラムのコードでは、共有メモリを操作する関数を記述するときにロックを設定する必要があります。このロックは、ロックが解放されるまで、他のスレッドがそのメモリの一部にアクセスするのをブロックします。

ロックは、最も洗練されたソリューションではありません。1 つには、メモリのオーバーヘッドがあります。また、ロックが解放されるのを待って、スレッドを強制的にハングさせることもできます。状況によっては、長時間ロックが解除されない場合や、ロックがまったく解除されない場合があります。最悪のシナリオでは、ロックのロック解除は、別のブロックされたスレッドで発生している何かに依存し、デッドロックにつながる可能性があります。

ロックの使用を最適化することが不可欠です。ロックの粒度を制御できます。たとえば、テーブルのデータを編集している場合、テーブル全体をロックしたり、編集した行だけをロックしたりできます。テーブル全体をロックすると、粒度が粗いロックになります。実装するロックが多すぎることによるオーバーヘッドは最小限に抑えられますが、別のスレッドがロックによってブロックされる可能性が高くなります。行だけをロックすると、粒度の細かいロックになります。これにより、他のスレッドに干渉する可能性ははるかに低くなりますが、引き裂かれたロックが必要になるため、総オーバーヘッドが増加します。

結論

メモリ ロックは、マルチスレッド環境でメモリ内操作の原子性を確保するために使用されるコード ツールです。メモリの一部を操作する前にロックすることで、競合状態が原因で予期しない動作が発生しないようにすることができます。メモリ ロックにはメモリ オーバーヘッドが伴いますが、ブロッキングの原因にもなります。

ブロッキングとは、ロックされた pemory に対して別のスレッドが操作を試みることです。スレッドはそこに留まり、ロックが解除されるまでブロックされます。これは、ロックを解放するために別のスレッドが何かを行う必要がある場合に問題を引き起こす可能性があります。これは、それをブロックしているロックを解放するための前提条件を完了する前にブロックされる可能性があるためです。ノンブロッキング コードを記述することで、メモリ ロックを回避できます。ただし、これを行うと、ロックを使用するよりも複雑になり、パフォーマンスが低下する可能性があります。以下にコメントを残すことを忘れないでください。



Leave a Comment

ハードドライブのクローンを作成する方法

ハードドライブのクローンを作成する方法

データが貴重な資産である現代のデジタル時代では、Windows 上でハード ドライブのクローンを作成することは、多くの人にとって重要なプロセスとなる可能性があります。この包括的なガイド

Windows 10でドライバーWUDFRdのロードに失敗した場合の修正方法

Windows 10でドライバーWUDFRdのロードに失敗した場合の修正方法

コンピュータの起動中に、ドライバ WUDFRd をコンピュータに読み込めなかったことを示すエラー メッセージが表示されましたか?

NVIDIA GeForce Experienceエラーコード0x0003を修正する方法

NVIDIA GeForce Experienceエラーコード0x0003を修正する方法

デスクトップで NVIDIA GeForce experience エラー コード 0x0003 が発生していますか? 「はい」の場合は、ブログを読んで、このエラーをすばやく簡単に修正する方法を見つけてください。

Chromebook の電源が入らないのはなぜですか

Chromebook の電源が入らないのはなぜですか

「Chromebook の電源がオンにならないのはなぜですか?」という質問に対する答えを見つけます。この役立つガイドは Chromebook ユーザー向けです。

Fitbit Versa 4 の文字盤を変更する方法

Fitbit Versa 4 の文字盤を変更する方法

Fitbit Versa 4 の文字盤を無料で変更して、時計の外観を毎日変えることができます。それがいかに早くて簡単かを見てください。

ルンバが止まったり、くっついたり、向きを変えたりする – 修正

ルンバが止まったり、くっついたり、向きを変えたりする – 修正

ルンバ ロボット掃除機が停止し、固着し、回転し続ける問題を修正します。

Steam Deckのグラフィック設定を変更する方法

Steam Deckのグラフィック設定を変更する方法

Steam デッキは、堅牢で多彩なゲーム体験をすぐに提供します。ただし、ゲームを最適化し、可能な限り最高のパフォーマンスを保証するには、

分離ベースのセキュリティとは何ですか?

分離ベースのセキュリティとは何ですか?

サイバーセキュリティの世界でますます重要になっているトピック、つまり分離ベースのセキュリティを詳しく掘り下げる予定でした。このアプローチは、

Chromebook でオート クリッカーを使用する方法

Chromebook でオート クリッカーを使用する方法

今日は、Chromebook で繰り返しクリックするタスクを自動化できるツール、オート クリッカーについて詳しく説明します。このツールは時間を節約し、

SMPSとは何ですか?

SMPSとは何ですか?

コンピューターに SMPS を選択する前に、SMPS とは何か、およびさまざまな効率評価の意味を理解してください。