For faster navigation, this Iframe is preloading the Wikiwand page for 不可分操作.

不可分操作

この記事は検証可能参考文献や出典が全く示されていないか、不十分です。 出典を追加して記事の信頼性向上にご協力ください。(このテンプレートの使い方)出典検索?"不可分操作" – ニュース · 書籍 · スカラー · CiNii · J-STAGE · NDL · dlib.jp · ジャパンサーチ · TWL (2023年1月)

不可分操作(ふかぶんそうさ)あるいはアトミック操作 (: atomic operation) とは、情報工学においていくつかの操作を組み合わせたもので、システムの他の部分から見てそれらがひとつの操作に見えるものをいう。

条件

[編集]

不可分操作は、以下の2つの条件を満たさなければならない。

  1. 全操作が完了するまで、他のプロセスはその途中の状態を観測できない。
  2. 一部操作が失敗したら組合せ全体が失敗し、システムの状態は不可分操作を行う前の状態に戻る。

システムの他の部分から見て、操作の組合せが一度に成功したか失敗したように見える。途中の状態にアクセスすることはできない。このため不可分操作あるいはアトミック操作(= 原子操作)と呼ぶのである。

マルチプロセッサでなくとも、この実装は重要である。制御の流れが変更される可能性がある限り、不可分性がなければシステムが不正な状態になってしまう可能性がある。

単純な例

[編集]

例えば、プロセスがあるメモリ位置の内容をインクリメントしているとする。その処理の流れは以下のようになる:

  1. プロセスがその位置の値を読み込む。
  2. 同じプロセスがその値に 1 を加算する。
  3. 同じプロセスがそのメモリ位置に加算結果を書き込む。

ここで、2つのプロセスが一箇所の共有メモリ上の位置の内容をインクリメントすると仮定する:

  1. 1番目のプロセスがその位置の値を読み込む。
  2. 1番目のプロセスがその値に 1 を加算する。

ここで、1番目のプロセスが加算結果を書き戻す前にサスペンドされ、2番目のプロセスが走行し始めたとする:

  1. 2番目のプロセスがその位置の値を読み込む。読み込まれた値は1番目のプロセスが先に読み込んだのと同じ値。
  2. 2番目のプロセスがその値に 1 を加算する。
  3. 2番目のプロセスが加算結果を書き戻す。

ここで、2番目のプロセスがサスペンドされ、1番目のプロセスが再度走行する:

  1. 1番目のプロセスが自身の持つ加算結果を書き戻すが、それは2番目のプロセスの処理を反映していない。

これは些細な例である。実際のシステムでは、操作はより複雑で、微妙なエラーとなって現われるかもしれない。例えば、64ビットの値をメモリから読む操作は32ビットのリードを2回行うことで実現されている場合がある。プロセスが最初の32ビットをリード後、次の32ビットをリードする前に値が変更されるかもしれない。結果として得られた64ビット値は変更前とも変更後とも異なる無意味な値となる。

さらに、このような結果はプロセスの動作する順番に依存しており、デバッグしようとしても検出が難しい。

CPUアーキテクチャによる違いとロック

[編集]

カウンタのインクリメント/デクリメントは、RISCアーキテクチャの場合、上記の例のようにリードとライトが別々の命令で行われるために、そのままでは不可分操作にできない。しかし、x86アーキテクチャのようなCISCでは、インクリメントやデクリメントを1命令で実行する命令が存在するため、それだけで不可分性が成立する。必要最小限の不可分操作は、結局テスト・アンド・セットのような指定されたメモリアドレスへのリードとライトを不可分に行う操作となる。しかし、RISCアーキテクチャは 1命令で複数回のメモリアクセスを行わないのが基本思想であるため、直接テスト・アンド・セット命令を実装することはできない(テスト・アンド・セットを命令として実装する場合、バスをロックしてリードとライトを行って他のバスマスタがメモリアクセスを途中で発行できないようにしている)。そのためにコンペア・アンド・スワップLoad-Link/Store-Conditionalといった不可分操作が使われるようになった。

上記の例は「クリティカルセクション」のまわりでロックを獲得することで解決するように見える。しかし、ロックもハードウェアのサポート無しでは単なるメモリ上のデータでしかない。スピンロックなどのアルゴリズムをソフトウェアだけで実装することは可能だが、効率的ではない。そのために、上述のテスト・アンド・セットなどの不可分操作が最近のプロセッサで実装されており、そういった機能でロックを実装する。

関連項目

[編集]
{{bottomLinkPreText}} {{bottomLinkText}}
不可分操作
Listen to this article

This browser is not supported by Wikiwand :(
Wikiwand requires a browser with modern capabilities in order to provide you with the best reading experience.
Please download and use one of the following browsers:

This article was just edited, click to reload
This article has been deleted on Wikipedia (Why?)

Back to homepage

Please click Add in the dialog above
Please click Allow in the top-left corner,
then click Install Now in the dialog
Please click Open in the download dialog,
then click Install
Please click the "Downloads" icon in the Safari toolbar, open the first download in the list,
then click Install
{{::$root.activation.text}}

Install Wikiwand

Install on Chrome Install on Firefox
Don't forget to rate us

Tell your friends about Wikiwand!

Gmail Facebook Twitter Link

Enjoying Wikiwand?

Tell your friends and spread the love:
Share on Gmail Share on Facebook Share on Twitter Share on Buffer

Our magic isn't perfect

You can help our automatic cover photo selection by reporting an unsuitable photo.

This photo is visually disturbing This photo is not a good choice

Thank you for helping!


Your input will affect cover photo selection, along with input from other users.

X

Get ready for Wikiwand 2.0 🎉! the new version arrives on September 1st! Don't want to wait?