0

こんにちは皆さん、
まず最初に申し訳ありませんが、これは適度に長い投稿になる予定です。

ここでは、ロックフリー プログラミングに関するいくつかの記事をざっと読みながら学んだいくつかの概念を書き留め、その学習に対する私の疑問を提示します。
また、*NIX マルチプロセッサ プラットフォームに関する議論もあります。

「LOCKLESS = BLOCKLESS」と言うことから始めます。これは、一部のスレッドが進行した場合にのみ CAS/DCAS が失敗する可能性があるため、スレッドのシステム全体が進行すると言われているためです。
したがって、ここでミューテックスをブロックする場合、条件をスピン/待機していると言えます (たとえば、CAS while ループ)。


Quest1 > while ループでのスピンは、 mutexでのブロックよりもどのように効率的でしょうか?
Quest2 > ミューテックスを採用した優れた設計は、システムの進行も保証するので
、BLOCKLESS も定義上ではありませんか?

質問 1 への回答として、ブロッキングによってカーネル待機が発生する可能性があり、コストがかかる可能性があるコンテキスト スイッチが存在する可能性があると主張する人がいるでしょう。それ以上の明確さをいただければ幸いです。

さて、最初の 2 つの質問の答えを得た後、実行されるアトミック操作が大きくない/時間がかからない 場合、ロックフリーは本当に高速でリアルタイムであると確信できると仮定します。

Quest3 > ロックフリーってスピンロックとかじゃないの?はいの場合、
pthread spin lock を使用できないのはなぜですか?

ネット上で入手可能なほとんどの文献では、次のようなアトミック操作の実装が見られます。

__asm__ __volatile__("lock\nxadd" X " %0,%1"                                               
                          : "=r"(結果),"=m"(*(T *)i_pAddress)                                            
                          : "0"(i_addValue)                                                              
                          : "メモリー"); // これは何を意味するのでしょうか ?メモリ フェンシング ?
Quest4 > 上記アセンブルの ":memory" はメモリフェンシングを意味しますか? はいの場合、
実装に約 100 サイクルかかりませんか?
Quest5 > ここでのロック命令は、操作が
共有リソース上で行われていることを表明しているのではなく、他のスレッドがここでブロックしていますか?
私の知る限り、ロックはキャッシュ ラインで行われる
ため、この質問は多かれ少なかれ最近の Intel マルチ プロシージャ アーキテクチャには当てはまりません。

前もって感謝します。

4

2 に答える 2

2

それはたくさんの質問です!

while ループでのスピンは、ミューテックスでのブロックよりも効率的でしょうか?

リソースがほとんど競合していない場合、平均して長くスピンする必要はありません。これにより、ミューテックスを使用するよりも安価になる可能性があります。

ミューテックスを使用する優れた設計は、システムの進行も保証するので、定義上、ブロックレスでもありませんか?

おそらく、待機しているスレッドにとってより公平です。リソースの待機中にスピンすると、「不運な」スレッドが長時間待機する必要がある場合があります。

では、ロックフリーは spinlock のようなものではありませんか? はいの場合、 pthread spin lock を使用できないのはなぜですか?

アルゴリズムをロックフリーにする方法について良いアイデアがあれば、スピンする必要はまったくないかもしれません。

上記のアセンブルの「:memory」はメモリフェンシングを意味しますか? はいの場合、実装に約 100 サイクルかかりませんか?

はい、それを必要とするのはシステム上のメモリ フェンシングです。多数の CPU キャッシュの同期には長い時間がかかります (100 クロック以上かかる場合もあります)。一方、スピンロックまたはミューテックスも、正しく機能するためにメモリ フェンスが必要です。

ここでのロック命令は、操作が共有リソースで行われていることを表明していないので、他のスレッドがここでブロックしていますか?

これは、おそらくハードウェア レベルでの、別の種類のブロッキングです。他のスレッドが更新したばかりのデータを必要とする場合、そのデータが CPU で利用可能になるまで待つ必要があります

于 2012-05-03T06:59:56.920 に答える
2
  1. lock-free は何らかの形でスピンロックのようなものを使用します。しかし、ロックとしてのスピンについて話すときは、通常、コードの大きなブロックを同期したいと考えています。そして、ロックフリーについて話すとき、それは通常 1 つの命令だけである 1 つの割り当てを対象とします。最初のものは何か長いことをしているときに回転し、2番目のものは何か短いことをしているときに回転します. 最初のスピンは回転し続け、2 番目の「スピン」は単なる「再試行」です。

  2. 私が間違いを犯していなければ、その「メモリ」は、メモリ変数をレジスタ変数に最適化しないことを意味します.フェンシング。)

  3. ロック命令は非ロック命令ほど高速ではありませんが、コンテキスト切り替えよりは高速です。しかし、それは遅いので、通常、回転するものを書くときは、最初に非ロック テストを行います。合格した場合は、ロックされたものを行います。

于 2012-05-03T06:59:16.477 に答える