私はスピンロックがLinuxカーネル設計で本当に無駄であることを知っています。
セマフォやミューテックスなどのユーザーエリアコードでは、より一般的なものよりも、スピンロックがLinuxカーネル設計で良い選択である理由が疑問に思います。
答え1
質問が示すように、スピンロックは「無駄」なので、しばらく保持する必要があります。
スピンロックは、複数のスレッドを同期させる唯一の方法ではありません。 mutex / semaphoreは、Linuxカーネルだけでなく、他の同期の基本要素(待ち行列、イベントなど)でも使用されます。
ただし、カーネルはユーザースペースが以前に見たことがない状況を処理する必要があります。一般的な状況の1つは割り込みハンドラです。 Linux の割り込みハンドラは再スケジュールできませんが、通常、一部の同期基本要素 (たとえば、他のスレッドでさらに処理する接続リストに作業項目を追加) を使用する必要があります。割り込みハンドラは眠れないため、ミューテックス、スタンバイキューなどは使用できません。これでスピンロックがほとんど残ります。スレッドが割り込みハンドラとの同期アクセスを要求する場合は、同じスピンロックも使用する必要があります。
Spinlockは必ずしも無駄ではありません。これは非競合/非待機状況に最適化されており、非常に迅速に取得してリリースできます。この場合、他の同期プリミティブよりも高速でオーバーヘッドが少なくなります。
答え2
呼び出し側がCPU制御をブロックして放棄するスピンロックと他の構成の間の選択は、他のスレッドでコンテキスト切り替え(レジスタ/状態の保存とロックされたスレッドのレジスタ/状態の復元)を実行するのに必要な時間によって大きく異なります。 )。これを行うのに必要な時間とキャッシュコストが高くなる可能性があります。
ハードウェアレジスタなどへのアクセスを保護するためにスピンロックを使用する場合、他のアクセススレッドはロックが解除されるまで数ミリ秒以下しか必要ないので、CPU時間をよりよく使うことはコンテキスト切り替えの代わりにスピン待ちをして続行することです。 。
答え3
他の人はすでに答えています。スピンロックが使用される状況とスピンロック使用規則をまとめます。
1. スピンロックはいつ使用しますか?
回答:次のような状況があります。
- ロックを保持するスレッドは休止状態を許可されません。
- ロックを待っているスレッドは休止状態ではありませんが、緊密なループで回転します。
適切に使用すると、スピンロックはセマフォよりも高いパフォーマンスを提供できます。例:割り込みハンドラ。
2. スピンロックの使用規則は何ですか?
答え:
ルール - 1:スピンロックを保持するすべてのコードは、割り込みサービスを除いて(時にはそうでない場合があります)、何らかの理由でプロセッサを放棄することはできません。したがって、スピンロックを保持しているコードはスリープ状態にできません。
原因:スピンロックを保持しているドライバがスリープモードに入ったとします。たとえば、関数を呼び出すcopy_from_user()
か、copy_to_user()
カーネルが先制的に実行され、優先順位の高いプロセスがコードを横にスライドさせます。プロセスは実際にスピンロックを保持するCPUを放棄します。
今、私たちはコードがいつロックを解除するのかわかりません。他のスレッドが同じロックを獲得しようとすると、長い時間回転します。最悪の場合、デッドロックが発生する可能性があります。
カーネルプリエンプションの状況は、スピンロックコード自体によって処理されます。カーネルコードがスピンロックを維持する限り、関連プロセッサではプリエンプションは無効になります。シングルプロセッサシステムでも、この方法でプリエンプションを無効にする必要があります。
ルール - 2:スピンロックを維持しながらローカルCPUで割り込みを無効にします。
原因:スピンロックを使用してデバイスへのアクセスを制御し、割り込みを発行するためにドライバをサポートしてください。これにより割り込みハンドラが実行されます。割り込みハンドラもデバイスにアクセスするためにロックが必要です。割り込みハンドラが同じプロセッサで実行されている場合、回転が開始されます。また、ドライバコードを実行してロックを解除することはできません。したがって、プロセッサは永久に回転します。
規則 - 3: スピンロックはできるだけ短時間維持する必要があります。
理由: ロックが長すぎると、現在のプロセッサーを予約できなくなる可能性があります。つまり、優先順位の高いプロセスがCPUを取得するのを待つ必要があるかもしれません。
したがって、これはカーネルの待ち時間(プロセスが予約を待つ必要がある時間)に影響します。一般に、スピンロックは、CPUがスレッド間のコンテキスト遷移にかかる時間より短い時間維持する必要があります。
ルール-4:セマフォとスピンロックがある場合は両方を使用してください。次に、セマフォを最初にインポートし、次にスピンロックをインポートします。
答え4
スピンロックとミューテックスロックを使用する理由は、CPUリソースが不足しているためです。これは今日の最悪のアーキテクチャであり、完全に非論理的な8ビットレジスタベースのフォンノイマン設計の重複した遺産となっています。
残念ながら、C / C ++コンパイラの機能はハードウェアと比較して不均衡になり、これらの機能はハードウェアに閉じ込められず、古代のオンチップリソースは今日でもまだ存在しています。シングルプロセッサでは、キャッシュは2番目のレベル以上に再入できないため、時間のかかる環境の節約と再入SMPのロードが続行されます。将来は、最適化されたビルドツールを備えたFPGAデバイスに依存します。 Xilinixは新しい14nmプロセスを持ち、A9クアッドコアとプログラマブルゲートアレイ間の3000個の相互接続、テーブルに最大数百メガビットのSRAM、高度な状態機械設計を活用した複雑な浮動小数点算術/多次元ベクトル/機能テーブルを減らすことができる..はるかに多くの古い車椅子のテザリングコンパイラ。
25年前のハードウェア設計では、拡張ハードウェアがDSP AD 21020 / CPU i960インターフェイスに統合されました。改良された設計は、フロー集約型1メートル幅160ノズルプリンタの多くのソフトウェア問題を解決することは明らかです。
カーネル開発に精通している小さなチームを招待して、スピンロック/キャッシュミス/再入SMP条件を置き換える新しいアーキテクチャを評価/修正します。