排他制御に関する説明で、テストアンドセットの部分が理解しにくかったので、
自分なりに理解した結果を記述します。
同時に2つの処理ができない状況で、複数のプロセスの処理の順番待ちの管理をするという問題です。
プロセスA、Bが、同じ値Gを読み出し、Gが0なら自分の順番だと判断するという状況を考えます。
例えば次のような流れて処理をすれば問題ありません。
プロセスAがGを読み取る(G=0)
↓
プロセスAがGを1に更新、プロセスAが処理を実行する
↓
プロセスBがGを読み取る(G=1)
↓
プロセスBはG=1なので待機
↓
プロセスAがGを1に更新、プロセスAが処理を実行する
↓
プロセスBがGを読み取る(G=1)
↓
プロセスBはG=1なので待機
次のような順番で処理されると、同時に2つのプロセスが実行されてしまいます。
プロセスAがGを読み取る(G=0)
↓
プロセスBがGを読み取る(G=0)
↓
プロセスAがGを1に更新、プロセスAが処理を実行する
↓
プロセスBもGを1に更新、プロセスBが処理を実行する
↓
プロセスBがGを読み取る(G=0)
↓
プロセスAがGを1に更新、プロセスAが処理を実行する
↓
プロセスBもGを1に更新、プロセスBが処理を実行する
これを解決するために考えられたのが、テストアンドセットです。
テストアンドセット命令では、次の処理が一度に実行されます。
-Gの値を読み出して記憶
-Gの値を1に更新
-Gの値を1に更新
結局、この2つの処理の間に他の処理が入るということが問題だったので、
それ自体をできなくするためにハードウェア自体にテストアンドセット命令が実装されたということです。
-Gの値を読み出して記憶
-Gの値を1に更新
-Gの値を1に更新
と分けて記述してあるので、間に処理できてしまうように思えてしまい、なかなか理解できませんでした。
この場合、2つの処理が分割されない一連の処理として動作します。
こういう処理のことをアトミック処理と言います。
ハードウェア自体が、この2つの処理の間に他の処理を入れることを許していないのであれば、
排他制御が実現できます。