セマフォとモニター-違いは何ですか?


233

モニターセマフォの主な違いは何ですか?


8
モニターはバイナリセマフォと考えることができます。
Maxim Egorushkin、2011


1
このalbahari.com/threading/part2.aspxにアクセスしてください。私はこの記事を読んだ。これまでに読んだスレッドの中で最高のもの
Shantanu Gupta

5
マキシム、あなたが正しいとは思わない。Monitorは本格的なオブジェクトですが、セマフォは「低レベル」の構造です。大学のオペレーティングシステムのクラスでモニターについて簡単に説明したことを覚えていますが、オブジェクト指向であることを除けば、モニターがミューテックスとどのように異なっていたかは覚えていません。モニターを使用して1つの問題を実行できることを覚えていますが、C言語の制限により、クラスで同じメソッドを使用できませんでした。
user919860 2011年

1
セマフォとモニターは非常に異なりますが、互いに実装できるという意味では、パワーは同等です。あなたは自分の等価性を証明するホーアのオリジナルの論文読むことができ、ここで
タンDK

回答:


529

A モニターは、複数のスレッドからアクセスされるように設計されたオブジェクトです。監視オブジェクトのメンバー関数またはメソッドは相互排除を強制するので、一度に1つのスレッドのみがオブジェクトに対してアクションを実行できます。1つのスレッドが現在オブジェクトのメンバー関数を実行している場合、そのオブジェクトのメンバー関数を呼び出そうとする他のスレッドは、最初のスレッドが終了するまで待機する必要があります。

A セマフォは、低レベルのオブジェクトです。セマフォを使用してモニターを実装することもできます。セマフォは本質的に単なるカウンタです。カウンタが正の場合、スレッドがセマフォを取得しようとすると、それが許可され、カウンタが減少します。スレッドが完了すると、セマフォが解放され、カウンタが増加します。

スレッドがセマフォを取得しようとしたときにカウンタがすでにゼロの場合、別のスレッドがセマフォを解放するまで待機する必要があります。スレッドがセマフォを解放するときに複数のスレッドが待機している場合、そのうちの1つがそれを取得します。セマフォを解放するスレッドは、それを獲得したスレッドと同じである必要はありません。

モニターは公衆トイレのようなものです。一度に入ることができるのは一人だけです。彼らはドアをロックして他の人が入ってくるのを防ぎ、自分の仕事をし、そして彼らが去るときにそれを解錠する。

セマフォは自転車のレンタル場所のようなものです。彼らは一定数の自転車を持っています。自転車を借りて無料で利用できる場合は、自転車に乗ることができます。それ以外の場合は、待つ必要があります。誰かが自分の自転車を返却すると、他の誰かがそれを取ることができます。自転車を持っている場合は、他の人に返却してもらうことができます---自転車を借りる場所は、自転車を返却する限り誰が返却してもかまいません。


162
+1公衆トイレや自転車のレンタル場所との類似点。私はこの2つの違いを決して忘れません。
Drupad Panchal

4
あなたの答えは、stackoverflow.com / a / 7336799/632951 .. と矛盾しているようです。
Pacerier 2011

6
@Pacerier:私は:-)唯一の矛盾は、高レベル/低レベルのものです。モニターはセマフォから構築できます、モニターはセマフォよりも高レベルの構造であるため、それほど整然としていません。セマフォは待機中の単なるカウンタです。「セマフォのリトルブック」を読むことをお勧めしますgreenteapress.com/semaphores
Anthony Williams

3
@AnthonyWilliams:セマフォからしかモニターを構築できないという考えをおそらく疑います。もう1つの方法も可能であり、そのため、モニターがセマフォよりも高レベルのエンティティであると断言することはできません。
Kavish Dwivedi 2013

5
はい、セマフォをモニターから構築できます。高レベルのオブジェクトから低レベルのオブジェクトをいつでも構築できます。高/低レベルのものは、機能と操作の範囲に関するものであり、他のものを構築するために使用できるものではありません。
アンソニーウィリアムズ

11

以下の説明では、モニターのwait()およびsignal()がセマフォのPおよびVとどのように異なるかを実際に説明します。

モニター内の条件変数に対するwait()およびsignal()操作は、セマフォのカウントに関するPおよびV操作に似ています。

waitステートメントはプロセスの実行をブロックできますが、signalステートメントは別のプロセスのブロックを解除できます。ただし、いくつかの違いがありますそれらの間の。プロセスがP操作を実行するとき、カウントするセマフォがゼロより大きい可能性があるため、プロセスが必ずしもそのプロセスをブロックするわけではありません。対照的に、待機ステートメントが実行されると、常にプロセスがブロックされます。タスクがセマフォに対してV操作を実行すると、そのセマフォを待機しているタスクのブロックを解除するか、ロックを解除するタスクがない場合はセマフォカウンタをインクリメントします。一方、ブロック解除するプロセスが他にないときにプロセスがシグナルステートメントを実行しても、条件変数には影響がありません。セマフォとモニターのもう1つの違いは、V操作によって起こされたユーザーが遅延なく実行を再開できることです。逆に、信号操作で覚醒したユーザーは、モニターのロックが解除された場合にのみ再開されます。加えて、

リンク:詳細については、こちらご覧ください。それが役に立てば幸い。


6

一行回答:

モニター:モニター で一度に実行できるスレッドは1つだけです。(シングルスレッドを実行するにはロックを取得する必要があります)

セマフォ: 共有リソースを保護するロック。(リソースにアクセスするにはロックを取得する必要があります)


5

セマフォを使用すると、複数のスレッド(設定された数まで)が共有オブジェクトにアクセスできます。モニターは、共有オブジェクトへの相互排他的なアクセスを許可します。

モニター

セマフォ


10
しかし、モニターとMutExはどのように異なるのでしょうか。相互排他ロックはセマフォとまったく同じことを行いますが、一度に1つのスレッドのみがクリティカル領域にアクセスすることを許可します。
user919860 2011年

2
はい、mnitorとmutexの違いは何ですか?
Pacerier 2011

2
セマフォは共有オブジェクトへのアクセスを制御せず、共有リソース(複数のオブジェクトを含む)へのアクセスを制御しないことに注意してください。
xbonez '15

@xbonez:見てみるjava.util.ArrayListと、それはオブジェクトですか、それとも複数のオブジェクトのコンテナですか?まあ、それは同時に両方です。セマフォはそれへのアクセスを制御するのに適切ですか?私は言うでしょう:いいえ。
dma_k 2016年

承認された回答自体には、Monitorが相互排除を実装していると記載されています。「監視オブジェクトのメンバー関数またはメソッドは相互排除を強制するので、一度に1つのスレッドのみがオブジェクトに対してアクションを実行することができます」を参照してください
achoora

2

セマフォを使用してクリティカル領域を保護する場合、セマフォと保護されるデータの間に直接の関係はありません。これは、セマフォがコードの周りに分散している理由の1つであり、待機または通知の呼び出しを忘れがちな理由の1 つです。であり、です。この場合、相互排除に違反したり、リソースを永続的にロックしたりする結果になります。

対照的に、これらの悪いことはモニターでは起こりえません。モニターはデータに直接疲れます(データをカプセル化します)。モニター操作はアトミックアクションであるため、エントリプロトコルを呼び出さずにデータにアクセスできるコードを作成することはできません。終了プロトコルは、監視操作が完了すると自動的に呼び出されます。

モニターには、続行する前に条件変数の形式で条件を同期するための組み込みメカニズムがあります。条件が満たされない場合、プロセスは条件の変更が通知されるまで待機する必要があります。プロセスが条件の同期を待機しているとき、モニターの実装は相互排除の問題を処理し、別のプロセスがモニターにアクセスできるようにします。

The Open University M362 Unit 3「Interacting process」コース資料から取得。


それを除いて、セマフォは言語でかなり一般的に利用可能になり、限定されたアトミック演算子を持つ一種の変数として教科書で提示されますが、セマフォはモニターの特殊なケースです - セマフォは限定されたアトミック演算子を持つ一種の変数なので、それがモニターなのですから。セマフォが「低レベル」であるという上記の議論は疑わしいものです。
philipxy 2017

2

セマフォ:

カウンターまたはフラグを使用して並行システム内の一部の共有リソースへのアクセスを制御することは、セマフォの使用を意味します。

例:

  1. 劇場/バス/電車/楽しい乗り物/教室の50席(共有リソース)を50人の乗客だけが取得できるようにするカウンター。そして、誰かが席を空けた場合にのみ、新しい乗客を許可します。
  2. バスルームの空き状況を示すバイナリフラグ。
  3. 信号機はフラグの良い例です。道路上の車両の通過を規制することで流れを制御します(共有リソース)

フラグは、リソースの現在の状態のみを示し、リソース上の待機中または実行中のオブジェクトに関するカウントやその他の情報は示しません。

モニター:

A モニター、いくつかの条件が真になるの取得へのアクセスや待ち時間にそれらを求めて、オブジェクトに興味のあるスレッドと通信することで、オブジェクトへのアクセスを同期化します。

例:

  1. 父親は娘のモニターとして機能し、一度に1人の男としかデートできない場合があります。
  2. バトンを使用して1人の子供だけがクラスで話すことを許可する学校の先生。
  3. 最後に技術的なものとして、整合性を維持するために同期されたAccountオブジェクトのトランザクション(スレッド経由)。

道路交差点の信号機もバイナリフラグであると思います。一方の道路または直交道路のどちらの車も(相互に排他的)に運転できるため、例(3)は(2)と同じです。また、これらの例はセマフォのコーナーケース(自明なケース)であり、モニターを使用して実装できると思います。ウィキペディアにはもっと典型的な例があります。
dma_k 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.