両方が同じリソースを使用しようとすると、プログラムは競合します。複数のプログラムが同時にリソースを操作しようとすると、同時実行性の問題のリスクがあります。並行性の問題は、1つのプロセスがリソースで変更を実行し、他のプログラム(リソースに対する独自の変更の途中であった)がそれを認識しないため、対応できない場合に発生します。
教科書の同時実行性の問題の例をいくつか示します。
勝利の問題
FTPディレクトリを使用してドキュメントを共有し、自分と同僚がドキュメントで共同作業していると想像してください。同僚と同様に、ドキュメントをダウンロードして編集し、再度投稿します。
- ドキュメントをダウンロードし、1時間かかる一連の変更を開始します。
- 同僚はドキュメントを同時にダウンロードしますが、変更を完了して再アップロードするのに30分しかかかりません。
結果:ドキュメントをアップロードすると、変更が上書きされ、失われます。
古いデータ
同じシナリオで、あなたの同僚はあなたに何も言わずに必要な変更をいくつか加えます。ファイルのコピーには変更がありません。
結果:同じ変更をわずかに異なる単語で自分で書くか、さらに悪いことに、その欠落についての厄介なメールを送信します。
これは単純なシナリオのように思えますが、マルチアクセスデータベースのような高度なケースでは、誰かがレコードを更新しているのと同じミリ秒でレコードを選択すると、深刻な問題が発生する可能性があります。
悪い計算
夫婦は、銀行口座とATMカードを共有しています。アカウントに1000USDがあります。彼らの日常生活では、彼らは町の反対側にあり、両方が同時にATMにアクセスします。どちらも1000USDを引き出します。ATMは両方とも残高が1000であることを認識しているため、引き出しを許可してから、新しい残高が0であることを中央データベースに書き戻します。
結果:銀行は現在1000USDを出ており、それを知りさえしません。
これらのすべての例では、複数のパーティが共有リソース上でアクションを同時にまたはほぼ同時に実行していました。したがって、「並行性」または「同期性」という用語。
解決策
これらの種類の問題に対処する方法はいくつかあります。1つは、リソースにアクセスする複数の当事者間で仲裁するソフトウェアを使用することです。これらのアービタープログラムには、操作の範囲と予測可能性に応じて、2つのオプションがあります。
- 操作をインテリジェントにマージします
- 気づいた最初の操作が完了するまで、2つの操作のいずれかをブロック/ロックします。
両方のプログラムがリソースの状態を示す共有フラグをチェックするように設計されている場合、ブロック/ロックすることもできます。通常、これにはカスタム開発が必要です。
あなたの答え
特定のケースでは、リソースはディスク上のファイルです。同期性は、両方のAVプログラムでオンアクセススキャンをトリガーするファイル読み取り/書き込みなどのイベントから発生します。
Windowsは、プログラムが特定の操作のためにファイルを開くときにファイルをロックすることにより、ファイルシステムの同時実行性の問題を解決するアービターとして機能します。
これは、両方のプログラムがファイルへのアクセスを競い合っており、最初にそこに到達した人は誰でもロックを取得することを意味します。低レベルでは、両方のプログラムが独自のI / Oアクティビティを開始し、ハードウェアに両方のタスクを個別に実行させながらIO命令をインターリーブするため、ディスクのスラッシングが発生します。それらのうちの勝ちます。もう一方はスピンし、独自のロックを確立できるようになります。