- ベストアンサー
セマフォとmutexの違いは?
排他制御としてセマフォとmutexがありますが、 この二つの違いがよくわかりません。 自分で調べてみたところ、 ・セマフォ…プロセス間排他制御。複数ロックがかけられる。 ・mutex…スレッド間排他制御。ロックは一つだけ。 と言うような違いがあるようなのですが、これだけの差なんでしょうか? (これだけの差、と言ってる時点で筋違いだったら申し訳ありません) また、セマフォをスレッド間排他制御に用いたり、 mutexをプロセス間排他制御に用いることは可能なのでしょうか? 可能だとしたら、これらが2種類存在する理由も教えていただきたいです。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。 > とのことですが、これはWin32以外の環境だと > これ以上の違いはないと言うことでしょうか? 「一般論」と書いた意味を取り落とされているのではないかと思います。 「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。 なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。) ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。 ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。
その他の回答 (4)
- jacta
- ベストアンサー率26% (845/3158)
詳細な定義はOSによって違ってくるので、一般論だけで話していても余り意味はありません。セマフォだけしかない環境も、ミューテックスしかない環境も実在しますし。 他の方と別の視点を与える意味で、ITRONのセマフォとミューテックスの違いを書くと、セマフォは複数ロックできるのに対して、ミューテックスは1つのロックだけというほかに、ミューテックスはデッドロックを回避するために優先度継承プロトコルが利用できるとか、ロック状態でタスクを終了した場合に自動的に解放されるといった違いがあります。ITRONのタスクはスレッドとほぼ同義で、プロセスの概念はありませんから、プロセス間/スレッド間といった相違はありません。
お礼
ありがとうございます。 どちらかしか使えないような状況もあるのですね。 ITRONが何かわからなかったので調べてみました。 このような環境もあるんですね。 参考になりました。
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。 しかし、Win32環境に限定すると、これ以上の違いがあります。 Win32では、Mutexに対するWaitとSemaphoreに対するWaitに次のような違いがあります。 Mutexは「どのスレッドに取得されたか」を認識していて、Mutexを取得しているスレッド内で同じMutexに対して再度Waitしてもブロックされません。 Semaphoreは「どのスレッドに取得されたか」を認識せず、Semaphoreを取得している同じスレッドで再度Waitすると、もう一度Semaphoreを取得しようとします。このとき、残りカウントが0だと(Semaphoreの定義により)他のスレッドでSemaphoreが開放されるまでブロックされます。 こういうスレッドに対する認識の違いがあるため「スレッド用」とか「プロセス用」とかの冠が付けられてしまう場合があるのだと思いますが、違いさえ認識していればどちらの用途に使っても全く差し支えありません。
お礼
ありがとうございます。 今回使うのはUNIX環境ですが、大変参考になりました。
補足
>一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。 とのことですが、これはWin32以外の環境だと これ以上の違いはないと言うことでしょうか? だとするとmutexの存在意義がよくわからなくなってしまいます。 あるリソースをロックしたければセマフォのカウントを1に して使えばよいだけのような。。?
ミユーテックが単一リソースの完全な排他を目的とするのに対し、セマフォは主に負荷調整を目的とする排他なのかなと思います。 例えば、OSの制限では1台のサーバに1万まで同時接続できるが、現実の性能としては100くらいが限界なので、セマフォを使って制限をかける。 個人的には、ミューテックはリストへの追加などでも使いますが、セマフォは使いどころがほとんど無いです。
お礼
ありがとうございます。 >ミユーテックが単一リソースの完全な排他を目的 >セマフォは主に負荷調整を目的 使用目的がわかりました。 セマフォはあまり使い道がないのですか。。
- ID-PeaceC
- ベストアンサー率46% (97/209)
<ミューテックス> 同時に1プロセス(スレッド)しかリソースにアクセスできないようにするためのもの。 <セマフォ> 指定した数の範囲内で、同時に複数プロセス(スレッド)がリソースアクセスできる。 ※ここでいうリソースとは、ファイルだったり、共有メモリだったり、場合によっていろいろです。 ※どちらもプロセス間制御、スレッド間制御で利用できます。
お礼
ありがとうございます。 両方ともプロセス間、スレッド間で利用できるのですね。 参考になりました。
補足
mutexもセマフォもスレッド、プロセス共に 制御できるとのことですが、自分が見た限りでは mutexがプロセスの制御をできると言う資料がみつかりませんでした。 よろしければいい例のあるサイト等を教えて頂けないでしょうか?
お礼
ありがとうございます。 環境依存が(目的とする動作に影響)無く、両方とも 使用可能な場合は利便性を考えてどちらかを用いればよい、ということですね。 MutexとSemaphoreの環境についての差を考えずに質問したので、 皆さんに環境によって変わるので一概に言えないという ご指摘を受けてしまいました。 用いる際は、環境に気をつけてどちらを使用するか よく検討したいと思います。