0

私は試験を受けましたが、試験で次の質問に直面しました。

以下の各ステートメントについて、そのステートメントが正しいか間違っているか、およびその理由を 1 つの文で示してください。• 非プリエンプティブにスケジュールされたスレッドを提供する (つまり、非自発的なコンテキスト スイッチがない) 並行プログラミング環境では、相互排除同期は必要ありません。

試験の後、私は答えを得ました:

[間違い。Mutex 同期は、(1) マルチプロセッサ上、および (2) ブロック操作を含むクリティカル セクションのユニプロセッサ上で引き続き必要です。]

しかし、私はそれを理解することはできません。誰かがそれを明確に説明できますか?

4

1 に答える 1

2

マルチプロセッサ システムの場合、たとえば 2 つのタスクが同時に実行され、変数 s を共有します。

s = 1;
T1 reads s1 = 1;
T2 reads s2 = 1;
T1 increments s1: s1 = 2;
T2 increments s2: s2 = 2;
T1 writes s: s = s1 = 2;
T2 writes s: s = s2 = 2;

しかし、2 つのタスクが 1 ずつインクリメントしたため、s は今では 3 になっているはずです。これを防ぐには、別のタスクが変数を読み取る前に、変数が読み取られ、操作され、書き込まれるようにする必要があります。

ユニプロセッサ システムでは、同じことが発生する可能性があります。

T1 reads s;
T1 blocks on an operation;
T2 runs and reads s;
T2 blocks on an operation;
T1 manipulates and writes;
T2 manipulates and writes;

s は 2 回操作されましたが、結果は T2 の操作のみを示しています。

単一の変数を変更するだけで、アトミック操作を利用できます。ただし、クリティカル セクションが大きい場合は、ミューテックスを使用して保護する必要があります。

于 2013-11-02T17:22:51.837 に答える