3

「ロック」が前に付いたアセンブリ命令はアトミックであると言われています。「ロック」が 1 つのアセンブリ命令にのみ影響するかどうかを知りたいです。アセンブリ命令自体はアトミックではありませんか?

Linux カーネルのアトミック関数の例を次に示します。

static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
 { unsigned char c;
 __asm__ __volatile__(
 LOCK "subl %2,%0; sete %1" 
    :"=m" (v->counter), "=qm" (c) 
     :"ir" (i), "m" (v->counter) : "memory"); 
return c; }

この例では、subl と sete を中断できますか?

4

3 に答える 3

8

ロック プレフィックスは、1 つの命令に影響します。

複数の CPU 間で共有されているメモリを変更すると、命令はアトミックではなくなります。メモリ オペランドの読み取り、それに対する演算 (AND、XOR、INC など) の実行、および書き戻しを含む変更は、他の CPU からはアトミックと見なされません。lock プレフィックスはメモリ位置を「ロック」するため、3 つのステップ (読み取り、変更、書き込み) が 1 つのように見えます。つまり、他の CPU は、ロックされた命令の前と後のものしか観察できません。

Intel または AMD の公式 CPU ドキュメントを参照してください。

編集:新しく追加された例では、割り込みについて話している場合、これらの命令のどちらも中断できません。命令全体の間で割り込みが発生します。ロック接頭辞は、sub命令をアトミックにします。sete命令はアトミックであることを意図したものではなく、フラグをゼロまたはゼロ以外の整数値に変換するためにありますZF

于 2012-07-07T03:42:15.773 に答える
4

命令は、他の CPU コアで同時に実行される他の命令に関してアトミックではありません。プレフィックスはバスをロックしてLOCK、ロックされた命令の実行中に他のコアがメモリにアクセスできないようにし、2 つのコアが同時に同じ場所にアクセスしようとする競合を防ぎます。

于 2012-07-07T03:41:10.780 に答える
3

ごく少数の特定のアセンブリ命令のみがアトミックです。x86 は大部分が CISC アーキテクチャです。つまり、1 つの命令で多くの作業が行われます。つまり、1 つの命令でメモリ アドレスから値をレジスタにロードし、それに対して操作を実行し、結果をメモリに格納することができます。これは、実行に多くの時間と CPU サイクルを要する複雑な操作です。パフォーマンスを向上させるために、多くのそのような命令がパイプライン化され、それらの実行順序が織り込まれています。

基本的に、アセンブリは他の言語と同じです。lock特に CISC アーキテクチャについて言えば、単一のコマンドで実行できる「高レベル」の構造と操作が多数あります。命令のドキュメントまたは修飾子で明示的に指定されていない限り、アトミックに実行されることは保証されません。

于 2012-07-07T03:41:08.333 に答える