2

次のような単純な非アトミック コードがあるとします。

a++;

これは、次のような機械語命令に分解できます。

MOV EAX, [a]
INC EAX
MOV [a], EAX

私はマシンコードに精通していません。それが間違っている場合は申し訳ありませんが、基本的にそれらはアトミックに実行されると想定しています

CPU が最初のアクションを実行し、次に多数のサイクルを実行し、次に次のアクションを実行し、さらにサイクルを実行し、最後にマシン コードの最後の部分を実行できると考えるのは正しいでしょうか?

同じサイクル内でマシンコードの各ビットを互いに順番に実行するのとは対照的です。

4

2 に答える 2

4

最新の x86/x64 プロセッサでは、単一のアーキテクチャ命令が単一の CPU (マシン) 命令にマップされると想定することさえできません。最近の CPU は一般に、x86/x64 命令を一連のアーキテクチャ固有のマイクロコード命令として内部的に実装しています。これらが実行される順序は、順不同の実行、投機的実行などにより、実行可能ファイルに表示される順序に簡単にはマップされません。また、CPU クロック サイクルと実行される命令数との間の単純なマッピングもありません。 .

これに加えて、マルチスレッド コードでは、スレッドがいつでもコンテキスト スイッチされる可能性があるため、任意の 2 つの命令が実行される間に任意の他の操作が発生し、任意の長い遅延が発生する可能性があります。

最新のマルチスレッド環境で論理アトミシティを取得する唯一の方法は、アーキテクチャによって提供される適切なアトミックおよび同期命令を使用することです。これにより、命令レベルだけでなく、メモリ階層 (L1、L2、L3 キャッシュ、およびメイン メモリ) 全体でアトミック動作が保証されます。 、およびストア バッファなど)。

于 2013-10-26T01:38:54.323 に答える