並行プログラミングに関連するこれらの言葉を聞いたことがありますが、ロック、ミューテックス、セマフォの違いは何ですか?
10 に答える
ロックは、ロックされた部分に入るスレッドを 1 つだけ許可し、ロックは他のプロセスと共有されません。
ミューテックスはロックと同じですが、システム全体 (複数のプロセスで共有) にすることができます。
セマフォはミューテックスと同じことを行いますが、x 個のスレッドが入ることができます。これは、たとえば、同時に実行される CPU、IO、または RAM を集中的に使用するタスクの数を制限するために使用できます。
ミューテックスとセマフォの違いに関する詳細な投稿については、こちらをお読みください。
また、いつでも無制限の数のリーダーまたは 1 つのライターを許可する読み取り/書き込みロックもあります。
これらの言葉に関しては多くの誤解があります。
これは以前の投稿 ( https://stackoverflow.com/a/24582076/3163691 ) からのもので、ここに見事に適合します。
1) クリティカル セクション= 1 つのプロセス内の他の多くのスレッドから 1 つのアクティブなスレッドの実行を許可するために使用されるユーザー オブジェクト。他の選択されていないスレッド (このオブジェクトを取得中) はスリープ状態になります。
[インタープロセス機能なし、非常に原始的なオブジェクト]。
2) ミューテックス セマフォ (別名ミューテックス) =さまざまなプロセス間で、他の多くのスレッドからアクティブなスレッドを 1 つだけ実行できるようにするために使用されるカーネル オブジェクト。他の選択されていないスレッド (このオブジェクトを取得中) はスリープ状態になります。このオブジェクトは、スレッドの所有権、スレッドの終了通知、再帰 (同じスレッドからの複数の「取得」呼び出し)、および「優先順位の逆転の回避」をサポートします。
[インタープロセス機能、非常に安全に使用でき、一種の「ハイレベル」同期オブジェクト]。
3) Counting Semaphore (別名 Semaphore) =他の多くのアクティブなスレッドのグループの実行を許可するために使用されるカーネル オブジェクト。他の選択されていないスレッド (このオブジェクトを取得中) はスリープ状態になります。
[プロセス間機能は、次の「ミューテックス」属性がないため、使用するのはあまり安全ではありません: スレッド終了通知、再帰?、「優先度逆転回避」など]。
4) そして今、「スピンロック」について話しています。最初にいくつかの定義があります:
Critical Region= 2 つ以上のプロセスによって共有されるメモリ領域。
Lock= 「クリティカル領域」への進入を許可または拒否する値を持つ変数。(単純な「ブール値フラグ」として実装できます)。
ビジー待機 = 何らかの値が表示されるまで継続的に変数をテストします。
ついに:
スピンロック (別名スピンロック) =ビジー待機を使用するロック。(ロックの取得はxchgまたは同様のアトミック操作によって行われます)。
[スレッドのスリープはなく、主にカーネル レベルでのみ使用されます。ユーザーレベルのコードには非効率]。
最後のコメントとして、確かではありませんが、上記の最初の 3 つの同期オブジェクト (#1、#2、および #3) が実装の一部としてこの単純な獣 (#4) を使用することで、大金を賭けることができます。
良い一日を過ごしてください!。
参考文献:
- Qing Li と Caroline Yao による組み込みシステムのリアルタイム コンセプト (CMP Books)。
-Andrew Tanenbaum (Pearson Education International) による最新のオペレーティング システム (3 番目)。
- Jeffrey Richter による Microsoft Windows 用プログラミング アプリケーション (第 4 回) (Microsoft プログラミング シリーズ)。
ウィキペディアには、セマフォとミューテックスの違いに関する優れたセクションがあります。
ミューテックスは基本的にバイナリ セマフォと同じものであり、同じ基本実装を使用する場合もあります。それらの違いは次のとおりです。
ミューテックスには、ミューテックスをロックしたプロセスである所有者の概念があります。ミューテックスをロックしたプロセスのみがロックを解除できます。対照的に、セマフォには所有者の概念がありません。どのプロセスでもセマフォをロック解除できます。
セマフォとは異なり、mutex は優先度反転の安全性を提供します。ミューテックスはその現在の所有者を知っているため、より優先度の高いタスクがミューテックスで待機を開始するたびに、所有者の優先度を上げることができます。
ミューテックスは、ミューテックスを保持しているプロセスが誤って削除されることがないように、削除の安全性も提供します。セマフォはこれを提供しません。
私の理解では、ミューテックスは単一のプロセス内でのみ使用されますが、その多くのスレッドで使用されますが、セマフォは複数のプロセスで使用され、対応するスレッドのセットで使用される場合があります。
また、ミューテックスはバイナリ (ロックまたはロック解除のいずれか) ですが、セマフォにはカウントの概念、または複数のロックおよびロック解除要求のキューがあります。
誰かが私の説明を確認できますか? Linux、特にカーネル 2.6.32 を使用する Red Hat Enterprise Linux (RHEL) バージョン 6 のコンテキストで話しています。
Supporting ownership
、maximum number of processes share lock
および はmaximum number of allowed processes/threads in critical section
、一般名が の並行オブジェクトの名前/タイプを決定する 3 つの主要な要因ですlock
。これらの要素の値はバイナリ (2 つの状態を持つ) であるため、3*8 の真理のような表にまとめることができます。
- X (所有権をサポートしますか?): いいえ(0) / はい(1)
- Y (#共有プロセス): > 1 (∞) / 1
- Z (CA のプロセス数/スレッド数): > 1 (∞) / 1
X Y Z Name
--- --- --- ------------------------
0 ∞ ∞ Semaphore
0 ∞ 1 Binary Semaphore
0 1 ∞ SemaphoreSlim
0 1 1 Binary SemaphoreSlim(?)
1 ∞ ∞ Recursive-Mutex(?)
1 ∞ 1 Mutex
1 1 ∞ N/A(?)
1 1 1 Lock/Monitor
このテーブルを自由に編集または拡張してください。編集可能なASCIIテーブルとして投稿しました:)