の違いは何ですかlocklessおよび非ブロック?
-
19-09-2019 - |
質問
このデータ構造を同期できる人との違いを明確に"lockless"と"非ブロック"?このように使用されることがわかりますの多くの人々にもっていなかった場合はありませんか微妙な違いがそれは、あなたがかけがえのない.
いlocklessはないはずのロック"および非ブロッキングがあるのでしょうかを保証します。いることを意味しているのが、本当のところはわからないけど。
参考文献を歓迎する。
解決
ロックは、アクセス制御機構です。私はあなたがそれに排他的にアクセスをしたいときに、リソースをロックする意味となります。彼らは今、それを使用することができるように、他の人のための部屋のロックを解除し、今、ドアをロックし、部屋を使用する/あなたが望むものは何でも。部屋がロックされている間、誰もがこのように、部屋に入っていない可能性が何もしていませんでした。
ブロッキングは、あなたがデータを持っていけない場合を除き、戻ってきていけないことを、保証データ検索に使用されます。ドア/パイプ/ソケット(基本的に何でも)で待っててください、データが利用可能になったときにそれを取得し、戻ってきます。
Addition--
どちらも、あなたがそれらを配置しよう文脈で交換-巧みに使用することができますように、言葉の文字通りの英語の意味で混乱しないたとえば - 。のロックの のようなものですの他の人が同じリソースを使用するため、ブロッキング、および に遮断することは、データが利用可能になるまで、リソースに(関数を呼び出す)のロックの自分ですることができます。
だから、単純に(あなたはそれをアンブロックしていない限り)あなたが指定した量の時間のためのリソースを取り込む意味LOCKING。 そして、ブロッキングは、あなたは、あなたがデータを持っていないよう作業を進めるか、先に行くし、さらに進めることができないことを意味する、ブロックされています。
それらは、プロセスの状態を変更し、割り込みやイベントが発生するのを待つことによって、実現されている道ます。
他のヒント
彼らもまったく異なっています。
ロックとはまる方法を制御ファイルへのアクセス用のロックを解除します。この地方の二つのプロセスを文書と同じファイルを同時停止、一筆するときは、読みが読んでも同時に行います。
ブロックの方法の操作を完了する前に満足を追求し続けてまいります。
更新
の要請にお応用例...んでいきたいと思ってい例を追加すれば時間が、ここでの説明も可能です。
しいの3つの方法をロック:
- なし
- 遮断する場合にロックが利用でき、待ちます。
- 非ブロック.場合にロックが利用でき失敗します。
2つの方法で行IO:
- 遮断する待つまでのバッファを備えます。
- 非ブロック.失敗できないのであれば読み取り/書き直
を使用した場合は open()
や read()
として通常のになりますブロックIO.していくために、どのような非ブロックIOしての O_NONBLOCK
旗 open()
, は、 read()
返されます E_AGAIN
代わりに遮断する
デフォルトではありませんロックしなければなりません。呼ぶことができま fcntl()
と F_SETLK
または F_SETLKW
を得る、ロックが解除されます。旧ブロックの場合にロックが利用不可に失敗したとの EACCES
または EAGAIN
.
いにおいて大きく異なることがポイントの混乱:
- IOできるブロック/非ブロック、ロックできるブロック/非ブロック.
- ほかのデータなしていて二階の通路から直接入、IO請求できるブロックが別のプロセスのファイルをロックされています。
はい、ロックレスロック機構なしを意味します。ノンブロッキングコールではなく、いくつかの外部(例えばロックの解除など、またはバッファに到着したデータ)イベントが発生するのを待つよりも、すぐに返すために起こっていることを意味します。これは、ロックを持っていると、コール
内のインスタンスの場合と同様に、非ブロッキング呼び出しを使用することが可能ですflock(fh, LOCK_SH | LOCK_NB);
「読み込みロックを取得しようと、しかし、あなたは、いずれかの周りに待機していないことができない場合は、すぐに戻って、あなたができなかった私に言う」ことを意味します。 LOCK_SH
(「非ブロッキング」)なしLOCK_NB
(「共有ロック」)のデフォルトの動作は、ロックの可用性を待つことになります。
彼らは似ているが、多くの場合、異なるコンテキストで使用することができます。データ構造の文脈では、彼らは同じことになります。それは機能を持っているデータの読み取りなど(操作がブロックするのではない一定であることを返す前に、操作の完了を待つかしないことを意味し、その場合、あなたはまた、同様にIOの文脈で「非ブロッキング」を使用することができすでに)キャッシュされています。
また、非ブロッキングは何かがロックなしであることを意味するものではないかもしれません。例えば、データ構造はロックを使用するが、1つを必要としないロックおよび他のブロッキング操作を必要としないいくつかの非ブロッキング操作を有していてもよい。
暫定的解答例を通して:
ついて検討するオブジェクトと呼ばれる"イベント")の二つの方法 wait()
や notify()
.
実施1:
notify()
に原子的に設定します。wait()
ループまでのbooleanはtrueです。両方とも lockless, ものの、wait()
は ブロック.実施2:
notify()
がロックまでをbooleanとしてリリース、ロックが解除されます。wait()
を取得しますロックを読み込みboolean,リリース、ロック、ループまでのbooleanはtrueです。両方ともこのように ロックに基づく, ブロック.実施3:
最初のロックをとることをおすすめします。
notify()
チェックをbooleanにリリースのロックの場合はtrueです。wait()
取得し、ロスエロエスデイキケ記を設定するboolean trueです。notify()
は 非ブロック (argueableか lockless であるとを問いません)wait()
は ロックに基づく, ブロック.
いると思うので 非ブロック 意味 lockless, が、彼らは等価ではありませんで lockless 操作でブロック状態にします。