web-dev-qa-db-ja.com

スピンロックvsビジーウェイト

ビジーウェイトが一般的に嫌われているのに対し、スピニングは大丈夫と見なされることが多い理由を説明してください。私の知る限り、これらは両方とも、何らかの条件が満たされるまで無限にループします。

14
PMcK

spin-lockは通常、リソースの競合が少ない場合に使用されます。したがって、CPUは数回の反復を行うだけで、次に進むことができます。生産的な仕事。ただし、ロック機能のライブラリ実装では、多くの場合、スピンロックとそれに続く通常のロックが使用されます。リソースを妥当な時間枠で取得できない場合は、通常のロックが使用されます。これは、通常ロックがすばやく取得される設定でのコンテキストスイッチのオーバーヘッドを削減するために行われます。

busy-waitingという用語は、回転してハードウェアレジスタまたはメモリ位置の変更を待つことを意味する傾向があります。この用語は必ずしもロックを意味するわけではありませんが、タイトなループで待機し、変更を繰り返しプローブすることを意味します。

すぐに対応したい環境のある種の変化を検出するために、ビジーウェイトを使用することをお勧めします。したがって、スピンロックはビジー待機を使用して実装されます。ビジーウェイトは、CPUサイクルを浪費するよりも、非常に低いレイテンシー応答が重要である状況で役立ちます(一部のタイプの組み込みプログラミングなど)。

これに関連するのは、「ロックフリー」と「待機フリー」という用語です。

いわゆるロックフリーアルゴリズムは、 [〜#〜] cas [〜#〜] 命令でタイトなビジーウェイトを使用する傾向がありますが、競合は通常の状況では非常に低いため、CPUは通常数回だけ繰り返す必要があります。

いわゆるwait-freeアルゴリズムは、ビジー待機をまったく行いません。

("lock-free"と"wait-free"は、アカデミックコンテキストでは少し異なる方法で使用されることに注意してください。ウィキペディアの記事、 非ブロッキングアルゴリズム を参照してください。)

10