~によるとhttps://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO、RT-PreemptパッチはLinuxを完全にプリエンプティブなカーネルに変換します。魔法は次のように実行されます。
- rtmutexeを使用してカーネルロックの基本要素(スピンロックを使用)を再実装してプリエンプティブにします。
- spinlock_t と rwlock_t で保護される重要なセクションは、プリエンプション可能です。 raw_spinlock_t(spinlock_tと同じAPI)を使用して(カーネル内で)非線点部分を作成することは依然として可能です。
- カーネルミューテックス、スピンロック、およびrw_semaphoresの優先順位継承を実装します。
- 割り込みハンドラをプリエンプティブカーネルスレッドに変換する:RT-Preemptパッチは、通常のユーザースペースプロセスと同様に、作業構造で表されるカーネルスレッドのコンテキストでソフト割り込みハンドラを処理します。ただし、カーネルコンテキストでIRQを登録することも可能です。
- 以前のLinuxタイマーAPIを高解像度カーネルタイマー用の別々のインフラストラクチャとタイムアウト用のインフラストラクチャに変換して、高解像度のユーザースペースPOSIXタイマーを作成します。
マルチタスクの代わりにリアルタイム処理に欠点がありますか?
答え1
-rt(RT-Preempt)カーネルパッチは、Linuxカーネルが汎用カーネル実装に焦点を当てており、Linus Torvaldsが実装を開始したときにマルチタスクを選択したため、カーネルのメインラインにはありません。
奇妙なことは、カーネルがなぜこのような理由です。答えはまさにそれです。なぜなら、Linusがそうすることを選んだからです。そして彼はなぜこの方法を選んだのですか?彼はそれがより良い方法であるか、または達成可能な実装であると信じているからです。
他の人のデザインコンセプトが現実よりも優れていると思う人もいます。しかし、これは不可能です。人ごとに自分の意見があり、時には複雑さと可能性のためにベンチマークができない場合もあります。
Linus TorvaldsとAndrew Tanenbaumの間には、モノリシックカーネルとマイクロカーネルに関する古典的な議論があります。それぞれがより良いモデルであるという主張がたくさんあります。
同様に、マルチタスクとリアルタイムも同様です。どちらが良いですか?それぞれには独自の長所と短所があります。
通常、メインラインカーネルはリアルタイムでパッチされません。シンプル!これはまさに開発者の選択と信念によるものです!
答え2
これはコメントに基づいているので、その価値を尊重してください。
すべてのエンジニアリングの決定はバランスをとることです。 -rt パッチは処理タイミングに対して決定的です。これは、仕事がタイムリーに実行されるようにするためです。昔を思い出してください。
リアルタイムは、間違った時間に与えられた正解が間違っている場合
しかし、一般的な使用法はリアルタイムとは関係ありません。バニラLinuxはこの点で一般的な使用に十分なので、-rtパッチは必要ありません。 -rtパッチを使用すると、一般的な使用時にシステムが遅くなる可能性が高くなります。
-rt は、通常のユーザーに役立つものを追加せずに一般的なワークロードのパフォーマンスを低下させるため、通常のカーネル展開には含まれません。
-rt パッチには確かに目的があるので、これをカーネルソースの標準部分として含めるのが良いでしょう。これはカーネルをビルドするときに選択できるオプションです(カーネルをビルドするときにさまざまな領域で利用できる多くのオプションがあります)。 -rtパッチでワークロードが改善されたら、パッチを有効にするカーネルを選択します(または状況に応じて直接ビルドします)。
答え3
Linus Torvaldは最終的にpreempt-rtロックコードをメインラインカーネルにマージすることにしました。 http://lml.iu.edu/hypermail/linux/kernel/2108.3/05759.html