0

私は現在並行性を研究していますが、いくつか疑問があります。

ウィキの例を見てみましょう。 http://en.wikipedia.org/wiki/Atomic_(computer_science)

素朴で非アトミックな方法では、値を読み取り、1 を加算してから書き戻します。2 つのプロセスが同時に実行されている場合、ステップが互いにインターリーブすることがあります。たとえば、最初のプロセスは 1 を読み取って追加しますが、中断されます。2 番目のプロセスは読み取り、1 の追加、および書き戻しを行い、中断されます。最初のプロセスが再開され、古い値が書き戻されます。

アトミックな比較と交換がどのように問題を解決するかを理解しています。読み取り、1 を追加し、比較とスワップを使用して書き込み、比較とスワップが失敗した場合は再試行します。

ただし、複数のスレッドを実行する複数のコアがあるシナリオを想像しています。1 番目のプロセスと 2 番目のプロセスが異なるコアでまったく同時に実行されるとどうなりますか? つまり、CPU1 の Process1 は、読み取り、追加、比較および交換を行い、同時に CPU2 の Process2 は読み取り、追加、比較および交換を行います。コンペアアンドスワップも成功すると思います。

この状況は可能ですか?もしそうなら、それはどのように扱われますか?

4

1 に答える 1

1

コンペア アンド スワップはハードウェアに実装されています。大まかに言えば、プロセッサはメモリバスと連携して、コンペアアンドスワップを実行するコアが共有メモリに排他的にアクセスできるようにします。したがって、文字通り、2 つのプロセスを同時に実行することはできません。共有メモリの (ハードウェアで保証された) ロックを最初に取得するのは 1 つです。

たとえば、Intel では、アトミック コンペア アンド スワップは LOCK CMPXCHG によって実装されます。LOCK プレフィックスにより、次のことが保証されます。

マルチプロセッサ環境では、LOCK# 信号は、信号がアサートされている間、プロセッサが共有メモリを排他的に使用できるようにします。

( Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2 (2A, 2B & 2C): Instruction Set Reference, AZ , vol 2A p. 3-462)。

于 2014-03-12T18:05:20.910 に答える