2009-03-24 3 views
1

セマフォの機能を拡張しています。実際のセマフォーの実装が分からず、コードが正しく実行されていることを認識したときに、私はロードブロッキングに遭遇しました。私はこれを知る必要がありました。セマフォキュー

セマフォーは、sem_wait()を呼び出すときに待機しているスレッドをブロックし、別のスレッドが現在ロックしているスレッドをブロックすることがわかっています。スレッドはブロックされ、そのセマフォの待機リストに入れられます。

私の質問は、sem_post()で何が起きるかに関するものです。次のスレッドが待機中のリストから引き出され、ロックスレッドとして設定され、ブロック解除されていますか?または、全く異なる投稿を送信するスキームですか?

ありがとうございます!

  1. P()セマフォを解放するには(あなたがこのsem_waitを呼び出すように見える)
  2. V()をセマフォを取得する(あなたはこのsem_postを呼び出すように見える)

答えて

7

Semaphoresは、2つの操作を持っていますセマフォには、ブロッキングなしでP()を渡すことができる同時スレッドの数である整数が関連付けられています。 P()への他の呼び出しは、V()が呼び出されてスポットを解放するまでブロックされます。

これは、セマフォの古典的な定義です。

編集:セマフォは注文を保証しません。キューやその他のFIFO構造を実際に使用する必要はありません。一度に1つのスレッドのみが許可されているときにV()を呼び出すと、別の(おそらくランダムな)スレッドがそのP()呼び出しから戻り、続行します。

+0

一度に1つのスレッドしか通過できない場合、どのくらい正確に待ち行列がセマフォに対して機能するかを知ることは可能ですか? – user82229

+0

セマフォは注文を保証しません。キューやその他のFIFO構造を実際に使用する必要はありません。一度に1つのスレッドのみが許可されているときにV()を呼び出すと、別の(おそらくランダムな)スレッドがそのP()呼び出しから戻り、続行します。 –

+0

@Ben S:あなたの一部の人にそのコメントをお伝えしてみませんか?私はそれが最初にheluimwhippetが後になったものだと思うし、それはよく述べられている。 – dmckee

8

次のスレッドのブロックを解除するには、sem_wait()は、OSがコンテキストスイッチに切り替える次のスレッドになります。誰も注文の保証はしません。それはあなたのOSのスケジューリング戦略に依存します。これは、CPUから最も離れたスレッド、または最も高い「優先度」が割り当てられたスレッド、または歴史的に特定のリソース使用状況統計を持っていたスレッドなどである可能性があります。

ほとんどの場合、現在のスレッド(sem_post()を呼び出したスレッド)は、ユーザー入力の待機、別のセマフォのブロック、またはos-allocatedのタイムスライスを使い果たすまで、しばらくの間実行され続けます。その後、OSは完全に無関係のプロセスで、数分の1秒間(おそらくFirefoxなど)動作するように切り替えてから、ネットワークトラフィックを処理し、茶を一杯にし、ついには特定のスレッドがより多くのCPUまたはI/Oバウンドであるという過去の履歴に基づいているかどうかのようなものに基づいて、それが感じる他のスレッドのいずれかを選択します。

多くのOSでは、非常に長い間使われていないI/Oバウンドプロセスが優先されます。その理論は、新しいプロセスが短命になる可能性があるということです。(5時間ほど経過していれば、次の1msで終わることはないだろうということです)。 I/OバウンドプロセスはI/Oバウンドを続ける可能性が高いため、他のリソースを待っている間にCPUをすぐに切る可能性があります。基本的にOSは、できるだけ早く実行できるプロセスを探したいので、紅茶を飲んでマルウェアを稼働させることができます。