web-dev-qa-db-ja.com

排他ロックと共有ロックの違いは何ですか?

ウィキペディアによると、

共有ロックは「読み取りロック」と呼ばれ、排他ロックは「書き込みロック」と呼ばれることがあります。

「共有」および「排他的」という用語の背後にある理由を説明できますか?

92
Rose Perrone

私はこれが楽しい(そしてふさわしい)アナロジーだと思ったので、この答えを書き留めました:

教師(作家)と多くの学生(読者)を含む教室で、ロック可能なオブジェクトを黒板(ロック可能)と考えてください。

教師がボード上で何か(排他的ロック)を書いている間:

  1. 書き込み中のため、誰も読むことができず、ビューをブロックしています=> オブジェクトが排他的にロックされている場合、共有ロックを取得できません

  2. 他の教師は登場せず、書き始めないか、ボードが読めなくなり、生徒を混乱させます=> オブジェクトが排他的にロックされている場合、他の排他的なロックは取得できません

生徒がボード上の内容を読んでいるとき(共有ロック):

  1. それらはすべて、一緒にあるものを読むことができます=> 複数の共有ロックが共存できます

  2. 教師は、読み終えるのを待ってから、ボードをクリアしてさらに書き込みを行います=> 1つ以上の共有ロックが既に存在する場合、排他ロックを取得できません

354
ArjunShankar

とても簡単です。読み取りロックは、複数のプロセスが同時に読み取ることができるため、共有ロックとも呼ばれます。読み取りロックのポイントは、別のプロセスによる書き込みロックの取得を防ぐことです。対照的に、書き込みロックは他のすべての操作を禁止しますが、書き込み操作は完了します。そのため、排他的と記述されています。

そのため、読み取りロックは「今は読むことができますが、書き込みたい場合は待つ必要があります」と表示しますが、書き込みロックは「待つ必要があります」と表示します。


あなたはあなたの研究を支援するために研究していることを理解していますが、講義する衝動に抵抗することはできません。

ロックの無能な使用は、パフォーマンスの問題の主な原因です。読み取りロックと書き込みロックを区別するロックシステムを使用することは良い出発点ですが、慎重に設計することで、ロックの必要性の多くを排除できる場合があります。たとえば、セッション状態はnever状態の要素ごとに1つのグローバルコレクションに保持する必要があります。

これが実際に行われたのを見ました。それは、セッション状態への最後の変更ごとにボックス化とコレクションへの変更を引き起こす残酷な設計であり、書き込みロックが長引きます。オーバーヘッドが機能しなくなり、サーバーが事実上シングルスレッド動作になりました。

すべてのセッション状態を構造体に集約するだけで、大幅に改善されました。セッション状態の変更は、セッションの状態構造体のメンバーの値を変更しただけです。他のセッションにはセッションの状態を直接参照する機会や機会がなかったため、更新されるコレクションはセッションのリストのみでした。その結果、ロックは完全に不要でしたセッションは開始時と終了時のみで、スループットは3000倍に増加しました。

他の一般的なロックシナリオは、ユーザーアプリケーションのスレッド間で共有されるリソースです。最新のフレームワークのほとんどは、ロックではなくメッセージを使用してこれに対処しています。 「UIスレッドに遷移する」とき、実際には関数ポインターといくつかのパラメーター(または実装に応じてデリゲートとスタックフレーム)を含むメッセージをキューに入れています。

28
Peter Wone
  • 排他ロックまたは書き込みロックは、ファイルの指定された部分に書き込むためのプロセスに排他アクセスを与えます。書き込みロックが設定されている間、他のプロセスはファイルのその部分をロックできません。

  • 共有ロックまたは読み取りロックは、他のプロセスがファイルの指定された部分の書き込みロックを要求することを禁止します。ただし、他のプロセスは読み取りロックを要求できます。

その詳細: http://www.gnu.org/software/libc/manual/html_node/File-Locks.html

5
TOC

データベース側でも同じ原則です。 Oracleのドキュメントに従って

排他ロックモードは、関連するリソースの共有を防ぎます。このロックモードは、データを変更するために取得されます。リソースを排他的にロックする最初のトランザクションは、排他ロックが解除されるまでリソースを変更できる唯一のトランザクションです。

共有ロックモードでは、関連する操作に応じて、関連付けられたリソースを共有できます。データを読み取る複数のユーザーがデータを共有し、共有ロックを保持して、ライター(排他ロックが必要)による同時アクセスを防ぎます。いくつかのトランザクションができます
同じリソースの共有ロックを取得します。

2
user2155031