7

Intelのマニュアルを読んだところ、命令にロックプレフィックスが付いていることがわかりました。これにより、プロセッサが同じメモリ位置に同時に書き込むのを防ぐことができます。とてもワクワクしています。ハードウェアのミューテックスとしても使えると思います。そこで、私はショットを撮るためのコードを書きました。結果は非常に苛立たしいものです。ロックはMOVまたはLEA命令をサポートしていません。マニュアルには、LOCKはADD、ADC、AND、BTC、BTR、BTS、CMPXCHG、CMPXCH8B、DEC、INC、NEG、NOT、OR、SBB、SUB、XOR、XADD、およびXCHGのみをサポートすると記載されています。さらに、これらの命令の1つでLOCKプレフィックスが使用され、ソースオペランドがメモリオペランドである場合、未定義のオペコード例外(#UD)が生成される可能性があります。

なぜこれほど多くの制限があり、多くの制限がLOCKを役に立たないように思わせるのだろうか。一般的な書き込み操作で、データのダーティや並列処理によるその他の問題が発生しないことを保証するために使用することはできません。

たとえば、Cでコード++(* p)を記述しました。pは共有メモリへのポインタです。対応するアセンブリは次のようになります。

movl    28(%esp), %eax
movl    (%eax), %eax
leal    1(%eax), %edx
movl    28(%esp), %eax
movl    %edx, (%eax)

「movl」と「leal」の前に「lock」を追加しましたが、プロセッサが「InvalidInstruction」と文句を言います。:-(書き込み操作をシリアル化する唯一の方法は、ソフトウェアのミューテックスを使用することだと思いますよね?

4

5 に答える 5

12

私は確かにlock役に立たないとは言いません。は、多くの同期アルゴリズムの基本的な構成要素である比較と交換lock cmpxchgを実行する標準的な方法です。

また、fetch-and-addも参照してください。

于 2012-06-16T17:45:24.467 に答える
5

の目的はlock、操作をシリアライズではなくアトミックにすることです。このようにして、操作が有効になる前に CPU を横取りすることはできません。

于 2012-06-16T17:45:47.710 に答える
3

x86 プロセッサは、多くの機能、多くの規則、およびそれらすべての規則に対するさらに多くの例外を備えた毛むくじゃらの設計で知られています。これは、家族の長い歴史に関係しています。

コンパイラや人々が を使用しLOCKているとき、アルゴリズムが最終的に操作するアプリケーション データとは対照的に、多くの場合、スレッド間の同期を実行するために特別に導入されたデータに対して、常にすべての制限付きでそれを使用しています。LOCK次に、スレッド同期プロトコルを、その逆ではなく、スレッド同期プロトコルにできることを適応させます。

あなたが探していると思われる命令の一般的なタイプは、メモリバリアと呼ばれます。実際、x86 には、このファミリ (MFENCE、LFENCE、SFENCE) の「最新の」命令がいくつかあります。それぞれフルフェンス、ロードフェンス、ストアフェンスです。ただし、Intel は命令セットの従来の部分での書き込みのシリアル化を保証しているため、命令セットにおけるそれらの重要性はSSEに限定されています。これが、この古いアーキテクチャがマルチスレッド プログラミングの非常に簡単なターゲットである理由のほとんどです。

詳細については、この回答も参照してください。

于 2012-06-17T07:28:42.577 に答える
2

マルチプロセッサマシンで、同じデータを使用しているが同時に変更できない2つの同時プロセスがある場合に便利です。

プロセスの1つがデータを変更しているとき、変更命令のロックを使用するため、2番目のプロセスがデータを変更しようとすると、最初のプロセスがジョブを終了するのを待ってから、独自のプロセスを実行できます。振り向く。

これが少し役立つことを願っています。

于 2012-06-16T18:46:21.473 に答える
1

あなたが提供する例では、次のような命令でlockプレフィックスを使用できます(がにあるとinc仮定します):p%eax

lock inc (%eax)

ただし、より一般的なケースでは、ロックを使用する必要があります。

于 2015-05-26T14:13:36.333 に答える