プログラミングにおける'原子性'の正確な定義は何ですか?

「アトミック性」の定義は、トランザクションがプロセス中に同時に実行されている可能性のあるアクションによって触れられたり操作されたりすることなく、トランザクションを終了できる必要があることを示しています。しかし、それはまた、プログラムがアトミックであると想定されているときにプログラムを同時に実行してはならないことを意味しますか?

例として2つのプログラムがあるとします:

example_program1:

counts int i = 1〜100毎秒

すべての数値が新しい行に出力されます

example_program2:

印刷するだけ" hi "

およびこれらのプログラムの両方を含む親プログラムで、特定のプログラムを開始するためのシグナルを受信すると、それらを実行します(例: 2バージョンのsigaction経由):

バージョン1:

シグナルを受信すると、いつでも(同時でも)プログラムを実行します

これは、program1がまだ数字を出力している間にprogram2が" hi "を出力できることを意味します

バージョン2:

のみ一度に1つのプログラムを実行する

進行中のプログラムが終了するまで他のプログラムのシグナルはブロックされます

この例では、バージョン2はアトミックまたはその両方と見なされますか?このプログラムは、たとえばprogram2がプロセス中にiを1インクリメントする場合にのみ、非アトミックになりますか?

コメント

  • 用語" atomic "は、さまざまなコンテキストで(いくつかの)さまざまな方法で使用されます。時々非常に似ていますが、それでも異なる方法で。非公式にもよく使用されます。あなたの質問は、データベース理論に基づいているように見える定義から始まりますが、次にプログラムについて話します。あなたの定義は"トランザクション"について話しますが、プログラムにはトランザクションがありません。 '誤って"アトミック"の誤った定義を使用している可能性があります。 (アトミック性の定義も'実際にはACIDの意味と一致しません。)

回答

操作Xがアトミックである場合、操作を監視している人は、操作がまだ開始されていないか完了していると見なされ、部分的に完了した状態ではないことを意味します。それだけです。

明らかに、操作Xを実行するコードを記述し、他のコードがそれを半分実行したり、干渉したりする可能性がある場合、操作Xの実装はアトミックではありません。

状況によっては、「アトミック」操作が成功または失敗する可能性があります。そのようなアトミック操作が失敗した場合、その効果は、操作が開始されたことがない場合とまったく同じである必要があります。

コメント

  • 注意として、これはACIDでの分離の意味であり、Atomicityの意味ではありません。'定義は、アトミック性のACID概念('は任意のコードにひどく関連していません)と一致/カバーすることを目的としています。

回答

プログラミング言語の「アトミック」の単純で形式的な抽象的な定義を知っているかどうかはわかりません。私は、さまざまな抽象化レベルで、さまざまなトピックに関して、さまざまなものを知っています。私はまた、かなり抽象的なように見えるが、かなり洗練された前提条件を持っているものも知っています(例えば、並行性の前層モデル)。問題の一部は、2つのプログラムが「同等に動作する」と言うさまざまな方法があり、一部の定義は「同等」の異なる概念を尊重する場合があることです。

スケッチ(私が作成している)並行性のインターリーブモデルに関する1つのアプローチは、次のとおりです。操作的セマンティクスが与えられると、一連のステートメントはアトミックに実行されますこれらのステートメントに関連する(操作的意味論の)すべての遷移が順番に発生する場合。ステートメントのシーケンスはアトミック if可能なすべての遷移シーケンスは、ステートメントのシーケンスをアトミックに実行します。これを「アトミックに実行されたかのように」に緩めることができます。これは、すべての可能な遷移シーケンスが同等であると言うことで形式化を開始できます(おそらく観察的に同等)ステートメントをアトミックに実行する一連の遷移と同等です。

Bアトミックに実行されるということは、ステートメントのシーケンスの実行を開始すると、他のステートメントの実行をシーケンスの実行にインターリーブしないことを意味します。実装に関しては、これは、スレッドのタイムスライス実装の場合のように、一度に1つのスレッドのみを実行することを意味する場合があり、アトミックに実行される一連のステートメントは、実行中にコンテキストスイッチがなかったことを意味します。上記の定義には、スレッド間の調整が実際にはうまく処理されないという問題があります。たとえば、2つのスレッド間のチャネルに沿った通信がこれまでアトミックであったと言っても意味がありません。 (データ構造に対する操作はアトミックであるとよく言われますが、この例にはおそらくそれがより適切でしょう。定義はデータ構造に固有です。)

サンプルプログラムの場合、 printステートメントを1回の遷移で処理できる操作的セマンティクスでは、プログラム2は常にアトミックに実行され、(かなり些細なことですが)アトミックです。 2番目の実行は、プログラム1がアトミックに実行され、最初の実行は実行されないシナリオを示しています。 2回目の実行が常に行われることを保証するメカニズムがあれば、プログラム1(そのメカニズムを使用)はアトミックであると言えますが、そうでない場合は、それ自体はアトミックではないと思われます。

コメント、「アトミック」は、非公式および/または実装指向の意味でよく使用されます。したがって、正確に意図されていることはしばしば不明確ですが、意図されていることの精神は通常合理的に明確です。

回答

プログラミングにおけるAtomicという単語の深く暗い古代の起源は、アセンブリ言語命令ATOMICを指します。個々の粒子(陽子、中性子、電子)のグループが原子と呼ばれる単一の壊れないユニットを形成するのと同じように、ATOMICのプログラミングでは、単一の中断できないユニット命令を形成するアセンブリ命令のグループを指します。 。最初のアセンブリ命令はATOMICで、割り込みがUNATOMICのようなもので再開されるまで、すべての割り込みを一時停止します。

それ以来、ATOMICという言葉はマーケティングでひどく誤用されてきました。単一の命令をATOMICと呼ぶのはばかげています。

ATOMICは元々頭字語でしたが、「複数の命令クラスターのセット」だったのではないかと思います。申し訳ありませんが、Tについてはよくわかりません。

コメント

  • Calling a single instruction ATOMIC is just sillyええと、アトミック複数のバスサイクルを含むメモリ転送、およびテストアンドセットなどの命令。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です