不可分操作
例えば、プロセスがあるメモリ位置の内容をインクリメントしているとする。その処理の流れは以下のようになる:
プロセスがその位置の値を読み込む。
同じプロセスがその値に 1 を加算する。
同じプロセスがそのメモリ位置に加算結果を書き込む。
ここで、2つのプロセスが一箇所の共有メモリ上の位置の内容をインクリメントすると仮定する:
1番目のプロセスがその位置の値を読み込む。
1番目のプロセスがその値に 1 を加算する。
ここで、1番目のプロセスが加算結果を書き戻す前にサスペンドされ、2番目のプロセスが走行し始めたとする:
2番目のプロセスがその位置の値を読み込む。読み込まれた値は1番目のプロセスが先に読み込んだのと同じ値。
2番目のプロセスがその値に 1 を加算する。
2番目のプロセスが加算結果を書き戻す。
ここで、2番目のプロセスがサスペンドされ、1番目のプロセスが再度走行する:
1番目のプロセスが自身の持つ加算結果を書き戻すが、それは2番目のプロセスの処理を反映していない。
これは些細な例である。実際のシステムでは、操作はより複雑で、微妙なエラーとなって現われるかもしれない。例えば、64ビットの値をメモリから読む操作は32ビットのリードを2回行うことで実現されている場合がある。プロセスが最初の32ビットをリード後、次の32ビットをリードする前に値が変更されるかもしれない。結果として得られた64ビット値は変更前とも変更後とも異なる無意味な値となる。
さらに、このような結果はプロセスの動作する順番に依存しており、デバッグしようとしても検出が難しい。
不可分操作(ふかぶんそうさ)あるいはアトミック操作 (英: atomic operation) とは、情報工学においていくつかの操作を組み合わせたもので、システムの他の部分から見てそれらがひとつの操作に見えるものをいう。