2011-07-28 9 views
8

原子操作はどのように機能しますか?原子操作:フードの下で

アトミック操作は、いわゆる「ウェイトフリー」ですか?

私は原子操作の「最小公約数」についての説明を求めています。すべてのアトミック操作は何を共有しますか?

+0

どのようなプログラミング言語ですか?どのプラットフォームですか?どちらの原子操作ですか?どの程度の原子性(ファイルシステム、ネットワーク、データベース、...)? –

+2

@Matt Ball:それは重要ですか? (質問を更新しました) – Pindatjuh

答えて

4

概念としてのアトミシティはいくつかの場所で発生しますが、コード内のアトミックな操作については考えていると思われますが、他の意味もあります。

データベーストランザクションの基本的な性質の1つは、アトミック性です。ACIDトランザクションのプロパティの説明を参照してください。

この場合、2つの制御スレッド(または2つのプロセス)が同じデータを取得することを待っていることをほぼ意味するデータベースの巧妙性、ロックなどがあります。

あなたはコードの行に来るとき、私はあなたが(いくつかの架空の言語で)宣言

global int x = 7; 
つのスレッドで

x = 25000; 

print x; 

と別の

print x; 
で考えていると思います

2番目のスレッドが何を印刷するかについては何か言えますか?私たちは7か25000のどちらかを受け入れるかもしれません、概念的に非原子的な整数の割り当ての結果である25,000の上位バイトと7の下位バイトである数字を得ることはあまり喜ばしくありません。

さまざまなプログラミング言語は、彼らが望む意味論を自由に定義することができます.CPUが動作する自然な振る舞いを受け入れる人もいます(32ビットintは原子、64 longはそうではない) CPU自体がアトミック操作を提供していない場合、原子性を偽造したいと思っている場合、私は何らかの待っているものに代わるものを多く見ません。 Java同期キーワード。

+0

アトミシティは、結果が他の利害関係者に見える前に、完全な操作が完了するのを待つことを意味します。それは正しい要約ですか? – Pindatjuh

+0

アトミック性は、部分的な結果を得ることができないことを意味し、場合によっては中断の可能性がないため、単一のCPU操作を待っているだけで、明示的な待機が必要な場合や、 (例えば、Java同期化された)いくつかのオーバーヘッドを支払う。私はあなたがそのようなオーバーヘッドがいつ発生するかを知りたいと思うと思います。残念ながら、すべての言語とプラットフォームに依存している答えはありません。 – djna

+0

アトミック操作は、すべて、またはまったくありません。操作が開始されたケースでは、終了できない場合は正常に終了し、失敗した場合は開始時の状態がすべてそのまま残されます。 – MRAB

0

あなたが話している原子操作に依存します。あなたがISAレベルのものについて話しているなら、「テストと設定」の指示がいくつかの一般的なISAに含まれていると思います。

+2

"ISA"とは何ですか? – Pindatjuh

+3

命令セットアーキテクチャ...どのようなアセンブリ言語プログラムが書かれているかのように(機械命令のニーモニックではあるが、それでもなお)。 – Patrick87

+0

ありがとうございます!私は頭字語が好きではなかった:彼らはむしろあいまいである。 – Pindatjuh

8

同期メカニズム(mutex、セマフォなど)によって使用されるアトミックな操作については、シングルCPUマシンのOSとマルチCPUのハードウェアでサポートする必要があります。

単一のCPUマシン上では、命令シーケンスは、割り込みが遮断されている場合には途中で中断することができないという意味で「原子的」にすることができます(例えば、別のスレッドに切り替えるタイマ割り込み)。これは、CPUがカーネルモードに入り、割り込み制御レジスタにアクセスできるようになると、同期プリミティブを非常に簡単に書き込むことができることを意味します。

マルチコアマシンでは、より複雑です。そして、命令はすべてのCPUにわたって真にアトミックでなければなりません。これには、原子命令を実行するCPUだけでなく、キャッシュの関連部分をRAMにフラッシュするために、すべて CPUが必要です。このフラッシングは、これらのアーキテクチャで同期を非常に高価にする要因です。

命令自体は、1回の操作で「ビットテストとセット」の形式をとります。これは単純なミューテックスを実装するのに十分です。異なるCPU /コア上の2つのスレッドが同じアドレスで同じ時間にテストおよび設定操作を実行している場合でも、そのビットが設定されておらず、現在設定されているという結果しか得られません。そのスレッドは、ミューテックスを所有するスレッドです。

+0

私は概念的な「最小公約数」の説明を得ようとしていますが、あなたの答えに感謝します。 – Pindatjuh

+0

割り込みはいつでも*無効になっていますか?それは実際に現実には終わったのですか?このような仕組みのように見えるのは、ユーザー空間に横たわって放置しておくと危険なことです。 –

+0

@Brian:Interrutsはカーネル空間でのみ無効にすることができます。彼らは一般に、重要な操作中にカーネル内で無効にされ、再び有効になります。最も一般的な状況は、割込みハンドラが実行されるたびに優先度の低い割込みを自動的にマスクすることです。 –

関連する問題