パソコン関連の書籍等を読んで試したりしながらアウトプットしまくります。

アウトプットしながら学ぶ

OS

排他制御のテストアンドセットに関してわかりやすく説明してみます。

投稿日:

作って理解するOS x86系コンピュータを動かす理論と実装データ収集からWebアプリ開発まで 実践で学ぶ機械学習活用ガイドRaspberry Piで学ぶコンピュータアーキテクチャ (Make:PROJECTS)インフラ設計のセオリー --要件定義から運用・保守まで全展開IT Text オペレーティングシステム(改訂2版)ソースコードで体感するネットワークの仕組み ~手を動かしながら基礎からTCP/IPの実装までがわかる」という本を読んでいます。

排他制御に関する説明で、テストアンドセットの部分が理解しにくかったので、
自分なりに理解した結果を記述します。

同時に2つの処理ができない状況で、複数のプロセスの処理の順番待ちの管理をするという問題です。

プロセスA、Bが、同じ値Gを読み出し、Gが0なら自分の順番だと判断するという状況を考えます。

例えば次のような流れて処理をすれば問題ありません。

プロセスAがGを読み取る(G=0)

プロセス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が処理を実行する

これを解決するために考えられたのが、テストアンドセットです。

テストアンドセット命令では、次の処理が一度に実行されます。

-Gの値を読み出して記憶
-Gの値を1に更新

結局、この2つの処理の間に他の処理が入るということが問題だったので、
それ自体をできなくするためにハードウェア自体にテストアンドセット命令が実装されたということです。

-Gの値を読み出して記憶
-Gの値を1に更新

と分けて記述してあるので、間に処理できてしまうように思えてしまい、なかなか理解できませんでした。
この場合、2つの処理が分割されない一連の処理として動作します。
こういう処理のことをアトミック処理と言います。

ハードウェア自体が、この2つの処理の間に他の処理を入れることを許していないのであれば、
排他制御が実現できます。







-OS

Copyright© アウトプットしながら学ぶ , 2024 AllRights Reserved Powered by AFFINGER4.