こんにちは皆さん、
まず最初に申し訳ありませんが、これは適度に長い投稿になる予定です。
ここでは、ロックフリー プログラミングに関するいくつかの記事をざっと読みながら学んだいくつかの概念を書き留め、その学習に対する私の疑問を提示します。
また、*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 マルチ プロシージャ アーキテクチャには当てはまりません。
前もって感謝します。