セマフォやミューテックスなどのユーザーエリアコードでは、より一般的なものよりも、スピンロックがLinuxカーネル設計で良い選択であるのはなぜですか?

セマフォやミューテックスなどのユーザーエリアコードでは、より一般的なものよりも、スピンロックがLinuxカーネル設計で良い選択であるのはなぜですか?

私はスピンロックがLinuxカーネル設計で本当に無駄であることを知っています。

セマフォやミューテックスなどのユーザーエリアコードでは、より一般的なものよりも、スピンロックがLinuxカーネル設計で良い選択である理由が疑問に思います。

ベストアンサー1

質問が示すように、スピンロックは「無駄」なので、しばらく保持する必要があります。

スピンロックは、複数のスレッドを同期させる唯一の方法ではありません。 mutex / semaphoreは、Linuxカーネルだけでなく、他の同期の基本要素(待ち行列、イベントなど)でも使用されます。

ただし、カーネルはユーザースペースが以前に見たことがない状況を処理する必要があります。一般的な状況の1つは割り込みハンドラです。 Linux の割り込みハンドラは再スケジュールできませんが、通常、一部の同期基本要素 (たとえば、他のスレッドでさらに処理する接続リストに作業項目を追加) を使用する必要があります。割り込みハンドラは眠れないため、ミューテックス、スタンバイキューなどは使用できません。これでスピンロックがほとんど残ります。スレッドが割り込みハンドラとの同期アクセスを要求する場合は、同じスピンロックも使用する必要があります。

Spinlockは必ずしも無駄ではありません。これは非競合/非待機状況に最適化されており、非常に迅速に取得してリリースできます。この場合、他の同期プリミティブよりも高速でオーバーヘッドが少なくなります。

おすすめ記事