セマフォとモニタの大きな違いは、セマフォはwait()やsignal()操作を行う整数変数であるのに対し、モニタは一度に一つのプロセスだけが共有リソースを使用できる抽象データ型であることです。
通常、OS上では複数のプロセスが動作しています。
多くのプロセスが共有資源にアクセスすると、レースコンディションを引き起こす可能性があります。
そのため、プロセスを同期させることが不可欠です。
プロセスの同期を実現する方法として、セマフォとモニタがあります。
セマフォとは
セマフォは整数の変数(S)です。
アトミック操作の wait () と signal () は、セマフォの値を変更するのに役立ちます。
あるプロセスがセマフォを変更した場合、他のプロセスは同時に変更することができない。
セマフォには2つのタイプがあります。
2進セマフォは2つの整数値を持つことができます。
クリティカルセクションは、共有変数または共有リソースにアクセスするコードセグメントです。
プロセスはクリティカルセクションにアクセスする必要があるとき、wait()操作を実行してセマフォの値を1から0に減らし、クリティカルセクションから出た後、signal()操作を行ってセマフォの値を1に戻す。
カウントセマフォは複数の値を持つことができます。
クリティカルセクションに入る必要がある場合、プロセスはwait()を実行する。
クリティカルセクションを抜けると、signal()を実行し、セマフォの値は1つ減少する。
そして、セマフォの値は1だけ増加する。
どちらの場合でも、セマフォの値が0であれば、すべてのリソースが使用中です。
したがって、現在実行中のプロセスが資源を解放し、セマフォの値が0より大きくなるまでwait()を実行する。
モニターとは
Monitorは、抽象的なデータ型です。
共有データ変数と、その共有変数を操作するプロシージャのセットが含まれています。
プロセスはモニター内の共有変数に直接アクセスできません。
代わりに、プロセスはモニターに定義されたプロシージャを通じてアクセスする必要があります。
一度にモニター内の共有変数にアクセスできるのは、1つのプロセスだけです。
言い換えれば、一度にアクティブになるのは1つのプロセスだけです。
同様に、モニターはデータの一貫性を維持するのに役立ちます。
他のプロセスが共有変数にアクセスする必要がある場合、前のプロセスがそれを解放するまでキューで待機しなければなりません。
さらに、モニターには条件変数があります。
これにより、あるプロセスはモニタ内で待機し、前のプロセスがリソースを解放したときに処理を続行することができます。
セマフォとモニターの違い
定義
セマフォは、マルチタスクOSなどの並行システムにおいて、複数のプロセスから共通のリソースへのアクセスを制御するために使用される変数です。
これに対してモニタは、スレッドの相互排除と、ある条件が真になるのを待つ(ブロックする)機能の両方を持つことができる同期構造です。
したがって、ここがセマフォとモニタの大きな違いです。
タイプ
セマフォとモニタのもう一つの違いは、セマフォが整数変数であるのに対し、モニタは抽象データ型であることです。
条件変数
また、セマフォには条件変数の概念がありませんが、モニタには条件変数があります。
アクセス方法
プロセスはセマフォへのアクセスが必要な場合、wait()を実行し、リソースを解放する場合は signal()を実行します。
一方、モニターでは、プロセスはプロシージャを使用して共有変数にアクセ スします。
したがって、この点もセマフォとモニタの違いです。
結論
簡単に説明すると、セマフォとモニタはプロセスを同期させるための2つの方法です。
セマフォとモニタの主な違いは、セマフォがwait()やsignal()操作を行う整数型変数であるのに対し、モニタは共有リソースを一度に1プロセスのみ使用できる抽象データ型である点です。