排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。
と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。
No.5ベストアンサー
- 回答日時:
> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?
「一般論」と書いた意味を取り落とされているのではないかと思います。
「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。
なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)
ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。
ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。
ありがとうございます。
環境依存が(目的とする動作に影響)無く、両方とも
使用可能な場合は利便性を考えてどちらかを用いればよい、ということですね。
MutexとSemaphoreの環境についての差を考えずに質問したので、
皆さんに環境によって変わるので一概に言えないという
ご指摘を受けてしまいました。
用いる際は、環境に気をつけてどちらを使用するか
よく検討したいと思います。
No.4
- 回答日時:
詳細な定義はOSによって違ってくるので、一般論だけで話していても余り意味はありません。
セマフォだけしかない環境も、ミューテックスしかない環境も実在しますし。他の方と別の視点を与える意味で、ITRONのセマフォとミューテックスの違いを書くと、セマフォは複数ロックできるのに対して、ミューテックスは1つのロックだけというほかに、ミューテックスはデッドロックを回避するために優先度継承プロトコルが利用できるとか、ロック状態でタスクを終了した場合に自動的に解放されるといった違いがあります。ITRONのタスクはスレッドとほぼ同義で、プロセスの概念はありませんから、プロセス間/スレッド間といった相違はありません。
ありがとうございます。
どちらかしか使えないような状況もあるのですね。
ITRONが何かわからなかったので調べてみました。
このような環境もあるんですね。
参考になりました。
No.3
- 回答日時:
一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
しかし、Win32環境に限定すると、これ以上の違いがあります。
Win32では、Mutexに対するWaitとSemaphoreに対するWaitに次のような違いがあります。
Mutexは「どのスレッドに取得されたか」を認識していて、Mutexを取得しているスレッド内で同じMutexに対して再度Waitしてもブロックされません。
Semaphoreは「どのスレッドに取得されたか」を認識せず、Semaphoreを取得している同じスレッドで再度Waitすると、もう一度Semaphoreを取得しようとします。このとき、残りカウントが0だと(Semaphoreの定義により)他のスレッドでSemaphoreが開放されるまでブロックされます。
こういうスレッドに対する認識の違いがあるため「スレッド用」とか「プロセス用」とかの冠が付けられてしまう場合があるのだと思いますが、違いさえ認識していればどちらの用途に使っても全く差し支えありません。
この回答への補足
>一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
とのことですが、これはWin32以外の環境だと
これ以上の違いはないと言うことでしょうか?
だとするとmutexの存在意義がよくわからなくなってしまいます。
あるリソースをロックしたければセマフォのカウントを1に
して使えばよいだけのような。。?
No.2
- 回答日時:
ミユーテックが単一リソースの完全な排他を目的とするのに対し、セマフォは主に負荷調整を目的とする排他なのかなと思います。
例えば、OSの制限では1台のサーバに1万まで同時接続できるが、現実の性能としては100くらいが限界なので、セマフォを使って制限をかける。
個人的には、ミューテックはリストへの追加などでも使いますが、セマフォは使いどころがほとんど無いです。
ありがとうございます。
>ミユーテックが単一リソースの完全な排他を目的
>セマフォは主に負荷調整を目的
使用目的がわかりました。
セマフォはあまり使い道がないのですか。。
No.1
- 回答日時:
<ミューテックス>
同時に1プロセス(スレッド)しかリソースにアクセスできないようにするためのもの。
<セマフォ>
指定した数の範囲内で、同時に複数プロセス(スレッド)がリソースアクセスできる。
※ここでいうリソースとは、ファイルだったり、共有メモリだったり、場合によっていろいろです。
※どちらもプロセス間制御、スレッド間制御で利用できます。
この回答への補足
mutexもセマフォもスレッド、プロセス共に
制御できるとのことですが、自分が見た限りでは
mutexがプロセスの制御をできると言う資料がみつかりませんでした。
よろしければいい例のあるサイト等を教えて頂けないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 地理学 領海と排他的経済水域の違いについて。 上記2点の具体的な違いはなんでしょうか。 範囲が違うのは既に知 3 2023/01/20 19:24
- タブレット 子供のタブレットのペアレンタルコントロール 1 2023/04/14 14:34
- ビデオカード・サウンドカード 1つのマザボでAMD&NVIDIAを同時使用できますか? 3 2022/04/22 14:36
- 国産バイク 最低ABSさえちゃんとついていれば、その他のバイクの電子制御ってほとんどは、 ●色々な路面状況やバイ 2 2023/08/16 13:45
- デスクトップパソコン 光学ドライブのトレイが開かなくなりました 5 2023/05/25 13:53
- 環境学・エコロジー 二酸化炭素の排出 1 2023/08/07 16:40
- 世界情勢 非モテの愚かな他者攻撃 現代の弱肉強食の資本主義社会の中で、弱者である「持たざる者」非モテ男性には心 5 2023/07/16 11:27
- その他(悩み相談・人生相談) 性欲に個人差があるように食欲にも個人差があるのではないですか? 痩せている人は食欲を制御しているわけ 4 2022/08/07 10:53
- その他(住宅・住まい) 窓用換気扇の運用方法 2 2023/06/04 00:40
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「黒歴史」教えて下さい
- ・2024年においていきたいもの
- ・我が家のお雑煮スタイル、教えて下さい
- ・店員も客も斜め上を行くデパートの福袋
- ・食べられるかと思ったけど…ダメでした
- ・【大喜利】【投稿~12/28】こんなおせち料理は嫌だ
- ・前回の年越しの瞬間、何してた?
- ・【お題】マッチョ習字
- ・モテ期を経験した方いらっしゃいますか?
- ・一番最初にネットにつないだのはいつ?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・2024年に成し遂げたこと
- ・3分あったら何をしますか?
- ・何歳が一番楽しかった?
- ・治せない「クセ」を教えてください
- ・【大喜利】【投稿~12/17】 ありそうだけど絶対に無いことわざ
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・集合写真、どこに映る?
- ・自分の通っていた小学校のあるある
- ・フォントについて教えてください!
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
怪しいプロセス教えてください。
-
プロセスハンドル or ウインド...
-
C言語 特定のプロセスの終了を...
-
Windowsでのfork方法
-
vb.netでEXCEL起動がうまくでき...
-
起動中の他のプログラム(orプ...
-
プロセスIDからウィンドウハ...
-
バックグラウンドのプロセスの...
-
VB.NETで起動したExcelの閉じ方...
-
プロセスIDの取得方法について
-
Windows7アプリケーションのプ...
-
プロセスIDの再利用
-
remove関数(?)でプロセスが停...
-
ShellExecuteExでハンドルの取得
-
conime.exeってウイルスですか?
-
ShellExecuteが起動したプロセ...
-
Macターミナルで実行中のプログ...
-
家電製品の電力周波数を変える機械
-
sendkeysにてALT+CTRL+INSERTを...
-
電車のドアの前での並び方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バックグラウンドのプロセスの...
-
Process.Startの戻り値を後で取得
-
プロセスのアタッチ・デタッチ...
-
タスクマネージャーのプロセス...
-
C#でのbatファイル実行結果取得
-
ADOでアクセスのレコードに...
-
プロセスIDの取得方法について
-
explorer.exeが異様にメモリを食う
-
セマフォとmutexの違いは?
-
Windowsでのfork方法
-
プロセスIDからウィンドウハ...
-
VB6.0 SHELLで起動...
-
OSPFでプロセスを分ける意義に...
-
非表示になったエクセルは?
-
ウィンドウのタイトルからプロ...
-
怪しいプロセス教えてください。
-
シェルで親プロセス終了時に子...
-
【C#】別プロセスがロックか...
-
API関数 GetExitCodeProcess
-
Linuxでのスレッド間メッセージ...
おすすめ情報