web-dev-qa-db-ja.com

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

MonitorSemaphoreの主な違いは何ですか?

219
user919860

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

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

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

モニターは公衆トイレのようなものです。一度に入力できるのは1人だけです。ドアをロックして他の人が入ることを防ぎ、自分の仕事をしてから、出て行くときにドアのロックを解除します。

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

498

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

Aの条件変数に対するwait()およびsignal()操作monitorPおよびVセマフォのカウント操作

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

リンク: here さらに読みます。それが役に立てば幸い。

9
Abu Shumon

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

モニター

セマフォ

5
tafoo85

1行の回答:

Monitor:は、一度に1つのスレッドのみがモニターで実行できるように制御します。 (シングルスレッドを実行するにはロックを取得する必要があります)

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

5
Billz

セマフォ:

カウンターまたはフラグを使用して、並行システムの一部の共有リソースへのアクセスを制御するには、Semaphoreを使用する必要があります。

例:

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

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

モニター:

A Monitorオブジェクトに関心のあるスレッドと通信し、アクセスを取得するか、何らかの条件が満たされるまで待機するようにスレッドに要求することにより、オブジェクトへのアクセスを同期します。

例:

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

セマフォを使用して重要な領域を保護する場合、セマフォと保護されるデータの間に直接的な関係はありません。これは、セマフォがコード全体に分散している理由の一部であり、waitまたはnotify、この場合、結果はそれぞれ、相互排除に違反するか、リソースを永続的にロックします。

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

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

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

2
e.doroskevic